package main import ( "log" "os" "github.com/gin-gonic/gin" "github.com/muyuqingfeng/iloom/purchaser-service/internal/config" "github.com/muyuqingfeng/iloom/purchaser-service/internal/handler" "github.com/muyuqingfeng/iloom/purchaser-service/internal/repository" "github.com/muyuqingfeng/iloom/purchaser-service/internal/service" "github.com/muyuqingfeng/iloom/shared/pkg/database" "github.com/muyuqingfeng/iloom/shared/pkg/middleware" "github.com/muyuqingfeng/iloom/shared/pkg/response" "github.com/muyuqingfeng/iloom/shared/pkg/websocket" ) func main() { cfg := config.Load() db, err := database.NewDBFromDSN(cfg.DBDSN) if err != nil { log.Fatalf("failed to connect database: %v", err) } defer db.Close() wsHub := websocket.NewHub() go wsHub.Run() planRepo := repository.NewPlanRepo(db) productRepo := repository.NewProductRepo(db) apRepo := repository.NewAPRepo(db) factoryRepo := repository.NewFactoryRepo(db) washingPlanRepo := repository.NewWashingPlanRepo(db) planSvc := service.NewPlanService(planRepo, db) productSvc := service.NewProductService(productRepo, db) apSvc := service.NewAPService(apRepo, db) factorySvc := service.NewFactoryService(factoryRepo) washingPlanSvc := service.NewWashingPlanService(washingPlanRepo) dashboardSvc := service.NewDashboardService(planRepo, productRepo, apRepo) planHandler := handler.NewPlanHandler(planSvc, wsHub) productHandler := handler.NewProductHandler(productSvc, wsHub) apHandler := handler.NewAPHandler(apSvc) factoryHandler := handler.NewFactoryHandler(factorySvc) washingPlanHandler := handler.NewWashingPlanHandler(washingPlanSvc) dashboardHandler := handler.NewDashboardHandler(dashboardSvc) if os.Getenv("GIN_MODE") == "" { gin.SetMode(gin.ReleaseMode) } r := gin.New() r.Use(middleware.Recovery(), middleware.Logger(), middleware.RequestID()) r.GET("/health", func(c *gin.Context) { response.OK(c, gin.H{"status": "ok", "service": "purchaser-service"}) }) api := r.Group("/api/v1/purchaser") { api.GET("/dashboard/stats", dashboardHandler.Stats) api.GET("/plans", planHandler.List) api.POST("/plans", planHandler.Create) api.GET("/plans/:id", planHandler.Get) api.PUT("/plans/:id", planHandler.Update) api.DELETE("/plans/:id", planHandler.Delete) api.POST("/plans/:id/factories", planHandler.AssignFactory) api.GET("/plans/:id/steps", planHandler.GetSteps) api.GET("/plans/:id/inventory", planHandler.GetInventory) api.GET("/products", productHandler.List) api.POST("/products", productHandler.Create) api.PUT("/products/:id", productHandler.Update) api.DELETE("/products/:id", productHandler.Delete) api.POST("/products/:id/inbound", productHandler.Inbound) api.POST("/products/:id/outbound", productHandler.Outbound) api.GET("/products/:id/records", productHandler.Records) api.PUT("/products/:id/price", productHandler.UpdatePrice) api.GET("/products/:id/price-history", productHandler.PriceHistory) api.GET("/factories", factoryHandler.List) api.GET("/accounts-payable", apHandler.List) api.POST("/accounts-payable/:id/pay", apHandler.Pay) api.POST("/washing-plans", washingPlanHandler.Create) api.GET("/washing-plans", washingPlanHandler.List) } r.GET("/ws/v1/purchaser", handler.HandleWebSocket(wsHub)) port := cfg.Port if port == "" { port = "8082" } log.Printf("purchaser-service listening on :%s", port) if err := r.Run(":" + port); err != nil { log.Fatalf("failed to start server: %v", err) } }