76 lines
1.8 KiB
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()
|
|
},
|
|
})
|
|
}
|