package handler import ( "github.com/gin-gonic/gin" "kefu-cloud/server/internal/config" "kefu-cloud/server/internal/middleware" "kefu-cloud/server/internal/storage" ) func SetupRoutes(r *gin.Engine, store storage.ObjectStorage, storageCfg config.StorageConfig) { auth := NewAuthHandler() session := NewSessionHandler() customer := NewCustomerHandler() customerTag := NewCustomerTagHandler() knowledge := NewKnowledgeHandler() quickReply := NewQuickReplyHandler() stats := NewStatisticsHandler() admin := NewAdminHandler(store) channel := NewChannelHandler() settings := NewSettingsHandler() staff := NewStaffHandler() ws := NewWsHandler() widget := NewWidgetHandler() upload := NewUploadHandler(store, storageCfg) SetImagePublicBase(storageCfg.PublicBase) api := r.Group("/api") // 公开接口 api.POST("/login", auth.Login) // widget 接口 widgetApi := api.Group("/widget") widgetApi.POST("/init", widget.Init) widgetApi.GET("/init", widget.Init) widgetApi.POST("/message", widget.SendMessage) widgetApi.POST("/leave-message", widget.LeaveMessage) widgetApi.GET("/messages", widget.GetMessages) widgetApi.GET("/ws", widget.Connect) widgetApi.POST("/rating", widget.SubmitRating) widgetApi.POST("/upload", upload.WidgetUploadImage) widgetApi.POST("/pageview", widget.PageView) widgetApi.POST("/heartbeat", widget.Heartbeat) // 需要认证的接口 authRequired := api.Group("") authRequired.Use(middleware.AuthRequired()) { // WebSocket authRequired.GET("/ws", ws.Connect) // 上传 authRequired.POST("/uploads", upload.UploadImage) // 会话管理 authRequired.GET("/agents/available", session.ListAvailableAgents) sessions := authRequired.Group("/sessions") sessions.GET("", session.List) sessions.GET("/export", session.Export) sessions.GET("/:id", session.Get) sessions.POST("", session.Create) sessions.POST("/batch-archive", session.BatchArchive) sessions.POST("/:id/assign", session.Assign) sessions.POST("/:id/transfer", session.Transfer) sessions.POST("/:id/end", session.End) sessions.POST("/:id/archive", session.Archive) sessions.PUT("/:id/priority", session.UpdatePriority) sessions.GET("/:id/messages", session.ListMessages) sessions.POST("/:id/messages", session.SendMessage) sessions.POST("/:id/read", session.MarkRead) sessions.POST("/:id/notes", session.AddNote) // 客户管理 customers := authRequired.Group("/customers") customers.GET("", customer.List) customers.GET("/export", customer.Export) customers.GET("/:id", customer.Get) customers.POST("", customer.Create) customers.PUT("/:id", customer.Update) customers.DELETE("/:id", customer.Delete) // 客户标签库(管理员维护,全员可读可选) ctags := authRequired.Group("/customer-tags") ctags.GET("", customerTag.List) ctags.POST("", customerTag.Create) ctags.PUT("/:id", customerTag.Update) ctags.DELETE("/:id", customerTag.Delete) // 知识库 kb := authRequired.Group("/knowledge") kb.GET("/categories", knowledge.ListCategories) kb.POST("/categories", knowledge.CreateCategory) kb.PUT("/categories/:id", knowledge.UpdateCategory) kb.DELETE("/categories/:id", knowledge.DeleteCategory) kb.GET("/entries", knowledge.ListEntries) kb.POST("/entries", knowledge.CreateEntry) kb.PUT("/entries/:id", knowledge.UpdateEntry) kb.DELETE("/entries/:id", knowledge.DeleteEntry) // 快捷回复(团队 / 个人,与知识库独立) qr := authRequired.Group("/quick-replies") qr.GET("", quickReply.List) qr.GET("/suggest", quickReply.Suggest) qr.GET("/export", quickReply.Export) qr.GET("/import-template", quickReply.ImportTemplate) qr.POST("/import", quickReply.Import) qr.POST("", quickReply.Create) qr.PUT("/:id", quickReply.Update) qr.DELETE("/:id", quickReply.Delete) qr.POST("/:id/publish", quickReply.Publish) qr.POST("/:id/unpublish", quickReply.Unpublish) qr.POST("/:id/use", quickReply.Use) // 渠道设置(租户级) channels := authRequired.Group("/channels") channels.GET("", channel.List) channels.POST("", channel.Create) channels.PUT("/:id", channel.Update) // 租户系统设置 settingsGroup := authRequired.Group("/settings") settingsGroup.GET("", settings.Get) settingsGroup.PUT("", settings.Update) // 坐席账号(租户内) staffGroup := authRequired.Group("/staff") staffGroup.GET("", staff.List) staffGroup.POST("", staff.Create) staffGroup.PUT("/:id", staff.Update) staffGroup.DELETE("/:id", staff.Delete) // 统计 statistics := authRequired.Group("/statistics") statistics.GET("/kpi", stats.KPIs) statistics.GET("/trend", stats.SessionTrend) statistics.GET("/response-distribution", stats.ResponseDistribution) statistics.GET("/performance", stats.AgentPerformance) statistics.GET("/channels", stats.ChannelDistribution) statistics.GET("/export", stats.Export) // 管理端接口(需要管理员权限) adminGroup := authRequired.Group("/admin") adminGroup.Use(middleware.PlatformRequired()) { adminGroup.GET("/stats", admin.Stats) adminGroup.GET("/ops/metrics", admin.OpsMetrics) adminGroup.GET("/tenants", admin.ListTenants) adminGroup.GET("/tenants/:id", admin.GetTenant) adminGroup.POST("/tenants", admin.CreateTenant) adminGroup.PUT("/tenants/:id", admin.UpdateTenant) adminGroup.POST("/tenants/:id/suspend", admin.SuspendTenant) adminGroup.POST("/tenants/:id/resume", admin.ResumeTenant) adminGroup.GET("/plans", admin.ListPlans) adminGroup.POST("/plans", admin.CreatePlan) adminGroup.PUT("/plans/:id", admin.UpdatePlan) adminGroup.GET("/logs", admin.ListLogs) adminGroup.GET("/announcements", admin.ListAnnouncements) adminGroup.POST("/announcements", admin.CreateAnnouncement) adminGroup.PUT("/announcements/:id", admin.UpdateAnnouncement) adminGroup.DELETE("/announcements/:id", admin.DeleteAnnouncement) } } }