first commit
This commit is contained in:
75
backend/internal/httpserver/server.go
Normal file
75
backend/internal/httpserver/server.go
Normal file
@@ -0,0 +1,75 @@
|
||||
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
|
||||
}
|
||||
Reference in New Issue
Block a user