from fastapi import APIRouter, Depends, HTTPException, status from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy import select from app.dependencies import get_db from app.models.user import User from app.schemas.user import UserCreate, Token, LoginRequest from app.utils.security import hash_password, verify_password, create_token router = APIRouter(prefix="/api/auth", tags=["auth"]) @router.post("/register", response_model=Token, status_code=status.HTTP_201_CREATED) async def register(body: UserCreate, db: AsyncSession = Depends(get_db)): result = await db.execute(select(User).where(User.email == body.email)) if result.scalar_one_or_none(): raise HTTPException(status_code=status.HTTP_409_CONFLICT, detail="Email already registered") user = User( email=body.email, password_hash=hash_password(body.password), display_name=body.display_name or body.email.split("@")[0], ) db.add(user) await db.commit() await db.refresh(user) return Token(access_token=create_token(user.id)) @router.post("/login", response_model=Token) async def login(body: LoginRequest, db: AsyncSession = Depends(get_db)): result = await db.execute(select(User).where(User.email == body.email)) user = result.scalar_one_or_none() if not user or not verify_password(body.password, user.password_hash): raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED, detail="Invalid credentials") return Token(access_token=create_token(user.id))