This commit is contained in:
@@ -7,7 +7,7 @@ import json
|
||||
import secrets
|
||||
import time
|
||||
from functools import wraps
|
||||
from typing import Any, Callable, Optional
|
||||
from typing import Any, Callable
|
||||
|
||||
from graphql.error import GraphQLError
|
||||
from starlette.requests import Request
|
||||
@@ -21,6 +21,7 @@ from auth.orm import Author
|
||||
from auth.password import Password
|
||||
from auth.tokens.storage import TokenStorage
|
||||
from auth.tokens.verification import VerificationTokenManager
|
||||
from cache.cache import get_cached_author_by_id
|
||||
from orm.community import (
|
||||
Community,
|
||||
CommunityAuthor,
|
||||
@@ -38,6 +39,11 @@ from settings import (
|
||||
from utils.generate_slug import generate_unique_slug
|
||||
from utils.logger import root_logger as logger
|
||||
|
||||
# Author уже импортирован в начале файла
|
||||
def get_author_model():
|
||||
"""Возвращает модель Author для использования в auth"""
|
||||
return Author
|
||||
|
||||
# Список разрешенных заголовков
|
||||
ALLOWED_HEADERS = ["Authorization", "Content-Type"]
|
||||
|
||||
@@ -107,6 +113,7 @@ class AuthService:
|
||||
# Проверяем админские права через email если нет роли админа
|
||||
if not is_admin:
|
||||
with local_session() as session:
|
||||
Author = get_author_model()
|
||||
author = session.query(Author).where(Author.id == user_id_int).first()
|
||||
if author and author.email in ADMIN_EMAILS.split(","):
|
||||
is_admin = True
|
||||
@@ -120,7 +127,7 @@ class AuthService:
|
||||
|
||||
return user_id, user_roles, is_admin
|
||||
|
||||
async def add_user_role(self, user_id: str, roles: Optional[list[str]] = None) -> Optional[str]:
|
||||
async def add_user_role(self, user_id: str, roles: list[str] | None = None) -> str | None:
|
||||
"""
|
||||
Добавление ролей пользователю в локальной БД через CommunityAuthor.
|
||||
"""
|
||||
@@ -160,6 +167,7 @@ class AuthService:
|
||||
|
||||
# Проверяем уникальность email
|
||||
with local_session() as session:
|
||||
Author = get_author_model()
|
||||
existing_user = session.query(Author).where(Author.email == user_dict["email"]).first()
|
||||
if existing_user:
|
||||
# Если пользователь с таким email уже существует, возвращаем его
|
||||
@@ -172,6 +180,7 @@ class AuthService:
|
||||
# Проверяем уникальность slug
|
||||
with local_session() as session:
|
||||
# Добавляем суффикс, если slug уже существует
|
||||
Author = get_author_model()
|
||||
counter = 1
|
||||
unique_slug = base_slug
|
||||
while session.query(Author).where(Author.slug == unique_slug).first():
|
||||
@@ -227,9 +236,6 @@ class AuthService:
|
||||
|
||||
async def get_session(self, token: str) -> dict[str, Any]:
|
||||
"""Получает информацию о текущей сессии по токену"""
|
||||
# Поздний импорт для избежания циклических зависимостей
|
||||
from cache.cache import get_cached_author_by_id
|
||||
|
||||
try:
|
||||
# Проверяем токен
|
||||
payload = JWTCodec.decode(token)
|
||||
@@ -261,6 +267,7 @@ class AuthService:
|
||||
logger.info(f"Попытка регистрации для {email}")
|
||||
|
||||
with local_session() as session:
|
||||
Author = get_author_model()
|
||||
user = session.query(Author).where(Author.email == email).first()
|
||||
if user:
|
||||
logger.warning(f"Пользователь {email} уже существует")
|
||||
@@ -300,6 +307,7 @@ class AuthService:
|
||||
"""Отправляет ссылку подтверждения на email"""
|
||||
email = email.lower()
|
||||
with local_session() as session:
|
||||
Author = get_author_model()
|
||||
user = session.query(Author).where(Author.email == email).first()
|
||||
if not user:
|
||||
raise ObjectNotExistError("User not found")
|
||||
@@ -337,6 +345,7 @@ class AuthService:
|
||||
username = payload.get("username")
|
||||
|
||||
with local_session() as session:
|
||||
Author = get_author_model()
|
||||
user = session.query(Author).where(Author.id == user_id).first()
|
||||
if not user:
|
||||
logger.warning(f"Пользователь с ID {user_id} не найден")
|
||||
@@ -371,6 +380,7 @@ class AuthService:
|
||||
|
||||
try:
|
||||
with local_session() as session:
|
||||
Author = get_author_model()
|
||||
author = session.query(Author).where(Author.email == email).first()
|
||||
if not author:
|
||||
logger.warning(f"Пользователь {email} не найден")
|
||||
@@ -779,7 +789,6 @@ class AuthService:
|
||||
info.context["is_admin"] = is_admin
|
||||
|
||||
# Автор будет получен в резолвере при необходимости
|
||||
pass
|
||||
else:
|
||||
logger.debug("login_accepted: Пользователь не авторизован")
|
||||
info.context["roles"] = None
|
||||
|
||||
Reference in New Issue
Block a user