Files
goalfylearning-admin/internal/api/handlers/goalfymax_user_handler.go

246 lines
6.2 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package handlers
import (
"goalfymax-admin/internal/models"
"goalfymax-admin/internal/services"
"goalfymax-admin/pkg/utils"
"strconv"
"github.com/gin-gonic/gin"
)
type GoalfyMaxUserHandler struct {
service services.GoalfyMaxUserService
response *utils.Response
}
func NewGoalfyMaxUserHandler(s services.GoalfyMaxUserService) *GoalfyMaxUserHandler {
return &GoalfyMaxUserHandler{service: s, response: utils.NewResponse()}
}
func (h *GoalfyMaxUserHandler) List(c *gin.Context) {
var req models.GoalfyMaxUserListRequest
if err := c.ShouldBindQuery(&req); err != nil {
h.response.ValidateError(c, err)
return
}
users, total, err := h.service.List(&req)
if err != nil {
h.response.InternalServerError(c, err.Error())
return
}
h.response.Success(c, gin.H{"users": users, "total": total, "page": req.Page, "size": req.Size})
}
func (h *GoalfyMaxUserHandler) GetByID(c *gin.Context) {
idStr := c.Param("id")
id64, err := strconv.ParseUint(idStr, 10, 32)
if err != nil {
h.response.BadRequest(c, "无效的ID")
return
}
user, err := h.service.GetByID(uint(id64))
if err != nil {
h.response.InternalServerError(c, err.Error())
return
}
h.response.Success(c, user)
}
func (h *GoalfyMaxUserHandler) Create(c *gin.Context) {
var req models.GoalfyMaxUserCreateRequest
if err := c.ShouldBindJSON(&req); err != nil {
h.response.ValidateError(c, err)
return
}
user, err := h.service.Create(&req)
if err != nil {
h.response.InternalServerError(c, err.Error())
return
}
h.response.Success(c, user)
}
func (h *GoalfyMaxUserHandler) Update(c *gin.Context) {
idStr := c.Param("id")
id64, err := strconv.ParseUint(idStr, 10, 32)
if err != nil {
h.response.BadRequest(c, "无效的ID")
return
}
var req models.GoalfyMaxUserUpdateRequest
if err := c.ShouldBindJSON(&req); err != nil {
h.response.ValidateError(c, err)
return
}
user, err := h.service.Update(uint(id64), &req)
if err != nil {
h.response.InternalServerError(c, err.Error())
return
}
h.response.Success(c, user)
}
func (h *GoalfyMaxUserHandler) Delete(c *gin.Context) {
idStr := c.Param("id")
id64, err := strconv.ParseUint(idStr, 10, 32)
if err != nil {
h.response.BadRequest(c, "无效的ID")
return
}
if err := h.service.Delete(uint(id64)); err != nil {
h.response.InternalServerError(c, err.Error())
return
}
h.response.Success(c, gin.H{"message": "删除成功"})
}
func (h *GoalfyMaxUserHandler) Ban(c *gin.Context) {
idStr := c.Param("id")
id64, err := strconv.ParseUint(idStr, 10, 32)
if err != nil {
h.response.BadRequest(c, "无效的ID")
return
}
var req models.GoalfyMaxUserBanRequest
if err := c.ShouldBindJSON(&req); err != nil {
h.response.ValidateError(c, err)
return
}
// 从上下文获取当前管理员ID
adminID := 0
if userID, exists := c.Get("user_id"); exists {
switch v := userID.(type) {
case int:
adminID = v
case uint:
adminID = int(v)
case string:
if parsedID, err := strconv.Atoi(v); err == nil {
adminID = parsedID
}
}
}
if err := h.service.Ban(uint(id64), &req, adminID); err != nil {
h.response.InternalServerError(c, err.Error())
return
}
h.response.Success(c, gin.H{"message": "封禁成功"})
}
func (h *GoalfyMaxUserHandler) Unban(c *gin.Context) {
idStr := c.Param("id")
id64, err := strconv.ParseUint(idStr, 10, 32)
if err != nil {
h.response.BadRequest(c, "无效的ID")
return
}
if err := h.service.Unban(uint(id64)); err != nil {
h.response.InternalServerError(c, err.Error())
return
}
h.response.Success(c, gin.H{"message": "解封成功"})
}
func (h *GoalfyMaxUserHandler) AddBalance(c *gin.Context) {
idStr := c.Param("id")
id64, err := strconv.ParseUint(idStr, 10, 32)
if err != nil {
h.response.BadRequest(c, "无效的ID")
return
}
var req models.GoalfyMaxUserAddBalanceRequest
if err := c.ShouldBindJSON(&req); err != nil {
h.response.ValidateError(c, err)
return
}
// 从上下文获取当前管理员信息
operatorID := 0
operatorEmail := "system@goalfy.com"
if userID, exists := c.Get("user_id"); exists {
switch v := userID.(type) {
case int:
operatorID = v
case uint:
operatorID = int(v)
case string:
if parsedID, err := strconv.Atoi(v); err == nil {
operatorID = parsedID
}
}
}
// 尝试获取用户邮箱从userInfo中获取
if userInfo, exists := c.Get("user"); exists {
if user, ok := userInfo.(*models.UserInfo); ok && user != nil {
if user.Email != "" {
operatorEmail = user.Email
} else if user.PreferredUsername != "" {
operatorEmail = user.PreferredUsername + "@goalfy.com"
}
}
}
// 获取IP地址和UserAgent
ipAddress := c.ClientIP()
userAgent := c.Request.UserAgent()
if err := h.service.AddBalance(uint(id64), &req, operatorID, operatorEmail, ipAddress, userAgent); err != nil {
h.response.InternalServerError(c, err.Error())
return
}
h.response.Success(c, gin.H{"message": "增加余额成功"})
}
func (h *GoalfyMaxUserHandler) DeductBalance(c *gin.Context) {
idStr := c.Param("id")
id64, err := strconv.ParseUint(idStr, 10, 32)
if err != nil {
h.response.BadRequest(c, "无效的ID")
return
}
var req models.GoalfyMaxUserAddBalanceRequest
if err := c.ShouldBindJSON(&req); err != nil {
h.response.ValidateError(c, err)
return
}
// 从上下文获取当前管理员信息
operatorID := 0
operatorEmail := "system@goalfy.com"
if userID, exists := c.Get("user_id"); exists {
switch v := userID.(type) {
case int:
operatorID = v
case uint:
operatorID = int(v)
case string:
if parsedID, err := strconv.Atoi(v); err == nil {
operatorID = parsedID
}
}
}
// 尝试获取用户邮箱从userInfo中获取
if userInfo, exists := c.Get("user"); exists {
if user, ok := userInfo.(*models.UserInfo); ok && user != nil {
if user.Email != "" {
operatorEmail = user.Email
} else if user.PreferredUsername != "" {
operatorEmail = user.PreferredUsername + "@goalfy.com"
}
}
}
// 获取IP地址和UserAgent
ipAddress := c.ClientIP()
userAgent := c.Request.UserAgent()
if err := h.service.DeductBalance(uint(id64), &req, operatorID, operatorEmail, ipAddress, userAgent); err != nil {
h.response.InternalServerError(c, err.Error())
return
}
h.response.Success(c, gin.H{"message": "减少余额成功"})
}