package handler import ( "net/http" "server/internal/middleware" "server/internal/model/common" "server/internal/model/request" "server/internal/pkg/errs" "server/internal/pkg/httputil" "server/internal/service" "time" ) type SysUserHandler struct { userService *service.SysUserService } func NewSysUserHandler(userService *service.SysUserService) *SysUserHandler { return &SysUserHandler{ userService: userService, } } func (h *SysUserHandler) Login(w http.ResponseWriter, r *http.Request) { var req request.LoginRequest if err := httputil.BindJson(r, &req); err != nil { httputil.Fail(w, errs.ErrInvalidCredentials) return } res, err := h.userService.Login(r.Context(), req) if err != nil { httputil.Fail(w, err) return } http.SetCookie(w, &http.Cookie{ Name: "refresh_token", Value: res.RefreshToken, Path: "/", HttpOnly: true, Secure: true, SameSite: http.SameSiteNoneMode, Expires: res.RefreshTokenExp, }) httputil.Ok(w, map[string]any{ "access_token": res.AccessToken, "access_token_exp": res.AccessTokenExp, }) } func (h *SysUserHandler) Logout(w http.ResponseWriter, r *http.Request) { http.SetCookie(w, &http.Cookie{ Name: "refresh_token", Value: "", Path: "/", HttpOnly: true, Secure: true, SameSite: http.SameSiteNoneMode, MaxAge: -1, Expires: time.Unix(0, 0), }) httputil.Ok(w) } func (h *SysUserHandler) RefreshToken(w http.ResponseWriter, r *http.Request) { cookie, err := r.Cookie("refresh_token") if err != nil { httputil.Fail(w, errs.ErrInvalidRefreshToken) return } res, err := h.userService.RefreshToken(r.Context(), cookie.Value) if err != nil { httputil.Fail(w, err) return } httputil.Ok(w, map[string]any{ "access_token": res.AccessToken, "access_token_exp": res.AccessTokenExp, }) } func (h *SysUserHandler) ListPage(w http.ResponseWriter, r *http.Request) { pagination := httputil.Pagination(r) list, total, err := h.userService.ListPage(r.Context(), pagination) if err != nil { httputil.Fail(w, err) return } resp := common.PageResponse{ Page: pagination.Page, PageSize: pagination.PageSize, List: list, Total: total, } httputil.OkWithPage(w, &resp) } func (h *SysUserHandler) GetUserInfo(w http.ResponseWriter, r *http.Request) { claims, ok := middleware.GetClaims(r.Context()) if !ok || claims.UserID == 0 { httputil.Fail(w, errs.ErrUnauthorized) return } isAdmin, _ := r.Context().Value(middleware.IsAdminKey).(bool) uid := claims.UserID user, err := h.userService.GetUserInfo(r.Context(), uid, isAdmin) if err != nil { httputil.Fail(w, err) return } httputil.Ok(w, user) } func (h *SysUserHandler) GetRoles(w http.ResponseWriter, r *http.Request) { id, err := httputil.URLParamInt32(r, "id") if err != nil { httputil.Fail(w, err) return } list, err := h.userService.GetRoles(r.Context(), id) if err != nil { httputil.Fail(w, err) return } httputil.Ok(w, list) } func (h *SysUserHandler) Create(w http.ResponseWriter, r *http.Request) { var req request.CreateSysUserRequest 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 *SysUserHandler) Update(w http.ResponseWriter, r *http.Request) { var req request.UpdateSysUserRequest 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 *SysUserHandler) SetRoles(w http.ResponseWriter, r *http.Request) { var req request.SetSysUserRolesRequest 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 *SysUserHandler) UpdatePassword(w http.ResponseWriter, r *http.Request) { var req request.UpdateSysUserPassword 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 *SysUserHandler) 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) }