- Instance deployment: charts browser, deploy modal, instances list - Values Template version management (create/history/rollback) - Storage layered config (cluster > workspace > shared priority) - Cluster credential decryptIfNeeded for mixed encrypted/plaintext kubeconfig - YAML syntax validation (client-side + server-side warning) - Frontend: charts, instances, storage, templates, admin pages - Backend: storage service, instance service, cluster service, helm client - Multi-Tenant Kubeconfig.md: added by user
128 lines
3.6 KiB
Go
128 lines
3.6 KiB
Go
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 解析用户信息或从服务获取
|
|
|
|
// 返回响应 - 使用 respondSuccess 包装,与其他 API 保持一致
|
|
response := &dto.AuthResponse{
|
|
AccessToken: accessToken,
|
|
RefreshToken: refreshToken,
|
|
Username: req.Username,
|
|
}
|
|
|
|
respondSuccess(w, "Login successful", 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
|
|
}
|
|
|
|
// 返回响应 - 使用 respondSuccess 包装
|
|
response := &dto.AuthResponse{
|
|
AccessToken: newAccessToken,
|
|
RefreshToken: req.RefreshToken,
|
|
}
|
|
|
|
respondSuccess(w, "Token refreshed", response)
|
|
}
|