Files
MAcode/tcs-iptv/internal/api/admin_handlers.go
T

161 lines
4.2 KiB
Go

package api
import (
"net/http"
"github.com/gin-gonic/gin"
"github.com/tcs-iptv/tcs/internal/httpx"
"github.com/tcs-iptv/tcs/internal/model"
"github.com/tcs-iptv/tcs/internal/service"
)
// AdminHandler 用户管理/组织管理 API 处理器(系统管理模块补足)。
type AdminHandler struct {
admin *service.AdminService
}
// NewAdminHandler 创建用户/组织管理 API 处理器。
func NewAdminHandler(admin *service.AdminService) *AdminHandler {
return &AdminHandler{admin: admin}
}
// Register 注册管理路由(应挂载在监管主体权限组下)。
func (h *AdminHandler) Register(rg *gin.RouterGroup) {
// 组织管理
rg.POST("/admin/orgs", h.createOrg)
rg.PUT("/admin/orgs/:id", h.updateOrg)
rg.GET("/admin/orgs", h.listOrgs)
rg.GET("/admin/orgs/:id", h.getOrg)
rg.POST("/admin/orgs/:id/disable", h.disableOrg)
// 用户管理
rg.POST("/admin/users", h.createUser)
rg.PUT("/admin/users/:id", h.updateUser)
rg.GET("/admin/users", h.listUsers)
rg.GET("/admin/users/:id", h.getUser)
rg.POST("/admin/users/:id/disable", h.disableUser)
rg.POST("/admin/users/:id/reset-key", h.resetAPIKey)
}
// ---- 组织管理 handlers ----
func (h *AdminHandler) createOrg(c *gin.Context) {
var org model.Organization
if err := c.ShouldBindJSON(&org); err != nil {
httpx.Error(c, http.StatusBadRequest, "INVALID_REQUEST", err.Error())
return
}
result, err := h.admin.CreateOrg(org)
if err != nil {
httpx.Error(c, http.StatusBadRequest, "CREATE_ORG_FAILED", err.Error())
return
}
httpx.Created(c, result)
}
func (h *AdminHandler) updateOrg(c *gin.Context) {
orgID := c.Param("id")
var updates model.Organization
if err := c.ShouldBindJSON(&updates); err != nil {
httpx.Error(c, http.StatusBadRequest, "INVALID_REQUEST", err.Error())
return
}
result, err := h.admin.UpdateOrg(orgID, updates)
if err != nil {
httpx.Error(c, http.StatusBadRequest, "UPDATE_ORG_FAILED", err.Error())
return
}
httpx.OK(c, result)
}
func (h *AdminHandler) getOrg(c *gin.Context) {
orgID := c.Param("id")
org, err := h.admin.GetOrg(orgID)
if err != nil {
httpx.Error(c, http.StatusNotFound, "NOT_FOUND", err.Error())
return
}
httpx.OK(c, org)
}
func (h *AdminHandler) listOrgs(c *gin.Context) {
orgType := c.Query("type")
orgs := h.admin.ListOrgs(orgType)
httpx.OK(c, orgs)
}
func (h *AdminHandler) disableOrg(c *gin.Context) {
orgID := c.Param("id")
if err := h.admin.DisableOrg(orgID); err != nil {
httpx.Error(c, http.StatusBadRequest, "DISABLE_ORG_FAILED", err.Error())
return
}
httpx.OK(c, gin.H{"status": "disabled"})
}
// ---- 用户管理 handlers ----
func (h *AdminHandler) createUser(c *gin.Context) {
var user model.User
if err := c.ShouldBindJSON(&user); err != nil {
httpx.Error(c, http.StatusBadRequest, "INVALID_REQUEST", err.Error())
return
}
result, err := h.admin.CreateUser(user)
if err != nil {
httpx.Error(c, http.StatusBadRequest, "CREATE_USER_FAILED", err.Error())
return
}
httpx.Created(c, result)
}
func (h *AdminHandler) updateUser(c *gin.Context) {
userID := c.Param("id")
var updates model.User
if err := c.ShouldBindJSON(&updates); err != nil {
httpx.Error(c, http.StatusBadRequest, "INVALID_REQUEST", err.Error())
return
}
result, err := h.admin.UpdateUser(userID, updates)
if err != nil {
httpx.Error(c, http.StatusBadRequest, "UPDATE_USER_FAILED", err.Error())
return
}
httpx.OK(c, result)
}
func (h *AdminHandler) getUser(c *gin.Context) {
userID := c.Param("id")
user, err := h.admin.GetUser(userID)
if err != nil {
httpx.Error(c, http.StatusNotFound, "NOT_FOUND", err.Error())
return
}
httpx.OK(c, user)
}
func (h *AdminHandler) listUsers(c *gin.Context) {
orgID := c.Query("org_id")
role := c.Query("role")
users := h.admin.ListUsers(orgID, role)
httpx.OK(c, users)
}
func (h *AdminHandler) disableUser(c *gin.Context) {
userID := c.Param("id")
if err := h.admin.DisableUser(userID); err != nil {
httpx.Error(c, http.StatusBadRequest, "DISABLE_USER_FAILED", err.Error())
return
}
httpx.OK(c, gin.H{"status": "disabled"})
}
func (h *AdminHandler) resetAPIKey(c *gin.Context) {
userID := c.Param("id")
user, err := h.admin.ResetAPIKey(userID)
if err != nil {
httpx.Error(c, http.StatusBadRequest, "RESET_KEY_FAILED", err.Error())
return
}
httpx.OK(c, user)
}