package api import ( "fmt" "log/slog" "orbits-server/internal/server/api/middleware" "orbits-server/internal/server/api/routes" "orbits-server/internal/server/bootstrap" "github.com/gin-gonic/gin" "gorm.io/gorm" ) // All error messages from slog must have an error field with the golang error // See bottom the the kickoff function for details func KickoffApi(logger *slog.Logger, env bootstrap.Environment, db *gorm.DB) { gin.SetMode(gin.ReleaseMode) // For a nice looking logger: // r := gin.Default() // default, this makes a nice looking log-trace but I want JSON r := gin.New() r.Use(middleware.SlogMiddleware(logger)) r.Use(gin.Recovery()) if env.Authentication { slog.Debug("injecting authentication middleware") // only log when actually doign the thing it logs to do r.Use(middleware.AuthMiddleware()) } api := r.Group("/api") routes.RegisterApiRoutes(api, db) file := r.Group("/file") routes.RegisterFileRoutes(file, env, db) r.Static("/assets", "./web/frontend/dist/assets") r.NoRoute(func(c *gin.Context) { c.File("./web/frontend/dist/index.html") }) err := r.Run(fmt.Sprintf("%s:%d", env.Hostname, env.Port)) if err != nil { slog.Error("failed to start the Gin server", "error", err) } }