Files
2026-06-25 08:39:47 +08:00

119 lines
3.3 KiB
Go

package handlers
import (
"net/http"
"strconv"
"github.com/gin-gonic/gin"
"github.com/inchstep/server/internal/middleware"
"github.com/inchstep/server/internal/services"
)
type AdminHandler struct {
adminSvc *services.AdminService
jwtSecret string
}
func NewAdminHandler(adminSvc *services.AdminService, jwtSecret string) *AdminHandler {
return &AdminHandler{adminSvc: adminSvc, jwtSecret: jwtSecret}
}
type adminLoginReq struct {
Username string `json:"username" binding:"required"`
Password string `json:"password" binding:"required"`
}
func (h *AdminHandler) Login(c *gin.Context) {
var req adminLoginReq
if err := c.ShouldBindJSON(&req); err != nil {
middleware.Error(c, http.StatusBadRequest, 400, "参数格式错误")
return
}
admin, err := h.adminSvc.Login(req.Username, req.Password)
if err != nil {
middleware.Error(c, http.StatusUnauthorized, 401, err.Error())
return
}
token, _ := middleware.GenerateToken(admin.ID, h.jwtSecret)
middleware.Success(c, gin.H{
"admin": admin,
"token": token,
})
}
func (h *AdminHandler) Dashboard(c *gin.Context) {
stats, err := h.adminSvc.GetDashboardStats()
if err != nil {
middleware.Error(c, http.StatusInternalServerError, 500, err.Error())
return
}
middleware.Success(c, stats)
}
func (h *AdminHandler) ListUsers(c *gin.Context) {
page, _ := strconv.Atoi(c.DefaultQuery("page", "1"))
pageSize, _ := strconv.Atoi(c.DefaultQuery("pageSize", "20"))
users, total, err := h.adminSvc.ListUsers(page, pageSize)
if err != nil {
middleware.Error(c, http.StatusInternalServerError, 500, err.Error())
return
}
middleware.Success(c, gin.H{"list": users, "total": total, "page": page})
}
func (h *AdminHandler) ListPosts(c *gin.Context) {
page, _ := strconv.Atoi(c.DefaultQuery("page", "1"))
pageSize, _ := strconv.Atoi(c.DefaultQuery("pageSize", "20"))
posts, total, err := h.adminSvc.ListPosts(page, pageSize)
if err != nil {
middleware.Error(c, http.StatusInternalServerError, 500, err.Error())
return
}
middleware.Success(c, gin.H{"list": posts, "total": total, "page": page})
}
func (h *AdminHandler) ListAdmins(c *gin.Context) {
admins, err := h.adminSvc.ListAdmins()
if err != nil {
middleware.Error(c, http.StatusInternalServerError, 500, err.Error())
return
}
middleware.Success(c, admins)
}
type createAdminReq struct {
Username string `json:"username" binding:"required"`
Password string `json:"password" binding:"required"`
Role string `json:"role"`
Nickname *string `json:"nickname"`
}
func (h *AdminHandler) CreateAdmin(c *gin.Context) {
var req createAdminReq
if err := c.ShouldBindJSON(&req); err != nil {
middleware.Error(c, http.StatusBadRequest, 400, "参数格式错误")
return
}
role := req.Role
if role == "" {
role = "admin"
}
admin, err := h.adminSvc.CreateAdmin(req.Username, req.Password, role, req.Nickname)
if err != nil {
middleware.Error(c, http.StatusConflict, 409, err.Error())
return
}
middleware.Success(c, admin)
}
func (h *AdminHandler) DisableAdmin(c *gin.Context) {
id := c.Param("id")
if err := h.adminSvc.DisableAdmin(id); err != nil {
middleware.Error(c, http.StatusInternalServerError, 500, err.Error())
return
}
middleware.Success(c, nil)
}