add login method
This commit is contained in:
55
api/auth/login.go
Normal file
55
api/auth/login.go
Normal file
@@ -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})
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user