170 lines
6.0 KiB
Go
170 lines
6.0 KiB
Go
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()
|
|
wsHandler := NewWsHandler()
|
|
widget := NewWidgetHandler()
|
|
upload := NewUploadHandler(store, storageCfg)
|
|
|
|
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())
|
|
{
|
|
// WebSocket
|
|
authRequired.GET("/ws", wsHandler.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)
|
|
}
|
|
}
|
|
}
|