From a1d32d09ea0da15f9d683bac7f0c030339cedab7 Mon Sep 17 00:00:00 2001 From: HMZ-H Date: Tue, 15 Sep 2026 01:24:15 +0300 Subject: [PATCH] Phase 2: add get_current_user JWT dependency --- backend/dwf/api/deps.py | 56 +++++++++++++++++++++++++++++++++++------ 1 file changed, 49 insertions(+), 7 deletions(-) diff --git a/backend/dwf/api/deps.py b/backend/dwf/api/deps.py index fa5a64b..e665fd6 100644 --- a/backend/dwf/api/deps.py +++ b/backend/dwf/api/deps.py @@ -1,17 +1,59 @@ from collections.abc import AsyncGenerator -from fastapi import Request + +from fastapi import Depends, HTTPException, Request, status +from fastapi.security import OAuth2PasswordBearer from sqlalchemy.ext.asyncio import AsyncSession +from sqlalchemy import select + +from dwf.infrastructure.database.models import User +from dwf.services.auth_service import AuthService +from dwf.settings import Settings + +oauth2_scheme = OAuth2PasswordBearer(tokenUrl="/auth/login") async def get_db(request: Request) -> AsyncGenerator[AsyncSession, None]: session_factory = request.app.state.session_factory session = session_factory() - try: yield session - # await session.commit() - # except Exception: - # await session.rollback() - # raise finally: - await session.close() \ No newline at end of file + await session.close() + + +async def get_current_user( + token: str = Depends(oauth2_scheme), + db: AsyncSession = Depends(get_db), + settings: Settings = Depends(), +) -> User: + auth_service = AuthService(db, settings) + try: + payload = auth_service.decode_token(token) + except Exception: + raise HTTPException( + status_code=status.HTTP_401_UNAUTHORIZED, detail="Invalid token" + ) + + if payload.get("type") != "access": + raise HTTPException( + status_code=status.HTTP_401_UNAUTHORIZED, detail="Invalid token type" + ) + + result = await db.execute(select(User).where(User.id == payload["sub"])) + user = result.scalar_one_or_none() + if user is None: + raise HTTPException( + status_code=status.HTTP_401_UNAUTHORIZED, detail="User not found" + ) + + return user + + +async def get_current_active_user( + current_user: User = Depends(get_current_user), +) -> User: + if not current_user.is_active: + raise HTTPException( + status_code=status.HTTP_403_FORBIDDEN, detail="Inactive user" + ) + return current_user