33 lines
1.2 KiB
Python
33 lines
1.2 KiB
Python
from __future__ import annotations
|
|
|
|
from typing import Annotated
|
|
|
|
from fastapi import APIRouter, Depends, HTTPException, status
|
|
|
|
from app.api.deps import get_current_user
|
|
from app.core.database import get_connection
|
|
from app.core.schemas import LoginRequest, LoginResponse, UserProfile
|
|
from app.core.security import verify_password
|
|
from app.services import repository
|
|
|
|
router = APIRouter(prefix="/api/auth", tags=["auth"])
|
|
|
|
|
|
@router.post("/login", response_model=LoginResponse)
|
|
def login(payload: LoginRequest) -> LoginResponse:
|
|
with get_connection() as connection:
|
|
row = connection.execute(
|
|
"SELECT id, username, password_hash, role, display_name FROM users WHERE username = ?",
|
|
(payload.username,),
|
|
).fetchone()
|
|
if row is None or not verify_password(payload.password, row["password_hash"]):
|
|
raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED, detail="invalid_credentials")
|
|
token = repository.create_session(connection, row["id"])
|
|
user = repository.profile_from_row(row)
|
|
return LoginResponse(token=token, user=user)
|
|
|
|
|
|
@router.get("/me", response_model=UserProfile)
|
|
def me(user: Annotated[UserProfile, Depends(get_current_user)]) -> UserProfile:
|
|
return user
|