circular-fix
Some checks failed
Deploy on push / deploy (push) Failing after 17s

This commit is contained in:
2025-08-17 16:33:54 +03:00
parent bc8447a444
commit e78e12eeee
65 changed files with 3304 additions and 1051 deletions

View File

@@ -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