package httpserver import ( "log/slog" "net/http" "mira/backend/internal/auth" "mira/backend/internal/calendar" "mira/backend/internal/clients" "mira/backend/internal/config" "mira/backend/internal/database" "mira/backend/internal/security" "mira/backend/internal/users" "github.com/gin-gonic/gin" ) func New(cfg config.Config, logger *slog.Logger, db *database.DB, userStore users.Store, clientStore clients.Store, calendarStore calendar.Store) *gin.Engine { if cfg.AppEnv == "production" { gin.SetMode(gin.ReleaseMode) } router := gin.New() router.Use(gin.Recovery()) router.Use(security.Headers()) router.Use(security.CORS(cfg.CORSAllowedOrigins)) router.GET("/healthz", func(c *gin.Context) { c.JSON(http.StatusOK, gin.H{"status": "ok"}) }) router.GET("/readyz", func(c *gin.Context) { if err := db.Pool.Ping(c.Request.Context()); err != nil { c.JSON(http.StatusServiceUnavailable, gin.H{"status": "not_ready"}) return } c.JSON(http.StatusOK, gin.H{"status": "ready"}) }) tokenService := auth.NewTokenService(cfg.JWTSecret, cfg.AccessTokenTTL) requireAuth := auth.RequireAuth(tokenService) authRoutes := auth.NewRoutes(userStore, tokenService) userRoutes := users.NewRoutes(userStore, cfg.AppPublicURL) clientRoutes := clients.NewRoutes(clientStore) calendarRoutes := calendar.NewRoutes(calendarStore, calendar.NewBrasilAPIProvider(cfg.CalendarAPIBaseURL), calendar.NewFeriadosBrasilProvider(), calendar.RouteOptions{ UploadMaxSizeMB: cfg.UploadMaxSizeMB, UploadAllowedMIMEs: cfg.UploadAllowedMIMEs, StorageDriver: cfg.StorageDriver, StorageLocalPath: cfg.StorageLocalPath, }) api := router.Group("/api/v1") authRoutes.Register(api.Group("/auth")) api.GET("/me", requireAuth, func(c *gin.Context) { claims, ok := auth.ClaimsFromContext(c) if !ok { c.JSON(http.StatusUnauthorized, gin.H{"message": "Autenticacao obrigatoria."}) return } user, err := userStore.FindByID(c.Request.Context(), claims.UserID) if err != nil { c.JSON(http.StatusUnauthorized, gin.H{"message": "Usuario nao encontrado."}) return } c.JSON(http.StatusOK, gin.H{"user": user}) }) userRoutes.Register(api.Group("/users"), requireAuth) clientRoutes.Register(api.Group("/clients"), requireAuth) calendarRoutes.Register(api.Group("/calendar"), requireAuth) logger.Info("routes registered") return router }