package main import ( "log" "os" "github.com/gin-gonic/gin" "github.com/muyuqingfeng/iloom/shared/pkg/database" "github.com/muyuqingfeng/iloom/shared/pkg/middleware" "github.com/muyuqingfeng/iloom/shared/pkg/response" ws "github.com/muyuqingfeng/iloom/shared/pkg/websocket" "github.com/muyuqingfeng/iloom/washing-service/internal/config" "github.com/muyuqingfeng/iloom/washing-service/internal/handler" "github.com/muyuqingfeng/iloom/washing-service/internal/repository" "github.com/muyuqingfeng/iloom/washing-service/internal/service" ) 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 := ws.NewHub() go wsHub.Run() planRepo := repository.NewPlanRepo(db) completionRepo := repository.NewCompletionRepo(db) fpRepo := repository.NewFinishedProductRepo(db) paymentRepo := repository.NewPaymentRepo(db) planSvc := service.NewPlanService(planRepo) completionSvc := service.NewCompletionService(completionRepo, planRepo, fpRepo, db) fpSvc := service.NewFinishedProductService(fpRepo, db) paymentSvc := service.NewPaymentService(paymentRepo) dashboardSvc := service.NewDashboardService(planRepo, fpRepo, paymentRepo) planHandler := handler.NewPlanHandler(planSvc) completionHandler := handler.NewCompletionHandler(completionSvc, wsHub) fpHandler := handler.NewFinishedProductHandler(fpSvc, wsHub) paymentHandler := handler.NewPaymentHandler(paymentSvc) 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": "washing-service"}) }) api := r.Group("/api/v1/washing") { api.GET("/dashboard/stats", dashboardHandler.Stats) api.GET("/plans", planHandler.List) api.GET("/plans/pending", planHandler.Pending) api.GET("/plans/completed", planHandler.Completed) api.GET("/plans/:id", planHandler.Get) api.PATCH("/plans/:id/status", planHandler.UpdateStatus) api.POST("/plans/:id/complete", completionHandler.Complete) api.GET("/finished-products", fpHandler.List) api.POST("/finished-products", fpHandler.Create) api.POST("/finished-products/:id/outbound", fpHandler.Outbound) api.GET("/payments", paymentHandler.List) api.POST("/payments/:id/confirm", paymentHandler.Confirm) } r.GET("/ws/v1/washing", handler.HandleWebSocket(wsHub)) port := cfg.Port if port == "" { port = "8084" } log.Printf("washing-service listening on :%s", port) if err := r.Run(":" + port); err != nil { log.Fatalf("failed to start server: %v", err) } }