From 051010312506c7ddf2bda8a6e224661a43bfaae9 Mon Sep 17 00:00:00 2001 From: Alexey Date: Sat, 3 Jan 2026 15:42:19 +0200 Subject: [PATCH] add login method --- api/auth/login.go | 55 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100644 api/auth/login.go diff --git a/api/auth/login.go b/api/auth/login.go new file mode 100644 index 0000000..4637b94 --- /dev/null +++ b/api/auth/login.go @@ -0,0 +1,55 @@ +package api_auth + +import ( + "encoding/json" + "fmt" + "log/slog" + "net/http" + + "git.oblat.lv/alex/triggerssmith/internal/auth" + "git.oblat.lv/alex/triggerssmith/internal/server" +) + +type loginRequest struct { + Username string `json:"username"` + Password string `json:"password"` +} + +type loginResponse struct { + Token string `json:"accessToken"` +} + +// @Summary Login +// @Tags auth +// @Produce json +// @Param request body loginRequest true "Login request" +// @Success 200 {object} loginResponse +// @Failure 400 {object} server.ProblemDetails +// @Failure 401 {object} server.ProblemDetails +// @Router /api/auth/login [post] +func (h *authHandler) handleLogin(w http.ResponseWriter, r *http.Request) { + w.Header().Set("Content-Type", "application/json") + var req loginRequest + err := json.NewDecoder(r.Body).Decode(&req) + if err != nil { + server.WriteProblem(w, http.StatusBadRequest, "/errors/invalid-request-body", "Invalid request body", "Body is not valid JSON", r) + return + } + + tokens, err := h.a.Login(req.Username, req.Password) + if err != nil { + slog.Error("Login failed", "error", err.Error()) + switch err { + case auth.ErrInvalidUsername: + server.WriteProblem(w, http.StatusUnauthorized, "/errors/auth/invalid-credentials", "Invalid credentials", fmt.Sprintf("User with username %s not found", req.Username), r) + case auth.ErrInvalidPassword: + server.WriteProblem(w, http.StatusUnauthorized, "/errors/auth/invalid-credentials", "Invalid credentials", fmt.Sprintf("Invalid password for user %s", req.Username), r) + default: + server.WriteProblem(w, http.StatusInternalServerError, "/errors/internal-server-error", "Internal Server Error", "unexpected error", r) + } + return + } + + setRefreshCookie(w, tokens.Refresh, h.cfg.Auth.RefreshTokenTTL, false) + _ = json.NewEncoder(w).Encode(loginResponse{Token: tokens.Access}) +}