76 lines
2.3 KiB
Go
76 lines
2.3 KiB
Go
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
|
|
}
|