"""Authentication endpoints: register, login (OAuth2), current user.""" from __future__ import annotations from typing import Annotated from fastapi import APIRouter, Depends, status from fastapi.security import OAuth2PasswordRequestForm from app.api.dependencies import CurrentUser, DbSession from app.schemas.user import Token, UserCreate, UserRead from app.services.auth_service import AuthService router = APIRouter() @router.post("/register", response_model=UserRead, status_code=status.HTTP_201_CREATED) async def register(data: UserCreate, session: DbSession) -> UserRead: user = await AuthService(session).register(data) return UserRead.model_validate(user) @router.post("/login", response_model=Token) async def login( session: DbSession, form_data: Annotated[OAuth2PasswordRequestForm, Depends()], ) -> Token: """OAuth2 password flow. The `username` field carries the user's email.""" service = AuthService(session) user = await service.authenticate(form_data.username, form_data.password) return service.issue_token(user) @router.get("/me", response_model=UserRead) async def read_me(current_user: CurrentUser) -> UserRead: return UserRead.model_validate(current_user)