Files
api_aplicare_go/internal/routes/v1/routes.go
T
2026-05-18 10:17:33 +07:00

171 lines
5.5 KiB
Go

package v1
import (
"api-service/internal/admin"
AplicareHandler "api-service/internal/aplicare"
"api-service/internal/config"
"api-service/internal/database"
"api-service/internal/handlers/antreanbpjs"
authHandlers "api-service/internal/handlers/auth"
healthcheckHandlers "api-service/internal/handlers/healthcheck"
"api-service/internal/middleware"
services "api-service/internal/services/auth"
"api-service/pkg/logger"
"context"
"os"
"os/signal"
"syscall"
"time"
"github.com/gin-gonic/gin"
swaggerFiles "github.com/swaggo/files"
ginSwagger "github.com/swaggo/gin-swagger"
)
func RegisterRoutes(cfg *config.Config) *gin.Engine {
router := gin.New()
// Initialize auth middleware configuration
middleware.InitializeAuth(cfg)
// Add global middleware
router.Use(middleware.CORSConfig())
router.Use(middleware.ErrorHandler())
router.Use(logger.RequestLoggerMiddleware(logger.Default()))
router.Use(gin.Recovery())
// Initialize services with error handling
authService := services.NewAuthService(cfg)
if authService == nil {
logger.Fatal("Failed to initialize auth service")
}
// TEST PUSH GIT
// Initialize database service
dbService := database.New(cfg)
// =============================================================================
// HEALTH CHECK & SYSTEM ROUTES
// =============================================================================
healthCheckHandler := healthcheckHandlers.NewHealthCheckHandler(dbService)
sistem := router.Group("/api/sistem")
{
sistem.GET("/health", healthCheckHandler.CheckHealth)
sistem.GET("/databases", func(c *gin.Context) {
c.JSON(200, gin.H{
"databases": dbService.ListDBs(),
"health": dbService.Health(),
"timestamp": time.Now().Unix(),
})
})
sistem.GET("/info", func(c *gin.Context) {
c.JSON(200, gin.H{
"service": "API Service v1.0.0",
"websocket_active": true,
"databases": dbService.ListDBs(),
"timestamp": time.Now().Unix(),
})
})
}
// =============================================================================
// SWAGGER DOCUMENTATION
// =============================================================================
router.GET("/swagger/*any", ginSwagger.WrapHandler(
swaggerFiles.Handler,
ginSwagger.DefaultModelsExpandDepth(-1),
ginSwagger.DeepLinking(true),
))
// =============================================================================
// WEBSOCKET TEST CLIENT
// =============================================================================
// router.GET("/websocket-test", func(c *gin.Context) {
// c.Header("Content-Type", "text/html")
// c.String(http.StatusOK, getWebSocketTestHTML())
// })
// =============================================================================
// API v1 GROUP
// =============================================================================
v1 := router.Group("/api/v1")
// =============================================================================
// PUBLIC ROUTES (No Authentication Required)
// =============================================================================
// Authentication routes
authHandler := authHandlers.NewAuthHandler(authService)
tokenHandler := authHandlers.NewTokenHandler(authService)
// Basic auth routes
v1.POST("/auth/login", authHandler.Login)
v1.POST("/auth/register", authHandler.Register)
v1.POST("/auth/refresh", authHandler.RefreshToken)
// Token generation routes
v1.POST("/token/generate", tokenHandler.GenerateToken)
v1.POST("/token/generate-direct", tokenHandler.GenerateTokenDirect)
// =============================================================================
// PUBLISHED ROUTES
// =============================================================================
// Retribusi endpoints with WebSocket notifications
antreanbpjsHandler := antreanbpjs.NewVClaimHandler(antreanbpjs.VClaimHandlerConfig{
Config: cfg,
Logger: *logger.Default(),
Validator: nil,
})
antreanbpjsGroup := v1.Group("/poli")
antreanbpjsGroup.GET("/ketersediaan", antreanbpjsHandler.GetPoli)
antreanbpjsGroup.GET("/apapun", antreanbpjsHandler.Gethealth)
aplicaresHandler := AplicareHandler.NewAplicaresHandler(AplicareHandler.AplicaresHandlerConfig{
Config: cfg,
Logger: *logger.Default(),
Validator: nil,
})
// Start background scheduler — berhenti otomatis saat app shutdown
ctx, _ := signal.NotifyContext(context.Background(), os.Interrupt, syscall.SIGTERM)
aplicaresHandler.StartScheduler(ctx)
ag := v1.Group("/aplicares")
{
ag.GET("/beds", aplicaresHandler.GetBeds)
ag.GET("/state", aplicaresHandler.GetState)
ag.POST("/sync", aplicaresHandler.TriggerSync)
ag.GET("/check-bpjs", aplicaresHandler.CheckBPJS)
ag.GET("/ref/kelas", aplicaresHandler.GetRefKelas)
ag.GET("/logs", aplicaresHandler.GetSyncLogs)
}
adminHandler := admin.NewAdminHandler(admin.AdminHandlerConfig{
Config: cfg,
})
adminGroup := v1.Group("/admin/aplicares")
{
adminGroup.GET("/ruangan", adminHandler.GetRuangan) // JSON API
adminGroup.PUT("/ruangan/:no", adminHandler.UpdateRuangan) // update mapping
adminGroup.POST("/ruangan", adminHandler.CreateRuangan)
}
router.GET("/admin", adminHandler.GetPage)
// =============================================================================
// PROTECTED ROUTES (Authentication Required)
// =============================================================================
protected := v1.Group("/")
protected.Use(middleware.ConfigurableAuthMiddleware(cfg))
// Protected retribusi endpoints (Authentication Required)
return router
}