package handlers import ( "encoding/json" "net/http" "git.kirlllll.ru/volontery/backend/internal/api/middleware" "git.kirlllll.ru/volontery/backend/internal/service" ) // AuthHandler обрабатывает запросы аутентификации type AuthHandler struct { authService *service.AuthService } // NewAuthHandler создает новый AuthHandler func NewAuthHandler(authService *service.AuthService) *AuthHandler { return &AuthHandler{ authService: authService, } } // Register обрабатывает регистрацию пользователя // POST /api/v1/auth/register func (h *AuthHandler) Register(w http.ResponseWriter, r *http.Request) { var req service.RegisterRequest if err := json.NewDecoder(r.Body).Decode(&req); err != nil { respondError(w, http.StatusBadRequest, "invalid request body") return } resp, err := h.authService.Register(r.Context(), req) if err != nil { respondError(w, http.StatusBadRequest, err.Error()) return } respondJSON(w, http.StatusCreated, resp) } // Login обрабатывает вход пользователя // POST /api/v1/auth/login func (h *AuthHandler) Login(w http.ResponseWriter, r *http.Request) { var req service.LoginRequest if err := json.NewDecoder(r.Body).Decode(&req); err != nil { respondError(w, http.StatusBadRequest, "invalid request body") return } resp, err := h.authService.Login(r.Context(), req) if err != nil { respondError(w, http.StatusUnauthorized, err.Error()) return } respondJSON(w, http.StatusOK, resp) } // RefreshToken обрабатывает обновление токенов // POST /api/v1/auth/refresh func (h *AuthHandler) RefreshToken(w http.ResponseWriter, r *http.Request) { var req struct { RefreshToken string `json:"refresh_token"` } if err := json.NewDecoder(r.Body).Decode(&req); err != nil { respondError(w, http.StatusBadRequest, "invalid request body") return } if req.RefreshToken == "" { respondError(w, http.StatusBadRequest, "refresh_token is required") return } resp, err := h.authService.RefreshTokens(r.Context(), req.RefreshToken) if err != nil { respondError(w, http.StatusUnauthorized, err.Error()) return } respondJSON(w, http.StatusOK, resp) } // Logout обрабатывает выход пользователя // POST /api/v1/auth/logout func (h *AuthHandler) Logout(w http.ResponseWriter, r *http.Request) { userID, ok := middleware.GetUserIDFromContext(r.Context()) if !ok { respondError(w, http.StatusUnauthorized, "unauthorized") return } if err := h.authService.Logout(r.Context(), userID); err != nil { respondError(w, http.StatusInternalServerError, "failed to logout") return } respondJSON(w, http.StatusOK, map[string]string{"message": "logged out successfully"}) } // Me возвращает информацию о текущем пользователе // GET /api/v1/auth/me func (h *AuthHandler) Me(w http.ResponseWriter, r *http.Request) { userID, ok := middleware.GetUserIDFromContext(r.Context()) if !ok { respondError(w, http.StatusUnauthorized, "unauthorized") return } email, _ := middleware.GetUserEmailFromContext(r.Context()) respondJSON(w, http.StatusOK, map[string]interface{}{ "id": userID, "email": email, }) }