package handler import ( "github.com/gin-gonic/gin" "kefu-cloud/server/internal/config" "kefu-cloud/server/internal/middleware" "kefu-cloud/server/internal/storage" "kefu-cloud/server/internal/ws" ) 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() blacklist := NewBlacklistHandler() wsHandler := NewWsHandler() widget := NewWidgetHandler() upload := NewUploadHandler(store, storageCfg) perm := NewPermissionHandler() SetImagePublicBase(storageCfg.PublicBase) // 访客输入草稿 → 提取联系方式(由 ws 包回调,避免循环依赖) ws.ProcessDraftContacts = onVisitorDraftContacts 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()) { // 当前用户 authRequired.GET("/me", auth.Me) authRequired.GET("/me/permissions", auth.MePermissions) authRequired.PUT("/me/status", auth.UpdatePresence) // WebSocket authRequired.GET("/ws", wsHandler.Connect) // 上传 authRequired.POST("/uploads", middleware.RequirePermission("session.reply"), upload.UploadImage) // 会话管理 authRequired.GET("/agents/available", middleware.RequirePermission("session.transfer", "chat_history.view"), session.ListAvailableAgents) sessions := authRequired.Group("/sessions") sessions.GET("", middleware.RequirePermission("session.view", "chat_history.view"), session.List) sessions.GET("/export", middleware.RequirePermission("chat_history.export"), session.Export) sessions.GET("/:id", middleware.RequirePermission("session.view", "chat_history.detail"), session.Get) sessions.POST("", middleware.RequirePermission("session.view"), session.Create) sessions.POST("/batch-archive", middleware.RequirePermission("chat_history.batch_archive"), session.BatchArchive) sessions.POST("/:id/assign", middleware.RequirePermission("session.view"), session.Assign) sessions.POST("/:id/transfer", middleware.RequirePermission("session.transfer"), session.Transfer) sessions.POST("/:id/end", middleware.RequirePermission("session.end"), session.End) sessions.POST("/:id/archive", middleware.RequirePermission("chat_history.batch_archive"), session.Archive) sessions.PUT("/:id/priority", middleware.RequirePermission("session.priority"), session.UpdatePriority) sessions.GET("/:id/messages", middleware.RequirePermission("session.view", "chat_history.detail"), session.ListMessages) sessions.POST("/:id/messages", middleware.RequirePermission("session.reply"), session.SendMessage) sessions.POST("/:id/read", middleware.RequirePermission("session.view"), session.MarkRead) sessions.POST("/:id/notes", middleware.RequirePermission("session.note"), session.AddNote) // 客户管理 customers := authRequired.Group("/customers") customers.GET("", middleware.RequirePermission("customer.view"), customer.List) customers.GET("/export", middleware.RequirePermission("customer.export"), customer.Export) customers.GET("/:id", middleware.RequirePermission("customer.view"), customer.Get) customers.POST("", middleware.RequirePermission("customer.create"), customer.Create) customers.PUT("/:id", middleware.RequirePermission("customer.edit"), customer.Update) customers.DELETE("/:id", middleware.RequirePermission("customer.export"), customer.Delete) // 黑名单(拉黑 IP / 设备) bl := authRequired.Group("/blacklist") bl.GET("", middleware.RequirePermission("blacklist.view"), blacklist.List) bl.POST("", middleware.RequirePermission("blacklist.create"), blacklist.Create) bl.DELETE("/:id", middleware.RequirePermission("blacklist.delete"), blacklist.Delete) // 客户标签库(管理员维护,全员可读可选) ctags := authRequired.Group("/customer-tags") ctags.GET("", middleware.RequirePermission("customer.view", "settings.customer_tag"), customerTag.List) ctags.POST("", middleware.RequirePermission("settings.customer_tag"), customerTag.Create) ctags.PUT("/:id", middleware.RequirePermission("settings.customer_tag"), customerTag.Update) ctags.DELETE("/:id", middleware.RequirePermission("settings.customer_tag"), customerTag.Delete) // 知识库 kb := authRequired.Group("/knowledge") kb.GET("/categories", middleware.RequirePermission("knowledge.view"), knowledge.ListCategories) kb.POST("/categories", middleware.RequirePermission("knowledge.create"), knowledge.CreateCategory) kb.PUT("/categories/:id", middleware.RequirePermission("knowledge.edit"), knowledge.UpdateCategory) kb.DELETE("/categories/:id", middleware.RequirePermission("knowledge.delete"), knowledge.DeleteCategory) kb.GET("/entries", middleware.RequirePermission("knowledge.view"), knowledge.ListEntries) kb.POST("/entries", middleware.RequirePermission("knowledge.create"), knowledge.CreateEntry) kb.PUT("/entries/:id", middleware.RequirePermission("knowledge.edit"), knowledge.UpdateEntry) kb.DELETE("/entries/:id", middleware.RequirePermission("knowledge.delete"), knowledge.DeleteEntry) // 快捷回复(团队 / 个人,与知识库独立) qr := authRequired.Group("/quick-replies") qr.GET("", middleware.RequirePermission("quick_reply.view"), quickReply.List) qr.GET("/suggest", middleware.RequirePermission("quick_reply.view"), quickReply.Suggest) qr.GET("/export", middleware.RequirePermission("quick_reply.view"), quickReply.Export) qr.GET("/import-template", middleware.RequirePermission("quick_reply.personal_manage", "quick_reply.team_create"), quickReply.ImportTemplate) qr.POST("/import", middleware.RequirePermission("quick_reply.personal_manage", "quick_reply.team_create", "quick_reply.team_edit"), quickReply.Import) qr.POST("", middleware.RequirePermission("quick_reply.personal_manage", "quick_reply.team_create"), quickReply.Create) qr.PUT("/:id", middleware.RequirePermission("quick_reply.personal_manage", "quick_reply.team_edit"), quickReply.Update) qr.DELETE("/:id", middleware.RequirePermission("quick_reply.personal_manage", "quick_reply.team_edit"), quickReply.Delete) qr.POST("/:id/publish", middleware.RequirePermission("quick_reply.team_edit"), quickReply.Publish) qr.POST("/:id/unpublish", middleware.RequirePermission("quick_reply.team_edit"), quickReply.Unpublish) qr.POST("/:id/use", middleware.RequirePermission("quick_reply.view"), quickReply.Use) // 渠道设置(租户级) channels := authRequired.Group("/channels") channels.GET("", channel.List) channels.POST("", middleware.RequirePermission("settings.channel"), channel.Create) channels.PUT("/:id", middleware.RequirePermission("settings.channel"), channel.Update) // 租户系统设置 settingsGroup := authRequired.Group("/settings") settingsGroup.GET("", middleware.RequirePermission( "settings.basic", "settings.assign_rule", "settings.auto_reply", "settings.worktime", "settings.notification", ), settings.Get) settingsGroup.PUT("", middleware.RequirePermission("settings.basic"), settings.Update) // 坐席账号(租户内) staffGroup := authRequired.Group("/staff") staffGroup.Use(middleware.AdminRequired(), middleware.RequirePermission("settings.staff")) staffGroup.GET("", staff.List) staffGroup.POST("", staff.Create) staffGroup.POST("/batch", staff.Batch) staffGroup.PUT("/:id", staff.Update) staffGroup.DELETE("/:id", staff.Delete) // 权限管理(管理员专属) rolesGroup := authRequired.Group("/roles") rolesGroup.Use(middleware.AdminRequired()) { rolesGroup.GET("", middleware.RequirePermission("permission.view"), perm.ListRoles) rolesGroup.GET("/permissions", middleware.RequirePermission("permission.view"), perm.ListPermissions) rolesGroup.GET("/:id", middleware.RequirePermission("permission.view"), perm.GetRole) rolesGroup.POST("", middleware.RequirePermission("permission.create_role"), perm.CreateRole) rolesGroup.PUT("/:id", middleware.RequirePermission("permission.create_role"), perm.UpdateRole) rolesGroup.PUT("/:id/builtin", middleware.RequirePermission("permission.create_role"), perm.UpdateBuiltinRole) rolesGroup.DELETE("/:id", middleware.RequirePermission("permission.delete_role"), perm.DeleteRole) } // 统计 statistics := authRequired.Group("/statistics") statistics.GET("/kpi", middleware.RequirePermission("statistics.view"), stats.KPIs) statistics.GET("/trend", middleware.RequirePermission("statistics.view"), stats.SessionTrend) statistics.GET("/response-distribution", middleware.RequirePermission("statistics.view"), stats.ResponseDistribution) statistics.GET("/performance", middleware.RequirePermission("statistics.performance"), stats.AgentPerformance) statistics.GET("/channels", middleware.RequirePermission("statistics.view"), stats.ChannelDistribution) statistics.GET("/export", middleware.RequirePermission("statistics.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) } } }