Files
MeBox/internal/handler/permission_handler.go
T
truewhile 44ca451cd4 优化
优化
2026-08-24 17:40:43 +08:00

154 lines
4.7 KiB
Go

// Package handler — 权限相关 HTTP Handler。
package handler
import (
"net/http"
"github.com/gin-gonic/gin"
"go.uber.org/zap"
"github.com/ShukeBta/MMTL/internal/middleware"
"github.com/ShukeBta/MMTL/internal/model"
"github.com/ShukeBta/MMTL/internal/service"
)
// PermissionHandler 权限相关 HTTP 处理。
type PermissionHandler struct {
svc *service.Container
log *zap.Logger
}
// NewPermissionHandler 创建权限处理器。
func NewPermissionHandler(svc *service.Container, log *zap.Logger) *PermissionHandler {
return &PermissionHandler{svc: svc, log: log}
}
// GetUserPermissions 获取指定用户的权限(管理员)。
// GET /api/users/:id/permissions
func (h *PermissionHandler) GetUserPermissions(c *gin.Context) {
userID := c.Param("id")
if userID == "" {
c.JSON(http.StatusBadRequest, gin.H{"code": 40001, "message": "user id required", "data": nil})
return
}
// 权限检查:需要管理员权限
role := middleware.GetUserRole(c)
if role != "admin" {
c.JSON(http.StatusForbidden, gin.H{"code": 40301, "message": "admin only", "data": nil})
return
}
perms, err := h.svc.Permissions.Effective(c.Request.Context(), userID)
if err != nil {
h.log.Error("get user permissions failed", zap.Error(err))
c.JSON(http.StatusInternalServerError, gin.H{"code": 50001, "message": "internal error", "data": nil})
return
}
c.JSON(http.StatusOK, gin.H{"code": 0, "data": perms, "message": "ok"})
}
// UpdateUserPermissions 更新指定用户的权限(管理员)。
// PUT /api/users/:id/permissions
func (h *PermissionHandler) UpdateUserPermissions(c *gin.Context) {
userID := c.Param("id")
if userID == "" {
c.JSON(http.StatusBadRequest, gin.H{"code": 40001, "message": "user id required", "data": nil})
return
}
// 权限检查:需要管理员权限
role := middleware.GetUserRole(c)
if role != "admin" {
c.JSON(http.StatusForbidden, gin.H{"code": 40301, "message": "admin only", "data": nil})
return
}
var req model.UserPermission
if err := c.ShouldBindJSON(&req); err != nil {
c.JSON(http.StatusBadRequest, gin.H{"code": 40001, "message": "invalid request", "data": nil})
return
}
if err := h.svc.Permissions.Save(c.Request.Context(), userID, &req); err != nil {
h.log.Error("update user permissions failed", zap.Error(err), zap.String("user_id", userID))
c.JSON(http.StatusInternalServerError, gin.H{"code": 50001, "message": "internal error", "data": nil})
return
}
c.JSON(http.StatusOK, gin.H{"code": 0, "message": "permissions updated", "data": nil})
}
// ResetUserPermissions 重置指定用户的权限为默认值(管理员)。
// POST /api/users/:id/permissions/reset
func (h *PermissionHandler) ResetUserPermissions(c *gin.Context) {
userID := c.Param("id")
if userID == "" {
c.JSON(http.StatusBadRequest, gin.H{"code": 40001, "message": "user id required", "data": nil})
return
}
// 权限检查:需要管理员权限
role := middleware.GetUserRole(c)
if role != "admin" {
c.JSON(http.StatusForbidden, gin.H{"code": 40301, "message": "admin only", "data": nil})
return
}
if _, err := h.svc.Permissions.Reset(c.Request.Context(), userID); err != nil {
h.log.Error("reset user permissions failed", zap.Error(err), zap.String("user_id", userID))
c.JSON(http.StatusInternalServerError, gin.H{"code": 50001, "message": "internal error", "data": nil})
return
}
c.JSON(http.StatusOK, gin.H{"code": 0, "message": "permissions reset to default", "data": nil})
}
// GetMyPermissions 获取当前用户的权限。
// GET /api/auth/permissions
func (h *PermissionHandler) GetMyPermissions(c *gin.Context) {
currentUserID := middleware.GetUserID(c)
if currentUserID == "" {
c.JSON(http.StatusUnauthorized, gin.H{"code": 40101, "message": "authentication required", "data": nil})
return
}
perms, err := h.svc.Permissions.Effective(c.Request.Context(), currentUserID)
if err != nil {
if service.IsTransientDatabaseLock(err) {
role := middleware.GetUserRole(c)
tier := middleware.GetUserTier(c)
c.JSON(http.StatusOK, gin.H{
"code": 0,
"message": "ok",
"data": gin.H{
"permissions": service.FallbackPermissions(currentUserID, role),
"role": role,
"tier": tier,
"is_super": role == "admin" || tier == "plus",
},
})
return
}
h.log.Error("get my permissions failed", zap.Error(err))
c.JSON(http.StatusInternalServerError, gin.H{"code": 50001, "message": "internal error", "data": nil})
return
}
// 同时返回角色和等级信息
role := middleware.GetUserRole(c)
tier := middleware.GetUserTier(c)
c.JSON(http.StatusOK, gin.H{
"code": 0,
"message": "ok",
"data": gin.H{
"permissions": perms,
"role": role,
"tier": tier,
"is_super": role == "admin" || tier == "plus",
},
})
}