Files
IDP-Backend/internal/server/server.go

76 lines
1.8 KiB
Go

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()
},
})
}