from typing import Annotated from fastapi import APIRouter, Depends, HTTPException, status from fastapi.security import OAuth2PasswordRequestForm from sqlmodel import SQLModel, select from app.core.security import create_access_token, verify_password from app.db import SessionDep from app.dependencies import CurrentUser from app.models.user import User, UserPublic router = APIRouter(prefix="/auth", tags=["auth"]) class Token(SQLModel): access_token: str token_type: str = "bearer" @router.post("/login") def login( session: SessionDep, form_data: Annotated[OAuth2PasswordRequestForm, Depends()], ) -> Token: user = session.exec(select(User).where(User.email == form_data.username)).first() if user is None or not user.is_active or not verify_password(form_data.password, user.hashed_password): raise HTTPException( status_code=status.HTTP_401_UNAUTHORIZED, detail="Incorrect email or password", headers={"WWW-Authenticate": "Bearer"}, ) return Token(access_token=create_access_token(subject=str(user.id))) @router.get("/me", response_model=UserPublic) def me(current_user: CurrentUser) -> User: return current_user