281 lines
9.7 KiB
Go
281 lines
9.7 KiB
Go
package handlers
|
||
|
||
import (
|
||
"github.com/gin-gonic/gin"
|
||
"go.uber.org/zap"
|
||
|
||
"tyapi-server/internal/application/admin"
|
||
"tyapi-server/internal/application/admin/dto/commands"
|
||
"tyapi-server/internal/application/admin/dto/queries"
|
||
"tyapi-server/internal/shared/interfaces"
|
||
)
|
||
|
||
// AdminHandler 管理员HTTP处理器
|
||
type AdminHandler struct {
|
||
appService admin.AdminApplicationService
|
||
responseBuilder interfaces.ResponseBuilder
|
||
logger *zap.Logger
|
||
}
|
||
|
||
// NewAdminHandler 创建管理员HTTP处理器
|
||
func NewAdminHandler(
|
||
appService admin.AdminApplicationService,
|
||
responseBuilder interfaces.ResponseBuilder,
|
||
logger *zap.Logger,
|
||
) *AdminHandler {
|
||
return &AdminHandler{
|
||
appService: appService,
|
||
responseBuilder: responseBuilder,
|
||
logger: logger,
|
||
}
|
||
}
|
||
|
||
// Login 管理员登录
|
||
// @Summary 管理员登录
|
||
// @Description 使用用户名和密码进行管理员登录,返回JWT令牌
|
||
// @Tags 管理员认证
|
||
// @Accept json
|
||
// @Produce json
|
||
// @Param request body commands.AdminLoginCommand true "管理员登录请求"
|
||
// @Success 200 {object} responses.AdminLoginResponse "登录成功"
|
||
// @Failure 400 {object} map[string]interface{} "请求参数错误"
|
||
// @Failure 401 {object} map[string]interface{} "用户名或密码错误"
|
||
// @Failure 500 {object} map[string]interface{} "服务器内部错误"
|
||
// @Router /api/v1/admin/auth/login [post]
|
||
func (h *AdminHandler) Login(c *gin.Context) {
|
||
var cmd commands.AdminLoginCommand
|
||
if err := c.ShouldBindJSON(&cmd); err != nil {
|
||
h.responseBuilder.BadRequest(c, "请求参数错误")
|
||
return
|
||
}
|
||
|
||
response, err := h.appService.Login(c.Request.Context(), &cmd)
|
||
if err != nil {
|
||
h.logger.Error("管理员登录失败", zap.Error(err))
|
||
h.responseBuilder.Unauthorized(c, err.Error())
|
||
return
|
||
}
|
||
|
||
h.responseBuilder.Success(c, response, "登录成功")
|
||
}
|
||
|
||
// CreateAdmin 创建管理员
|
||
// @Summary 创建管理员
|
||
// @Description 创建新的管理员账户,需要超级管理员权限
|
||
// @Tags 管理员管理
|
||
// @Accept json
|
||
// @Produce json
|
||
// @Security Bearer
|
||
// @Param request body commands.CreateAdminCommand true "创建管理员请求"
|
||
// @Success 201 {object} map[string]interface{} "管理员创建成功"
|
||
// @Failure 400 {object} map[string]interface{} "请求参数错误"
|
||
// @Failure 401 {object} map[string]interface{} "未认证"
|
||
// @Failure 403 {object} map[string]interface{} "权限不足"
|
||
// @Failure 500 {object} map[string]interface{} "服务器内部错误"
|
||
// @Router /api/v1/admin [post]
|
||
func (h *AdminHandler) CreateAdmin(c *gin.Context) {
|
||
var cmd commands.CreateAdminCommand
|
||
if err := c.ShouldBindJSON(&cmd); err != nil {
|
||
h.responseBuilder.BadRequest(c, "请求参数错误")
|
||
return
|
||
}
|
||
cmd.OperatorID = h.getCurrentAdminID(c)
|
||
|
||
if err := h.appService.CreateAdmin(c.Request.Context(), &cmd); err != nil {
|
||
h.logger.Error("创建管理员失败", zap.Error(err))
|
||
h.responseBuilder.BadRequest(c, err.Error())
|
||
return
|
||
}
|
||
|
||
h.responseBuilder.Created(c, nil, "管理员创建成功")
|
||
}
|
||
|
||
// UpdateAdmin 更新管理员
|
||
// @Summary 更新管理员信息
|
||
// @Description 更新指定管理员的基本信息
|
||
// @Tags 管理员管理
|
||
// @Accept json
|
||
// @Produce json
|
||
// @Security Bearer
|
||
// @Param id path string true "管理员ID"
|
||
// @Param request body commands.UpdateAdminCommand true "更新管理员请求"
|
||
// @Success 200 {object} map[string]interface{} "管理员更新成功"
|
||
// @Failure 400 {object} map[string]interface{} "请求参数错误"
|
||
// @Failure 401 {object} map[string]interface{} "未认证"
|
||
// @Failure 403 {object} map[string]interface{} "权限不足"
|
||
// @Failure 404 {object} map[string]interface{} "管理员不存在"
|
||
// @Failure 500 {object} map[string]interface{} "服务器内部错误"
|
||
// @Router /api/v1/admin/{id} [put]
|
||
func (h *AdminHandler) UpdateAdmin(c *gin.Context) {
|
||
var cmd commands.UpdateAdminCommand
|
||
if err := c.ShouldBindJSON(&cmd); err != nil {
|
||
h.responseBuilder.BadRequest(c, "请求参数错误")
|
||
return
|
||
}
|
||
cmd.AdminID = c.Param("id")
|
||
cmd.OperatorID = h.getCurrentAdminID(c)
|
||
|
||
if err := h.appService.UpdateAdmin(c.Request.Context(), &cmd); err != nil {
|
||
h.logger.Error("更新管理员失败", zap.Error(err))
|
||
h.responseBuilder.BadRequest(c, err.Error())
|
||
return
|
||
}
|
||
|
||
h.responseBuilder.Success(c, nil, "管理员更新成功")
|
||
}
|
||
|
||
// ChangePassword 修改密码
|
||
// @Summary 修改管理员密码
|
||
// @Description 修改当前登录管理员的密码
|
||
// @Tags 管理员管理
|
||
// @Accept json
|
||
// @Produce json
|
||
// @Security Bearer
|
||
// @Param request body commands.ChangeAdminPasswordCommand true "修改密码请求"
|
||
// @Success 200 {object} map[string]interface{} "密码修改成功"
|
||
// @Failure 400 {object} map[string]interface{} "请求参数错误"
|
||
// @Failure 401 {object} map[string]interface{} "未认证"
|
||
// @Failure 500 {object} map[string]interface{} "服务器内部错误"
|
||
// @Router /api/v1/admin/change-password [post]
|
||
func (h *AdminHandler) ChangePassword(c *gin.Context) {
|
||
var cmd commands.ChangeAdminPasswordCommand
|
||
if err := c.ShouldBindJSON(&cmd); err != nil {
|
||
h.responseBuilder.BadRequest(c, "请求参数错误")
|
||
return
|
||
}
|
||
cmd.AdminID = h.getCurrentAdminID(c)
|
||
|
||
if err := h.appService.ChangePassword(c.Request.Context(), &cmd); err != nil {
|
||
h.logger.Error("修改密码失败", zap.Error(err))
|
||
h.responseBuilder.BadRequest(c, err.Error())
|
||
return
|
||
}
|
||
|
||
h.responseBuilder.Success(c, nil, "密码修改成功")
|
||
}
|
||
|
||
// ListAdmins 获取管理员列表
|
||
// @Summary 获取管理员列表
|
||
// @Description 分页获取管理员列表,支持搜索和筛选
|
||
// @Tags 管理员管理
|
||
// @Accept json
|
||
// @Produce json
|
||
// @Security Bearer
|
||
// @Param page query int false "页码" default(1)
|
||
// @Param size query int false "每页数量" default(10)
|
||
// @Param keyword query string false "搜索关键词"
|
||
// @Param status query string false "状态筛选"
|
||
// @Success 200 {object} responses.AdminListResponse "获取管理员列表成功"
|
||
// @Failure 400 {object} map[string]interface{} "请求参数错误"
|
||
// @Failure 401 {object} map[string]interface{} "未认证"
|
||
// @Failure 500 {object} map[string]interface{} "服务器内部错误"
|
||
// @Router /api/v1/admin [get]
|
||
func (h *AdminHandler) ListAdmins(c *gin.Context) {
|
||
var query queries.ListAdminsQuery
|
||
if err := c.ShouldBindQuery(&query); err != nil {
|
||
h.responseBuilder.BadRequest(c, "请求参数错误")
|
||
return
|
||
}
|
||
|
||
response, err := h.appService.ListAdmins(c.Request.Context(), &query)
|
||
if err != nil {
|
||
h.logger.Error("获取管理员列表失败", zap.Error(err))
|
||
h.responseBuilder.InternalError(c, "获取管理员列表失败")
|
||
return
|
||
}
|
||
|
||
h.responseBuilder.Success(c, response, "获取管理员列表成功")
|
||
}
|
||
|
||
// GetAdminByID 根据ID获取管理员
|
||
// @Summary 获取管理员详情
|
||
// @Description 根据管理员ID获取详细信息
|
||
// @Tags 管理员管理
|
||
// @Accept json
|
||
// @Produce json
|
||
// @Security Bearer
|
||
// @Param id path string true "管理员ID"
|
||
// @Success 200 {object} responses.AdminInfoResponse "获取管理员详情成功"
|
||
// @Failure 400 {object} map[string]interface{} "请求参数错误"
|
||
// @Failure 401 {object} map[string]interface{} "未认证"
|
||
// @Failure 404 {object} map[string]interface{} "管理员不存在"
|
||
// @Failure 500 {object} map[string]interface{} "服务器内部错误"
|
||
// @Router /api/v1/admin/{id} [get]
|
||
func (h *AdminHandler) GetAdminByID(c *gin.Context) {
|
||
var query queries.GetAdminInfoQuery
|
||
if err := c.ShouldBindUri(&query); err != nil {
|
||
h.responseBuilder.BadRequest(c, "请求参数错误")
|
||
return
|
||
}
|
||
|
||
admin, err := h.appService.GetAdminByID(c.Request.Context(), &query)
|
||
if err != nil {
|
||
h.logger.Error("获取管理员详情失败", zap.Error(err))
|
||
h.responseBuilder.NotFound(c, err.Error())
|
||
return
|
||
}
|
||
|
||
h.responseBuilder.Success(c, admin, "获取管理员详情成功")
|
||
}
|
||
|
||
// DeleteAdmin 删除管理员
|
||
// @Summary 删除管理员
|
||
// @Description 删除指定的管理员账户
|
||
// @Tags 管理员管理
|
||
// @Accept json
|
||
// @Produce json
|
||
// @Security Bearer
|
||
// @Param id path string true "管理员ID"
|
||
// @Success 200 {object} map[string]interface{} "管理员删除成功"
|
||
// @Failure 400 {object} map[string]interface{} "请求参数错误"
|
||
// @Failure 401 {object} map[string]interface{} "未认证"
|
||
// @Failure 403 {object} map[string]interface{} "权限不足"
|
||
// @Failure 404 {object} map[string]interface{} "管理员不存在"
|
||
// @Failure 500 {object} map[string]interface{} "服务器内部错误"
|
||
// @Router /api/v1/admin/{id} [delete]
|
||
func (h *AdminHandler) DeleteAdmin(c *gin.Context) {
|
||
var cmd commands.DeleteAdminCommand
|
||
cmd.AdminID = c.Param("id")
|
||
cmd.OperatorID = h.getCurrentAdminID(c)
|
||
|
||
if err := h.appService.DeleteAdmin(c.Request.Context(), &cmd); err != nil {
|
||
h.logger.Error("删除管理员失败", zap.Error(err))
|
||
h.responseBuilder.BadRequest(c, err.Error())
|
||
return
|
||
}
|
||
|
||
h.responseBuilder.Success(c, nil, "管理员删除成功")
|
||
}
|
||
|
||
// GetAdminStats 获取管理员统计信息
|
||
// @Summary 获取管理员统计信息
|
||
// @Description 获取管理员相关的统计数据
|
||
// @Tags 管理员管理
|
||
// @Accept json
|
||
// @Produce json
|
||
// @Security Bearer
|
||
// @Success 200 {object} responses.AdminStatsResponse "获取统计信息成功"
|
||
// @Failure 401 {object} map[string]interface{} "未认证"
|
||
// @Failure 500 {object} map[string]interface{} "服务器内部错误"
|
||
// @Router /api/v1/admin/stats [get]
|
||
func (h *AdminHandler) GetAdminStats(c *gin.Context) {
|
||
stats, err := h.appService.GetAdminStats(c.Request.Context())
|
||
if err != nil {
|
||
h.logger.Error("获取管理员统计失败", zap.Error(err))
|
||
h.responseBuilder.InternalError(c, "获取统计信息失败")
|
||
return
|
||
}
|
||
|
||
h.responseBuilder.Success(c, stats, "获取统计信息成功")
|
||
}
|
||
|
||
// getCurrentAdminID 获取当前管理员ID
|
||
func (h *AdminHandler) getCurrentAdminID(c *gin.Context) string {
|
||
if userID, exists := c.Get("user_id"); exists {
|
||
if id, ok := userID.(string); ok {
|
||
return id
|
||
}
|
||
}
|
||
return ""
|
||
}
|