package main import ( "fmt" "log" "os" "github.com/casehub/ticket-workbench/internal/config" "github.com/casehub/ticket-workbench/internal/handler" "github.com/casehub/ticket-workbench/internal/middleware" "github.com/casehub/ticket-workbench/internal/model" "github.com/gin-gonic/gin" "gorm.io/driver/mysql" "gorm.io/gorm" "gorm.io/gorm/logger" ) func main() { cfg, err := config.Load("config.yaml") if err != nil { log.Fatalf("Failed to load config: %v", err) } dsn := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=utf8mb4&parseTime=True&loc=Local", cfg.Database.User, cfg.Database.Password, cfg.Database.Host, cfg.Database.Port, cfg.Database.DBName, ) db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{ Logger: logger.Default.LogMode(logger.Info), }) if err != nil { log.Fatalf("Failed to connect database: %v", err) } sqlDB, err := db.DB() if err != nil { log.Fatalf("Failed to get database instance: %v", err) } sqlDB.SetMaxIdleConns(10) sqlDB.SetMaxOpenConns(100) if err := db.AutoMigrate( &model.TicketUser{}, &model.TicketInfo{}, &model.TicketAiAnalysis{}, &model.TicketNote{}, &model.TicketOperationLog{}, ); err != nil { log.Fatalf("Failed to auto migrate: %v", err) } gin.SetMode(gin.ReleaseMode) r := gin.Default() r.Use(middleware.CORS()) authMiddleware := middleware.Auth(db) api := r.Group("/api") { auth := api.Group("/auth") { auth.POST("/login", handler.Login(db)) auth.POST("/logout", handler.Logout()) auth.GET("/me", authMiddleware, handler.UserInfo()) } tickets := api.Group("/tickets") tickets.Use(authMiddleware) { tickets.GET("", handler.ListTickets(db)) tickets.POST("", handler.CreateTicket(db)) tickets.GET("/:id", handler.GetTicket(db)) tickets.PUT("/:id", handler.UpdateTicket(db)) tickets.PUT("/:id/status", handler.UpdateTicketStatus(db)) tickets.POST("/:id/analyze", handler.AnalyzeTicket(db, cfg)) tickets.GET("/:id/analysis", handler.GetAnalysis(db)) tickets.PUT("/:id/analysis", handler.ConfirmAnalysis(db)) tickets.GET("/:id/notes", handler.ListNotes(db)) tickets.POST("/:id/notes", handler.AddNote(db)) tickets.GET("/:id/logs", handler.GetOperationLogs(db)) } } addr := fmt.Sprintf(":%d", cfg.Server.Port) if os.Getenv("PORT") != "" { addr = ":" + os.Getenv("PORT") } log.Printf("Server starting on %s", addr) if err := r.Run(addr); err != nil { log.Fatalf("Failed to start server: %v", err) } }