package rest import ( "encoding/json" "net/http" "github.com/ocdp/cluster-service/internal/adapter/input/http/dto" "github.com/ocdp/cluster-service/internal/domain/service" ) // AuthHandler 认证 Handler type AuthHandler struct { authService *service.AuthService } // NewAuthHandler 创建认证 Handler func NewAuthHandler(authService *service.AuthService) *AuthHandler { return &AuthHandler{ authService: authService, } } // Register 用户注册 // @Summary 用户注册 // @Description 创建一个新的后台用户 // @Tags Auth // @Accept json // @Produce json // @Param request body dto.RegisterRequest true "注册信息" // @Success 201 {object} dto.UserResponse // @Failure 400 {object} dto.ErrorResponse // @Router /auth/register [post] func (h *AuthHandler) Register(w http.ResponseWriter, r *http.Request) { var req dto.RegisterRequest if err := json.NewDecoder(r.Body).Decode(&req); err != nil { respondError(w, http.StatusBadRequest, "Invalid request body", err.Error()) return } // 调用领域服务 user, err := h.authService.Register(r.Context(), req.Username, req.Password) if err != nil { respondError(w, http.StatusBadRequest, "Registration failed", err.Error()) return } // 返回响应 response := &dto.UserResponse{ ID: user.ID, Username: user.Username, Email: user.Email, CreatedAt: user.CreatedAt.Format("2006-01-02T15:04:05Z07:00"), UpdatedAt: user.UpdatedAt.Format("2006-01-02T15:04:05Z07:00"), } respondJSON(w, http.StatusCreated, response) } // Login 用户登录 // @Summary 用户登录 // @Description 使用用户名和密码获取访问令牌 // @Tags Auth // @Accept json // @Produce json // @Param request body dto.LoginRequest true "登录信息" // @Success 200 {object} dto.AuthResponse // @Failure 401 {object} dto.ErrorResponse // @Router /auth/login [post] func (h *AuthHandler) Login(w http.ResponseWriter, r *http.Request) { var req dto.LoginRequest if err := json.NewDecoder(r.Body).Decode(&req); err != nil { respondError(w, http.StatusBadRequest, "Invalid request body", err.Error()) return } // 调用领域服务 accessToken, refreshToken, err := h.authService.Login(r.Context(), req.Username, req.Password) if err != nil { respondError(w, http.StatusUnauthorized, "Login failed", err.Error()) return } // 获取用户信息 // TODO: 从 token 解析用户信息或从服务获取 // 返回响应 response := &dto.AuthResponse{ AccessToken: accessToken, RefreshToken: refreshToken, Username: req.Username, } respondJSON(w, http.StatusOK, response) } // RefreshToken 刷新 Token // @Summary 刷新访问令牌 // @Description 使用刷新令牌获取新的访问令牌 // @Tags Auth // @Accept json // @Produce json // @Param request body dto.RefreshTokenRequest true "刷新令牌" // @Success 200 {object} dto.AuthResponse // @Failure 401 {object} dto.ErrorResponse // @Router /auth/refresh [post] func (h *AuthHandler) RefreshToken(w http.ResponseWriter, r *http.Request) { var req dto.RefreshTokenRequest if err := json.NewDecoder(r.Body).Decode(&req); err != nil { respondError(w, http.StatusBadRequest, "Invalid request body", err.Error()) return } // 调用领域服务 newAccessToken, err := h.authService.RefreshToken(r.Context(), req.RefreshToken) if err != nil { respondError(w, http.StatusUnauthorized, "Token refresh failed", err.Error()) return } // 返回响应 response := &dto.AuthResponse{ AccessToken: newAccessToken, RefreshToken: req.RefreshToken, } respondJSON(w, http.StatusOK, response) }