/
DexScen
/
ProjectPOH
Обзор
Документация
Войти
/
DexScen
/
ProjectPOH
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
backend/internal/auth/handler.go
117 строк
3 KB
Александр
initial prototype ready
29 апр 2026, 06:02
29 апр 2026, 06:02
7af145a
Код
Авторство
О чём код?
package auth import ( "errors" "net/http" "github.com/DexScen/projectpoh/backend/internal/domainerr" "github.com/DexScen/projectpoh/backend/internal/httpapi" ) type Handler struct { service *Service } func NewHandler(service *Service) *Handler { return &Handler{service: service} } func (h *Handler) RegisterRoutes(mux *http.ServeMux) { mux.HandleFunc("POST /api/v1/auth/register", h.register) mux.HandleFunc("POST /api/v1/auth/login", h.login) mux.HandleFunc("POST /api/v1/auth/refresh", h.refresh) mux.Handle("POST /api/v1/auth/logout", h.service.AuthMiddleware(http.HandlerFunc(h.logout))) mux.Handle("GET /api/v1/auth/me", h.service.AuthMiddleware(http.HandlerFunc(h.me))) } func (h *Handler) register(w http.ResponseWriter, r *http.Request) { var in RegisterInput if err := httpapi.ReadJSON(r, &in); err != nil { httpapi.WriteError(w, http.StatusBadRequest, err) return } out, err := h.service.Register(r.Context(), in) if err != nil { switch { case errors.Is(err, domainerr.ErrInvalidInput), errors.Is(err, domainerr.ErrConflict): httpapi.WriteError(w, http.StatusBadRequest, err) default: httpapi.WriteError(w, http.StatusInternalServerError, err) } return } httpapi.WriteJSON(w, http.StatusCreated, out) } func (h *Handler) login(w http.ResponseWriter, r *http.Request) { var in LoginInput if err := httpapi.ReadJSON(r, &in); err != nil { httpapi.WriteError(w, http.StatusBadRequest, err) return } out, err := h.service.Login(r.Context(), in) if err != nil { if errors.Is(err, ErrInvalidCredentials) { httpapi.WriteError(w, http.StatusUnauthorized, err) return } httpapi.WriteError(w, http.StatusInternalServerError, err) return } httpapi.WriteJSON(w, http.StatusOK, out) } func (h *Handler) refresh(w http.ResponseWriter, r *http.Request) { var in RefreshInput if err := httpapi.ReadJSON(r, &in); err != nil { httpapi.WriteError(w, http.StatusBadRequest, err) return } tokens, err := h.service.Refresh(r.Context(), in) if err != nil { if errors.Is(err, ErrInvalidToken) { httpapi.WriteError(w, http.StatusUnauthorized, err) return } httpapi.WriteError(w, http.StatusInternalServerError, err) return } httpapi.WriteJSON(w, http.StatusOK, tokens) } func (h *Handler) logout(w http.ResponseWriter, r *http.Request) { token, ok := ExtractBearerToken(r.Header.Get("Authorization")) if !ok { httpapi.WriteError(w, http.StatusUnauthorized, ErrInvalidToken) return } if err := h.service.Logout(r.Context(), token); err != nil { httpapi.WriteError(w, http.StatusUnauthorized, err) return } httpapi.WriteJSON(w, http.StatusOK, map[string]string{"status": "logged_out"}) } func (h *Handler) me(w http.ResponseWriter, r *http.Request) { principal, ok := PrincipalFromContext(r.Context()) if !ok { httpapi.WriteError(w, http.StatusUnauthorized, ErrInvalidToken) return } user, err := h.service.Me(r.Context(), principal.UserID) if err != nil { httpapi.WriteError(w, http.StatusUnauthorized, err) return } httpapi.WriteJSON(w, http.StatusOK, user) }