from fastapi import APIRouter, Depends, HTTPException from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy import select 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"]) @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={"id": user.id, "email": user.email, "name": user.name, "is_premium": user.is_premium} ) @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={"id": user.id, "email": user.email, "name": user.name, "is_premium": user.is_premium} ) @router.get("/me", response_model=UserResponse) async def me(user: User = Depends(get_current_user)): return UserResponse(id=user.id, email=user.email, name=user.name, is_premium=user.is_premium)