package admin import ( "github.com/break/junhong_cmp_fiber/internal/model" "github.com/break/junhong_cmp_fiber/internal/service/auth" "github.com/break/junhong_cmp_fiber/pkg/errors" "github.com/break/junhong_cmp_fiber/pkg/middleware" "github.com/break/junhong_cmp_fiber/pkg/response" "github.com/go-playground/validator/v10" "github.com/gofiber/fiber/v2" ) // AuthHandler 后台认证处理器 type AuthHandler struct { authService *auth.Service validator *validator.Validate } // NewAuthHandler 创建后台认证处理器 func NewAuthHandler(authService *auth.Service, validator *validator.Validate) *AuthHandler { return &AuthHandler{ authService: authService, validator: validator, } } // Login 后台登录 func (h *AuthHandler) Login(c *fiber.Ctx) error { var req model.LoginRequest if err := c.BodyParser(&req); err != nil { return errors.New(errors.CodeInvalidParam, "请求参数解析失败") } if err := h.validator.Struct(&req); err != nil { return errors.New(errors.CodeInvalidParam, "参数验证失败: "+err.Error()) } clientIP := c.IP() ctx := c.UserContext() resp, err := h.authService.Login(ctx, &req, clientIP) if err != nil { return err } return response.Success(c, resp) } // Logout 后台登出 func (h *AuthHandler) Logout(c *fiber.Ctx) error { auth := c.Get("Authorization") accessToken := "" if len(auth) > 7 && auth[:7] == "Bearer " { accessToken = auth[7:] } refreshToken := "" var req model.RefreshTokenRequest if err := c.BodyParser(&req); err == nil { refreshToken = req.RefreshToken } ctx := c.UserContext() if err := h.authService.Logout(ctx, accessToken, refreshToken); err != nil { return err } return response.Success(c, nil) } // RefreshToken 刷新访问令牌 func (h *AuthHandler) RefreshToken(c *fiber.Ctx) error { var req model.RefreshTokenRequest if err := c.BodyParser(&req); err != nil { return errors.New(errors.CodeInvalidParam, "请求参数解析失败") } if err := h.validator.Struct(&req); err != nil { return errors.New(errors.CodeInvalidParam, "参数验证失败: "+err.Error()) } ctx := c.UserContext() newAccessToken, err := h.authService.RefreshToken(ctx, req.RefreshToken) if err != nil { return err } resp := &model.RefreshTokenResponse{ AccessToken: newAccessToken, ExpiresIn: 86400, } return response.Success(c, resp) } // GetMe 获取当前用户信息 func (h *AuthHandler) GetMe(c *fiber.Ctx) error { userID := middleware.GetUserIDFromContext(c.UserContext()) if userID == 0 { return errors.New(errors.CodeUnauthorized, "未授权访问") } ctx := c.UserContext() userInfo, permissions, err := h.authService.GetCurrentUser(ctx, userID) if err != nil { return err } data := map[string]interface{}{ "user": userInfo, "permissions": permissions, } return response.Success(c, data) } // ChangePassword 修改密码 func (h *AuthHandler) ChangePassword(c *fiber.Ctx) error { userID := middleware.GetUserIDFromContext(c.UserContext()) if userID == 0 { return errors.New(errors.CodeUnauthorized, "未授权访问") } var req model.ChangePasswordRequest if err := c.BodyParser(&req); err != nil { return errors.New(errors.CodeInvalidParam, "请求参数解析失败") } if err := h.validator.Struct(&req); err != nil { return errors.New(errors.CodeInvalidParam, "参数验证失败: "+err.Error()) } ctx := c.UserContext() if err := h.authService.ChangePassword(ctx, userID, req.OldPassword, req.NewPassword); err != nil { return err } return response.Success(c, nil) }