Files
2026-08-19 22:05:49 +08:00

224 lines
4.4 KiB
Go

package admin
import (
"net/http"
"server/internal/middleware"
"server/internal/model/common"
"server/internal/model/request"
"server/internal/pkg/errs"
"server/internal/pkg/httputil"
"server/internal/router"
"server/internal/service/admin"
"github.com/go-chi/chi/v5"
)
type UserHandler struct {
userService *admin.UserService
}
// 编译期接口断言
var _ router.Registrar = (*UserHandler)(nil)
func NewUserHandler(userService *admin.UserService) *UserHandler {
return &UserHandler{
userService: userService,
}
}
func (h *UserHandler) Register(r chi.Router) {
r.Route("/users", func(r chi.Router) {
r.Get("/", h.List)
r.Get("/me", h.GetCurrentUser)
r.Get("/{id}/roles", h.ListRoles)
r.Post("/", h.Create)
r.Post("/{id}/logout-all", h.KickUser)
r.Post("/logout-all", h.KickAllUsers)
r.Patch("/{id}", h.Update)
r.Put("/{id}/roles", h.SetRoles)
r.Patch("/{id}/password", h.UpdatePassword)
r.Delete("/{id}", h.Delete)
})
}
func (h *UserHandler) GetCurrentUser(w http.ResponseWriter, r *http.Request) {
userCtx := middleware.GetUserContext(r.Context())
if userCtx == nil || userCtx.UserID == 0 {
httputil.Fail(w, errs.ErrUnauthorized)
return
}
user, err := h.userService.GetCurrentUser(r.Context(), userCtx.UserID, userCtx.IsAdmin)
if err != nil {
httputil.Fail(w, err)
return
}
httputil.Ok(w, user)
}
func (h *UserHandler) List(w http.ResponseWriter, r *http.Request) {
pagination := httputil.Pagination(r)
params := request.SearchUserParams{
Pagination: *pagination,
Username: r.URL.Query().Get("username"),
}
result, err := h.userService.List(r.Context(), params)
if err != nil {
httputil.Fail(w, err)
return
}
resp := common.PageResponse{
Page: pagination.Page,
PageSize: pagination.PageSize,
List: result.List,
Total: result.Total,
}
httputil.OkWithPage(w, &resp)
}
func (h *UserHandler) ListRoles(w http.ResponseWriter, r *http.Request) {
id, err := httputil.URLParamInt32(r, "id")
if err != nil {
httputil.Fail(w, err)
return
}
list, err := h.userService.ListRoles(r.Context(), id)
if err != nil {
httputil.Fail(w, err)
return
}
httputil.Ok(w, list)
}
func (h *UserHandler) Create(w http.ResponseWriter, r *http.Request) {
var req request.CreateUserRequest
if err := httputil.BindJson(w, r, &req); err != nil {
httputil.Fail(w, err)
return
}
if err := h.userService.Create(r.Context(), req); err != nil {
httputil.Fail(w, err)
return
}
httputil.Ok(w)
}
func (h *UserHandler) KickUser(w http.ResponseWriter, r *http.Request) {
id, err := httputil.URLParamInt32(r, "id")
if err != nil {
httputil.Fail(w, err)
return
}
err = h.userService.KickUser(r.Context(), id)
if err != nil {
httputil.Fail(w, err)
return
}
httputil.Ok(w)
}
func (h *UserHandler) KickAllUsers(w http.ResponseWriter, r *http.Request) {
err := h.userService.KickAllUsers(r.Context())
if err != nil {
httputil.Fail(w, err)
return
}
httputil.Ok(w)
}
func (h *UserHandler) Update(w http.ResponseWriter, r *http.Request) {
var req request.UpdateUserRequest
id, err := httputil.URLParamInt32(r, "id")
if err != nil {
httputil.Fail(w, err)
return
}
if err = httputil.BindJson(w, r, &req); err != nil {
httputil.Fail(w, err)
return
}
if err = h.userService.Update(r.Context(), id, req); err != nil {
httputil.Fail(w, err)
return
}
httputil.Ok(w)
}
func (h *UserHandler) SetRoles(w http.ResponseWriter, r *http.Request) {
var req request.SetUserRolesRequest
id, err := httputil.URLParamInt32(r, "id")
if err != nil {
httputil.Fail(w, err)
return
}
if err = httputil.BindJson(w, r, &req); err != nil {
httputil.Fail(w, err)
return
}
if err = h.userService.SetRoles(r.Context(), id, req); err != nil {
httputil.Fail(w, err)
return
}
httputil.Ok(w)
}
func (h *UserHandler) UpdatePassword(w http.ResponseWriter, r *http.Request) {
var req request.UpdateUserPassword
id, err := httputil.URLParamInt32(r, "id")
if err != nil {
httputil.Fail(w, err)
return
}
if err = httputil.BindJson(w, r, &req); err != nil {
httputil.Fail(w, err)
return
}
if err = h.userService.UpdatePassword(r.Context(), id, req); err != nil {
httputil.Fail(w, err)
return
}
httputil.Ok(w)
}
func (h *UserHandler) Delete(w http.ResponseWriter, r *http.Request) {
id, err := httputil.URLParamInt32(r, "id")
if err != nil {
httputil.Fail(w, err)
return
}
if err = h.userService.Delete(r.Context(), id); err != nil {
httputil.Fail(w, err)
return
}
httputil.Ok(w)
}