package server import ( "context" "strconv" "git.logidex.ru/fakz9/logidex-id/internal/config" "github.com/gofiber/fiber/v2" "github.com/gofiber/fiber/v2/middleware/cors" fiberlogger "github.com/gofiber/fiber/v2/middleware/logger" "github.com/gofiber/fiber/v2/middleware/recover" "go.uber.org/fx" ) // NewFiberApp creates a new Fiber application with common middleware func NewFiberApp(cfg config.Config) *fiber.App { app := fiber.New(fiber.Config{ AppName: "Logidex ID API", ServerHeader: "Logidex ID", ErrorHandler: func(c *fiber.Ctx, err error) error { code := fiber.StatusInternalServerError if e, ok := err.(*fiber.Error); ok { code = e.Code } return c.Status(code).JSON(fiber.Map{ "error": true, "message": err.Error(), }) }, }) // Add middleware app.Use(recover.New()) app.Use(fiberlogger.New(fiberlogger.Config{ Format: "[${time}] ${status} - ${latency} ${method} ${path}\n", })) app.Use(cors.New(cors.Config{ AllowOrigins: "*", AllowMethods: "GET,POST,HEAD,PUT,DELETE,PATCH,OPTIONS", AllowHeaders: "Origin,Content-Type,Accept,Authorization", })) // Health check endpoint app.Get("/health", func(c *fiber.Ctx) error { return c.JSON(fiber.Map{ "status": "ok", "service": "logidex-id-api", }) }) return app } // NewAPIRouter creates the main API router group func NewAPIRouter(app *fiber.App) fiber.Router { return app.Group("/api") } // StartServer handles the server lifecycle func StartServer(lifecycle fx.Lifecycle, app *fiber.App, cfg config.Config) { lifecycle.Append(fx.Hook{ OnStart: func(ctx context.Context) error { go func() { addr := ":" + strconv.Itoa(cfg.App.Port) if err := app.Listen(addr); err != nil { } }() return nil }, OnStop: func(ctx context.Context) error { return app.Shutdown() }, }) }