from datetime import timedelta from typing import Annotated from fastapi import APIRouter, Depends, HTTPException, status from fastapi.security import OAuth2PasswordRequestForm from psycopg2._psycopg import connection from api.models import Token from api.utils import authenticate_user, create_access_token from db.internal import get_db_connection from db.users import check_user_disabled from settings import startup_settings auth_router = APIRouter(prefix="/api", tags=["auth"]) @auth_router.post("/token") async def login( form_data: Annotated[OAuth2PasswordRequestForm, Depends()], conn: Annotated[connection, Depends(get_db_connection)] ) -> Token: password_correct = authenticate_user(conn, form_data.username, form_data.password) if not password_correct: raise HTTPException( status_code=status.HTTP_401_UNAUTHORIZED, detail="Incorrect username or password", headers={"WWW-Authenticate": "Bearer"}, ) user_disabled = check_user_disabled(conn, form_data.username) if user_disabled: raise HTTPException( status_code=status.HTTP_401_UNAUTHORIZED, detail="User acoount is disabled", headers={"WWW-Authenticate": "Bearer"}, ) access_token_expire_time = timedelta(minutes=startup_settings.access_token_expiration_time) access_token = create_access_token( data={"sub": form_data.username}, expires_delta=access_token_expire_time ) return Token(access_token=access_token, token_type="bearer")