from fastapi import APIRouter, Depends, HTTPException, status from fastapi.security import OAuth2PasswordRequestForm from sqlalchemy import select from sqlalchemy.ext.asyncio import AsyncSession from app.core.security import create_access_token, hash_password, verify_password from app.database import get_db from app.models.user import User from app.schemas.user import Token, UserCreate, UserOut router = APIRouter() @router.post("/register", response_model=UserOut, status_code=status.HTTP_201_CREATED) async def register(body: UserCreate, db: AsyncSession = Depends(get_db)): existing = await db.execute(select(User).where(User.email == body.email)) if existing.scalar_one_or_none(): raise HTTPException(status_code=400, detail="Email already registered") user = User( email=body.email, hashed_password=hash_password(body.password), full_name=body.full_name, ) db.add(user) await db.commit() await db.refresh(user) return user @router.post("/login", response_model=Token) async def login(form: OAuth2PasswordRequestForm = Depends(), db: AsyncSession = Depends(get_db)): result = await db.execute(select(User).where(User.email == form.username)) user = result.scalar_one_or_none() if not user or not verify_password(form.password, user.hashed_password): raise HTTPException(status_code=401, detail="Incorrect email or password") return Token(access_token=create_access_token(user.id))