from fastapi import APIRouter, Depends, HTTPException from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy import select import json from app.database import get_db from app.models.user import User from app.schemas.auth import RegisterRequest, LoginRequest, TokenResponse, UserResponse from app.utils.security import hash_password, verify_password, create_access_token, get_current_user router = APIRouter(prefix="/api/auth", tags=["auth"]) def user_dict(user: User) -> dict: return { "id": user.id, "email": user.email, "name": user.name, "is_premium": user.is_premium, "allergies": json.loads(user.allergies or "[]"), "health_profile": user.health_profile or "normal", } @router.post("/register", response_model=TokenResponse) async def register(req: RegisterRequest, db: AsyncSession = Depends(get_db)): existing = await db.execute(select(User).where(User.email == req.email)) if existing.scalar_one_or_none(): raise HTTPException(status_code=400, detail="Email já cadastrado") user = User(email=req.email, name=req.name, password_hash=hash_password(req.password)) db.add(user) await db.commit() await db.refresh(user) token = create_access_token({"sub": str(user.id)}) return TokenResponse(access_token=token, user=user_dict(user)) @router.post("/login", response_model=TokenResponse) async def login(req: LoginRequest, db: AsyncSession = Depends(get_db)): result = await db.execute(select(User).where(User.email == req.email)) user = result.scalar_one_or_none() if not user or not verify_password(req.password, user.password_hash): raise HTTPException(status_code=401, detail="Email ou senha incorretos") token = create_access_token({"sub": str(user.id)}) return TokenResponse(access_token=token, user=user_dict(user)) @router.get("/me") async def me(user: User = Depends(get_current_user)): return user_dict(user)