Files
golang-api-starter/cmd/api/main.go
2025-11-29 16:59:02 -06:00

84 lines
1.7 KiB
Go

package main
import (
"context"
"fmt"
"log"
"os"
"os/signal"
"strconv"
"syscall"
"time"
"git.kling.dev/jared/WorkoutTrackerAPI/internal/database"
"git.kling.dev/jared/WorkoutTrackerAPI/internal/server"
)
func main() {
dbHost := os.Getenv("DB_HOST")
dbPort := os.Getenv("DB_PORT")
dbUser := os.Getenv("DB_USER")
dbPassword := os.Getenv("DB_PASSWORD")
dbName := os.Getenv("DB_NAME")
webPort := os.Getenv("PORT")
if dbHost == "" || dbPort == "" || dbUser == "" || dbPassword == "" || dbName == "" {
log.Fatal("Not all database params are set")
}
dbPortParsed, err := strconv.ParseInt(dbPort, 10, 64)
if err != nil {
log.Fatal("Unable to parse db port to an int")
}
if webPort == "" {
webPort = "8080"
}
webPortParsed, err := strconv.ParseInt(webPort, 10, 64)
if err != nil {
log.Fatal("Unable to parse web port to an int")
}
dbConn, err := database.NewConnection(database.Config{
Host: dbHost,
Port: int(dbPortParsed),
User: dbUser,
Password: dbPassword,
DBName: dbName,
})
if err != nil {
log.Fatal("Failed to connect to database: ", err)
}
defer dbConn.Close()
jwtSecret := os.Getenv("JWT_SECRET")
if jwtSecret == "" {
log.Fatal("Unable to determine the JWT_SECRET")
}
s := server.NewServer(dbConn, jwtSecret)
go func() {
fmt.Printf("Server listening on port %d\n", webPortParsed)
webAddr := fmt.Sprintf(":%d", webPortParsed)
s.Start(webAddr)
}()
quit := make(chan os.Signal, 1)
signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM)
<-quit
log.Println("Shutting down server...")
ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second)
defer cancel()
if err := s.Shutdown(ctx); err != nil {
log.Fatal("Server forced to shutdown:", err)
}
log.Println("Server exited")
}