File size: 1,485 Bytes
385f196
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
from __future__ import annotations

from typing import Any

from fastapi import APIRouter, Request
from pydantic import BaseModel

from app.services import auth_service
from app.services.audit_log_service import log_event


router = APIRouter(prefix="/api/auth", tags=["auth"])


class LoginPayload(BaseModel):
    usuario: str
    matricula: str


@router.post("/login")
def login(payload: LoginPayload, request: Request) -> dict[str, Any]:
    try:
        user = auth_service.authenticate_user(payload.usuario, payload.matricula)
    except Exception:
        log_event(
            "auth",
            "login",
            status="fail",
            details={"usuario_informado": str(payload.usuario or "").strip()},
            request=request,
        )
        raise

    token = auth_service.create_auth_session(user)
    log_event("auth", "login", user=user, status="ok", request=request)
    return {
        "token": token,
        "usuario": auth_service.public_user(user),
    }


@router.get("/me")
def me(request: Request) -> dict[str, Any]:
    user = auth_service.require_user(request)
    return {"usuario": auth_service.public_user(user)}


@router.post("/logout")
def logout(request: Request) -> dict[str, str]:
    user = auth_service.require_user(request)
    token = auth_service.extract_token_from_request(request)
    auth_service.destroy_auth_session(token)
    log_event("auth", "logout", user=user, status="ok", request=request)
    return {"status": "ok"}