package v1 import ( "net/http" "api-service/internal/config" authHandlers "api-service/internal/handlers/auth" componentHandlers "api-service/internal/handlers/component" employeeHandlers "api-service/internal/handlers/employee" "api-service/internal/middleware" services "api-service/internal/services/auth" "github.com/gin-gonic/gin" swaggerFiles "github.com/swaggo/files" ginSwagger "github.com/swaggo/gin-swagger" ) // RegisterRoutes registers all API routes for version 1 func RegisterRoutes(cfg *config.Config) *gin.Engine { router := gin.New() // Add middleware router.Use(middleware.CORSConfig()) router.Use(middleware.ErrorHandler()) router.Use(gin.Logger()) router.Use(gin.Recovery()) // Initialize services authService := services.NewAuthService(cfg) // Swagger UI route router.GET("/swagger/*any", ginSwagger.WrapHandler(swaggerFiles.Handler)) // API v1 group v1 := router.Group("/api/v1") { // Public routes (no authentication required) // Health endpoints healthHandler := componentHandlers.NewHealthHandler() v1.GET("/health", healthHandler.GetHealth) v1.GET("/", healthHandler.HelloWorld) // Authentication routes authHandler := authHandlers.NewAuthHandler(authService) tokenHandler := authHandlers.NewTokenHandler(authService) v1.POST("/auth/login", authHandler.Login) v1.POST("/auth/register", authHandler.Register) v1.GET("/auth/me", middleware.JWTAuthMiddleware(authService), authHandler.Me) v1.POST("/auth/refresh", authHandler.RefreshToken) // Token generation routes v1.POST("/token/generate", tokenHandler.GenerateToken) v1.POST("/token/generate-direct", tokenHandler.GenerateTokenDirect) // Protected routes (require authentication) // Employee endpoints employeeHandler := employeeHandlers.NewEmployeeHandler() v1.GET("/employees", employeeHandler.GetEmployee) v1.GET("/employees/:id", employeeHandler.GetEmployeeByID) v1.POST("/employees", employeeHandler.CreateEmployee) v1.PUT("/employees/:id", employeeHandler.UpdateEmployee) v1.DELETE("/employees/:id", employeeHandler.DeleteEmployee) protected := v1.Group("/") protected.Use(middleware.JWTAuthMiddleware(authService)) { // Product endpoints productHandler := componentHandlers.NewProductHandler() protected.GET("/products", productHandler.GetProduct) protected.GET("/products/:id", productHandler.GetProductByID) protected.POST("/products", productHandler.CreateProduct) protected.PUT("/products/:id", productHandler.UpdateProduct) protected.DELETE("/products/:id", productHandler.DeleteProduct) // Example endpoints exampleHandler := componentHandlers.NewExampleHandler() protected.GET("/example", exampleHandler.GetExample) protected.POST("/example", exampleHandler.PostExample) // WebSocket endpoint protected.GET("/websocket", WebSocketHandler) protected.GET("/webservice", WebServiceHandler) } } return router } // WebSocketHandler handles WebSocket connections func WebSocketHandler(c *gin.Context) { // This will be implemented with proper WebSocket handling c.JSON(http.StatusOK, gin.H{"message": "WebSocket endpoint"}) } func WebServiceHandler(c *gin.Context) { // This will be implemented with proper WebSocket handling c.JSON(http.StatusOK, gin.H{"message": "WebSocket endpoint"}) }