完善角色权限与数据隔离
This commit is contained in:
@@ -24,6 +24,7 @@ func SetupRoutes(r *gin.Engine, store storage.ObjectStorage, storageCfg config.S
|
||||
wsHandler := NewWsHandler()
|
||||
widget := NewWidgetHandler()
|
||||
upload := NewUploadHandler(store, storageCfg)
|
||||
perm := NewPermissionHandler()
|
||||
|
||||
SetImagePublicBase(storageCfg.PublicBase)
|
||||
// 访客输入草稿 → 提取联系方式(由 ws 包回调,避免循环依赖)
|
||||
@@ -53,105 +54,123 @@ func SetupRoutes(r *gin.Engine, store storage.ObjectStorage, storageCfg config.S
|
||||
{
|
||||
// 当前用户
|
||||
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", upload.UploadImage)
|
||||
authRequired.POST("/uploads", middleware.RequirePermission("session.reply"), upload.UploadImage)
|
||||
|
||||
// 会话管理
|
||||
authRequired.GET("/agents/available", session.ListAvailableAgents)
|
||||
authRequired.GET("/agents/available", middleware.RequirePermission("session.transfer", "chat_history.view"), 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)
|
||||
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("", 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)
|
||||
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("", blacklist.List)
|
||||
bl.POST("", blacklist.Create)
|
||||
bl.DELETE("/:id", blacklist.Delete)
|
||||
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("", customerTag.List)
|
||||
ctags.POST("", customerTag.Create)
|
||||
ctags.PUT("/:id", customerTag.Update)
|
||||
ctags.DELETE("/:id", customerTag.Delete)
|
||||
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", 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)
|
||||
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("", 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)
|
||||
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("", channel.Create)
|
||||
channels.PUT("/:id", channel.Update)
|
||||
channels.POST("", middleware.RequirePermission("settings.channel"), channel.Create)
|
||||
channels.PUT("/:id", middleware.RequirePermission("settings.channel"), channel.Update)
|
||||
|
||||
// 租户系统设置
|
||||
settingsGroup := authRequired.Group("/settings")
|
||||
settingsGroup.GET("", settings.Get)
|
||||
settingsGroup.PUT("", settings.Update)
|
||||
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", 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)
|
||||
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")
|
||||
|
||||
Reference in New Issue
Block a user