"""FastAPI-зависимости аутентификации и авторизации.""" from __future__ import annotations import jwt from fastapi import Depends, Request from sqlmodel import Session from app.core import security from app.core.errors import AuthError, ForbiddenError from app.db.session import get_session from app.models import User def get_current_user( request: Request, session: Session = Depends(get_session) ) -> User: token = request.cookies.get(security.USER_COOKIE) if not token: raise AuthError("Требуется вход.") try: payload = security.decode_token(token, security.AUDIENCE_USER) except jwt.PyJWTError as exc: # noqa: F841 raise AuthError("Сессия недействительна.") user = session.get(User, int(payload["sub"])) if user is None or not user.is_active: raise AuthError("Сессия недействительна.") return user def get_current_admin( request: Request, session: Session = Depends(get_session) ) -> User: token = request.cookies.get(security.ADMIN_COOKIE) if not token: raise AuthError("Требуется вход администратора.") try: payload = security.decode_token(token, security.AUDIENCE_ADMIN) except jwt.PyJWTError: raise AuthError("Сессия администратора недействительна.") user = session.get(User, int(payload["sub"])) if user is None or user.role != "admin" or not user.is_active: raise ForbiddenError("Доступ только для администратора.") return user