Spaces:
Runtime error
Runtime error
File size: 1,481 Bytes
fd48bc8 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 | 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,
)
|