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.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) { claims, ok := middleware.GetClaims(r.Context()) if !ok || claims.UserID == 0 { httputil.Fail(w, errs.ErrUnauthorized) return } isAdmin := middleware.IsAdmin(r.Context()) uid := claims.UserID user, err := h.userService.GetCurrentUser(r.Context(), uid, 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(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) 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(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(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(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) }