package main import ( "log" "net/http" "github.com/gin-gonic/gin" "github.com/muyuqingfeng/iloom/shared/pkg/database" "github.com/muyuqingfeng/iloom/shared/pkg/middleware" ws "github.com/muyuqingfeng/iloom/shared/pkg/websocket" "github.com/muyuqingfeng/iloom/textile-service/internal/config" "github.com/muyuqingfeng/iloom/textile-service/internal/handler" "github.com/muyuqingfeng/iloom/textile-service/internal/repository" "github.com/muyuqingfeng/iloom/textile-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() hub := ws.NewHub() go hub.Run() planRepo := repository.NewPlanRepo(db) stepRepo := repository.NewStepRepo(db) yarnRepo := repository.NewYarnRepo(db) inventoryRepo := repository.NewInventoryRepo(db) paymentRepo := repository.NewPaymentRepo(db) planSvc := service.NewPlanService(planRepo, stepRepo, inventoryRepo) processSvc := service.NewProcessService(stepRepo, inventoryRepo) yarnSvc := service.NewYarnService(yarnRepo, db) inventorySvc := service.NewInventoryService(inventoryRepo) paymentSvc := service.NewPaymentService(paymentRepo) dashboardSvc := service.NewDashboardService(planRepo, yarnRepo, paymentRepo) planHandler := handler.NewPlanHandler(planSvc) stepHandler := handler.NewProcessStepHandler(processSvc, hub) yarnHandler := handler.NewYarnHandler(yarnSvc, hub) inventoryHandler := handler.NewInventoryHandler(inventorySvc, hub) paymentHandler := handler.NewPaymentHandler(paymentSvc) dashboardHandler := handler.NewDashboardHandler(dashboardSvc) r := gin.New() r.Use(middleware.Recovery()) r.Use(middleware.Logger()) r.Use(middleware.RequestID()) r.Use(middleware.CORS([]string{"*"})) r.GET("/health", func(c *gin.Context) { c.JSON(http.StatusOK, gin.H{"status": "ok", "service": "textile-service"}) }) r.GET("/ws/v1/textile", handler.HandleWebSocket(hub)) api := r.Group("/api/v1/textile") { api.GET("/dashboard/stats", dashboardHandler.Stats) api.GET("/plans", planHandler.List) api.GET("/plans/:id", planHandler.Get) api.POST("/plans/:id/steps/:stepId/complete", stepHandler.Complete) api.POST("/plans/:id/steps/:stepId/reject", stepHandler.Reject) api.POST("/plans/:id/inventory", inventoryHandler.Inbound) api.GET("/plans/:id/inventory", inventoryHandler.List) api.GET("/yarn-stock", yarnHandler.List) api.POST("/yarn-stock", yarnHandler.Create) api.PUT("/yarn-stock/:id", yarnHandler.Update) api.POST("/yarn-stock/:id/records", yarnHandler.AddRecord) api.GET("/payments", paymentHandler.List) api.POST("/payments/:id/confirm", paymentHandler.Confirm) } log.Printf("textile-service starting on :%s", cfg.Port) if err := r.Run(":" + cfg.Port); err != nil { log.Fatalf("failed to start server: %v", err) } }