package routers import ( "os" "wm-backend/configs/constants" _ "wm-backend/docs/swagger" "wm-backend/internal/middlewares" "wm-backend/internal/services" "wm-backend/pkg/utils" "github.com/gin-gonic/gin" swaggerFiles "github.com/swaggo/files" ginSwagger "github.com/swaggo/gin-swagger" ) func NewRouter() *gin.Engine { nodeEnv := os.Getenv("ENV") if nodeEnv != constants.DevEnvironment { gin.SetMode(gin.ReleaseMode) } r := gin.Default() r.Use(middlewares.LoggingMiddleware()) v1 := r.Group(constants.API_VERSION_1) { auth := v1.Group(constants.API_GROUP_AUTH) { auth.POST(constants.API_PATH_AUTH_REGISTER, utils.AsyncHandler(services.Register)) auth.POST(constants.API_PATH_AUTH_LOGIN, utils.AsyncHandler(services.Login)) } // Protected routes (require JWT authentication) protected := v1.Group("") protected.Use(middlewares.AuthMiddleware()) { protected.GET(constants.API_PATH_PROFILE, utils.AsyncHandler(services.GetProfile)) } warehouse := v1.Group(constants.API_GROUP_WAREHOUSE) { warehouse.GET("", utils.AsyncHandler(services.WareHouseList)) warehouse.GET("/:id", utils.AsyncHandler(services.WareHouseGetByID)) warehouse.POST("", utils.AsyncHandler(services.WareHouseCreate)) warehouse.PUT("/:id", utils.AsyncHandler(services.WareHouseUpdate)) warehouse.DELETE("/:id", utils.AsyncHandler(services.WareHouseDelete)) } room := v1.Group(constants.API_GROUP_ROOM) { room.GET("", utils.AsyncHandler(services.RoomList)) room.GET("/:id", utils.AsyncHandler(services.RoomGetByID)) room.POST("", utils.AsyncHandler(services.RoomCreate)) room.PUT("/:id", utils.AsyncHandler(services.RoomUpdate)) room.DELETE("/:id", utils.AsyncHandler(services.RoomDelete)) } cabinet := v1.Group(constants.API_GROUP_CABINET) { cabinet.GET("", utils.AsyncHandler(services.CabinetList)) cabinet.GET("/:id", utils.AsyncHandler(services.CabinetGetByID)) cabinet.POST("", utils.AsyncHandler(services.CabinetCreate)) cabinet.PUT("/:id", utils.AsyncHandler(services.CabinetUpdate)) cabinet.DELETE("/:id", utils.AsyncHandler(services.CabinetDelete)) } shelve := v1.Group(constants.API_GROUP_SHELF) { shelve.GET("", utils.AsyncHandler(services.ShelveList)) shelve.GET("/:id", utils.AsyncHandler(services.ShelveGetByID)) shelve.POST("", utils.AsyncHandler(services.ShelveCreate)) shelve.PUT("/:id", utils.AsyncHandler(services.ShelveUpdate)) shelve.DELETE("/:id", utils.AsyncHandler(services.ShelveDelete)) } container := v1.Group(constants.API_GROUP_CONTAINER) { container.GET("", utils.AsyncHandler(services.ContainerList)) container.GET("/:id", utils.AsyncHandler(services.ContainerGetByID)) container.POST("", utils.AsyncHandler(services.ContainerCreate)) container.PUT("/:id", utils.AsyncHandler(services.ContainerUpdate)) container.DELETE("/:id", utils.AsyncHandler(services.ContainerDelete)) } componentType := v1.Group(constants.API_GROUP_COMPONENT_TYPE) { componentType.GET("", utils.AsyncHandler(services.ComponentTypeList)) componentType.GET("/:id", utils.AsyncHandler(services.ComponentTypeGetByID)) componentType.POST("", utils.AsyncHandler(services.ComponentTypeCreate)) componentType.PUT("/:id", utils.AsyncHandler(services.ComponentTypeUpdate)) componentType.DELETE("/:id", utils.AsyncHandler(services.ComponentTypeDelete)) } component := v1.Group(constants.API_GROUP_COMPONENT) { component.GET("", utils.AsyncHandler(services.ComponentList)) component.GET("/:id", utils.AsyncHandler(services.ComponentGetByID)) component.POST("", utils.AsyncHandler(services.ComponentCreate)) component.PUT("/:id", utils.AsyncHandler(services.ComponentUpdate)) component.DELETE("/:id", utils.AsyncHandler(services.ComponentDelete)) } componentCode := v1.Group(constants.API_GROUP_COMPONENT_CODE) { componentCode.GET("", utils.AsyncHandler(services.ComponentCodeList)) componentCode.GET("/:id", utils.AsyncHandler(services.ComponentCodeGetByID)) componentCode.POST("", utils.AsyncHandler(services.ComponentCodeCreate)) componentCode.PUT("/:id", utils.AsyncHandler(services.ComponentCodeUpdate)) componentCode.DELETE("/:id", utils.AsyncHandler(services.ComponentCodeDelete)) } componentItem := v1.Group(constants.API_GROUP_COMPONENT_ITEM) { componentItem.GET("", utils.AsyncHandler(services.ComponentItemList)) componentItem.GET("/find/:componentId", utils.AsyncHandler(services.ComponentItemFind)) componentItem.GET("/:id", utils.AsyncHandler(services.ComponentItemGetByID)) componentItem.POST("", utils.AsyncHandler(services.ComponentItemCreate)) componentItem.PUT("/:id/status", utils.AsyncHandler(services.ComponentItemUpdateStatus)) componentItem.PUT("/:id", utils.AsyncHandler(services.ComponentItemUpdate)) componentItem.DELETE("/:id", utils.AsyncHandler(services.ComponentItemDelete)) } invoiceConfig := v1.Group(constants.API_GROUP_INVOICE_CONFIG) { invoiceConfig.GET("", utils.AsyncHandler(services.InvoiceConfigList)) invoiceConfig.GET("/:id", utils.AsyncHandler(services.InvoiceConfigGetByID)) invoiceConfig.POST("", utils.AsyncHandler(services.InvoiceConfigCreate)) invoiceConfig.PUT("/:id", utils.AsyncHandler(services.InvoiceConfigUpdate)) invoiceConfig.DELETE("/:id", utils.AsyncHandler(services.InvoiceConfigDelete)) } invoiceConfigItem := v1.Group(constants.API_GROUP_INVOICE_CONFIG_ITEM) { invoiceConfigItem.GET("", utils.AsyncHandler(services.InvoiceConfigItemList)) invoiceConfigItem.GET("/:id", utils.AsyncHandler(services.InvoiceConfigItemGetByID)) invoiceConfigItem.POST("", utils.AsyncHandler(services.InvoiceConfigItemCreate)) invoiceConfigItem.PUT("/:id", utils.AsyncHandler(services.InvoiceConfigItemUpdate)) invoiceConfigItem.DELETE("/:id", utils.AsyncHandler(services.InvoiceConfigItemDelete)) } invoice := v1.Group(constants.API_GROUP_INVOICE) { invoice.GET("", utils.AsyncHandler(services.InvoiceList)) invoice.GET("/:id", utils.AsyncHandler(services.InvoiceGetByID)) invoice.POST("", utils.AsyncHandler(services.InvoiceCreate)) invoice.PUT("/:id", utils.AsyncHandler(services.InvoiceUpdate)) invoice.DELETE("/:id", utils.AsyncHandler(services.InvoiceDelete)) } alternativeComponent := v1.Group(constants.API_GROUP_ALTERNATIVE_COMPONENT) { alternativeComponent.GET("", utils.AsyncHandler(services.AlternativeComponentList)) alternativeComponent.GET("/:id", utils.AsyncHandler(services.AlternativeComponentGetByID)) alternativeComponent.POST("", utils.AsyncHandler(services.AlternativeComponentCreate)) alternativeComponent.PUT("/:id", utils.AsyncHandler(services.AlternativeComponentUpdate)) alternativeComponent.DELETE("/:id", utils.AsyncHandler(services.AlternativeComponentDelete)) } } r.GET(constants.API_PATH_PING, services.PingHandler) r.GET(constants.API_PATH_DOCS, ginSwagger.WrapHandler(swaggerFiles.Handler)) return r }