from fastapi import APIRouter, Depends, HTTPException, Request, status from sqlalchemy import func, select from sqlalchemy.ext.asyncio import AsyncSession from api.deps import get_current_user from core.database import get_db from core.models import User from core.schemas import LoginRequest, LoginResponse, UserOut from core.security import create_access_token, verify_password router = APIRouter(tags=["auth"]) @router.post("/auth/login", response_model=LoginResponse) async def login(payload: LoginRequest, db: AsyncSession = Depends(get_db)): stmt = select(User).where( func.lower(User.email) == payload.email.lower(), User.is_active.is_(True), ) user = await db.scalar(stmt) if not user or not verify_password(payload.password, user.password_hash): raise HTTPException( status_code=status.HTTP_401_UNAUTHORIZED, detail="Invalid email or password", ) token = create_access_token( { "sub": str(user.id), "role": user.role, "email": user.email, } ) return LoginResponse(token=token, role=user.role, email=user.email) @router.get("/auth/me", response_model=UserOut) async def me(current_user: User = Depends(get_current_user)): return UserOut( id=current_user.id, email=current_user.email, role=current_user.role, is_active=current_user.is_active, created_at=current_user.created_at, )