imports sort
Some checks failed
Deploy on push / deploy (push) Failing after 9s

This commit is contained in:
Untone 2024-08-09 09:37:06 +03:00
parent d0c1f33227
commit 208de158bc
18 changed files with 64 additions and 35 deletions

View File

@ -31,6 +31,15 @@ poetry env use .venv/bin/python3.12
poetry update
poetry run server.py
```
### Полезные команды
```shell
poetry run ruff check . --fix --select I # линтер и сортировка импортов
poetry run ruff format . --line-length=120 # форматирование кода
```
## Подключенные сервисы
Для межсерверной коммуникации используются отдельные логики, папка `services/*` содержит адаптеры для использования базы данных, `redis`, кеширование и клиенты для запросов GraphQL.

12
cache/cache.py vendored
View File

@ -63,17 +63,17 @@ async def update_follower_stat(follower_id, entity_type, count):
# Get author from cache
async def get_cached_author(author_id: int):
async def get_cached_author(author_id: int, get_with_stat):
author_key = f"author:id:{author_id}"
result = await redis.execute("get", author_key)
if result:
return json.loads(result)
# Load from database if not found in cache
with local_session() as session:
author = session.execute(select(Author).where(Author.id == author_id)).scalar_one_or_none()
if author:
await cache_author(author.dict())
return author.dict()
q = select(Author).where(Author.id == author_id)
author = get_with_stat(q)
if author:
await cache_author(author.dict())
return author.dict()
return None

View File

@ -1,5 +1,6 @@
import asyncio
from cache.cache import get_cached_author, cache_author, get_cached_topic, cache_topic
from cache.cache import cache_author, cache_topic, get_cached_author, get_cached_topic
from utils.logger import root_logger as logger

3
cache/triggers.py vendored
View File

@ -1,9 +1,10 @@
from sqlalchemy import event
from cache.revalidator import revalidation_manager
from orm.author import Author, AuthorFollower
from orm.reaction import Reaction
from orm.shout import Shout, ShoutAuthor, ShoutReactionsFollower
from orm.topic import Topic, TopicFollower
from cache.revalidator import revalidation_manager
from utils.logger import root_logger as logger

View File

@ -7,15 +7,15 @@ from ariadne.asgi import GraphQL
from starlette.applications import Starlette
from starlette.routing import Route
from cache.precache import precache_data
from cache.revalidator import revalidation_manager
from services.exception import ExceptionHandlerMiddleware
from services.redis import redis
from services.schema import resolvers
from services.search import search_service
from services.sentry import start_sentry
from services.viewed import ViewedStorage
from services.webhook import WebhookEndpoint
from cache.precache import precache_data
from services.redis import redis
from cache.revalidator import revalidation_manager
from settings import DEV_SERVER_PID_FILE_NAME, MODE
import_module("resolvers")

View File

@ -1,3 +1,4 @@
from cache.triggers import events_register
from resolvers.author import ( # search_authors,
get_author,
get_author_followers,
@ -22,24 +23,24 @@ from resolvers.rating import rate_author
from resolvers.reaction import (
create_reaction,
delete_reaction,
load_comment_ratings,
load_reactions_by,
update_reaction,
load_shout_comments,
load_shout_ratings,
load_comment_ratings,
update_reaction,
)
from resolvers.reader import (
get_shout,
load_shouts_by,
load_shouts_coauthored,
load_shouts_discussed,
load_shouts_feed,
load_shouts_followed,
load_shouts_followed_by,
load_shouts_random_top,
load_shouts_random_topic,
load_shouts_search,
load_shouts_unrated,
load_shouts_coauthored,
load_shouts_discussed,
load_shouts_followed,
load_shouts_followed_by,
)
from resolvers.topic import (
get_topic,
@ -49,7 +50,6 @@ from resolvers.topic import (
get_topics_by_author,
get_topics_by_community,
)
from cache.triggers import events_register
events_register()

View File

@ -4,6 +4,7 @@ from sqlalchemy import and_, desc, select
from sqlalchemy.orm import joinedload
from sqlalchemy.sql.functions import coalesce
from cache.cache import cache_author, cache_topic
from orm.author import Author
from orm.rating import is_negative, is_positive
from orm.reaction import Reaction, ReactionKind
@ -12,13 +13,12 @@ from orm.topic import Topic
from resolvers.follower import follow, unfollow
from resolvers.stat import get_with_stat
from services.auth import login_required
from cache.cache import cache_author, cache_topic
from services.db import local_session
from utils.diff import apply_diff, get_diff
from utils.logger import root_logger as logger
from services.notify import notify_shout
from services.schema import mutation, query
from services.search import search_service
from utils.diff import apply_diff, get_diff
from utils.logger import root_logger as logger
async def cache_by_id(entity, entity_id: int, cache_method):

View File

@ -3,6 +3,12 @@ from typing import List
from sqlalchemy import select
from sqlalchemy.sql import and_
from cache.cache import (
cache_author,
cache_topic,
get_cached_follower_authors,
get_cached_follower_topics,
)
from orm.author import Author, AuthorFollower
from orm.community import Community, CommunityFollower
from orm.reaction import Reaction
@ -10,7 +16,6 @@ from orm.shout import Shout, ShoutReactionsFollower
from orm.topic import Topic, TopicFollower
from resolvers.stat import get_with_stat
from services.auth import login_required
from cache.cache import cache_author, cache_topic, get_cached_follower_authors, get_cached_follower_topics
from services.db import local_session
from services.notify import notify_follower
from services.schema import mutation, query

View File

@ -8,12 +8,17 @@ from sqlalchemy.orm import aliased
from sqlalchemy.sql import not_
from orm.author import Author
from orm.notification import Notification, NotificationAction, NotificationEntity, NotificationSeen
from orm.notification import (
Notification,
NotificationAction,
NotificationEntity,
NotificationSeen,
)
from orm.shout import Shout
from services.auth import login_required
from services.db import local_session
from utils.logger import root_logger as logger
from services.schema import mutation, query
from utils.logger import root_logger as logger
def query_notifications(author_id: int, after: int = 0) -> Tuple[int, int, List[Tuple[Notification, bool]]]:

View File

@ -1,5 +1,6 @@
from typing import List
from sqlalchemy.orm import aliased, selectinload, joinedload
from sqlalchemy.orm import aliased, joinedload, selectinload
from sqlalchemy.sql import union
from sqlalchemy.sql.expression import (
and_,
@ -12,17 +13,18 @@ from sqlalchemy.sql.expression import (
select,
text,
)
from orm.author import Author, AuthorFollower
from orm.reaction import Reaction, ReactionKind
from orm.shout import Shout, ShoutAuthor, ShoutTopic, ShoutReactionsFollower
from orm.shout import Shout, ShoutAuthor, ShoutReactionsFollower, ShoutTopic
from orm.topic import Topic, TopicFollower
from resolvers.topic import get_topics_random
from services.auth import login_required
from services.db import local_session
from utils.logger import root_logger as logger
from services.schema import query
from services.search import search_text
from services.viewed import ViewedStorage
from utils.logger import root_logger as logger
def query_shouts(slug=None):

View File

@ -3,8 +3,8 @@ import subprocess
from granian.constants import Interfaces
from granian.server import Granian
from utils.logger import root_logger as logger
from settings import PORT
from utils.logger import root_logger as logger
def is_docker_container_running(name):

View File

@ -2,10 +2,10 @@ from functools import wraps
import httpx
from resolvers.stat import get_with_stat
from cache.cache import get_cached_author_by_user_id
from utils.logger import root_logger as logger
from resolvers.stat import get_with_stat
from settings import ADMIN_SECRET, AUTH_URL
from utils.logger import root_logger as logger
async def request_data(gql, headers=None):

View File

@ -10,8 +10,8 @@ from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import Session, configure_mappers
from sqlalchemy.sql.schema import Table
from utils.logger import root_logger as logger
from settings import DB_URL
from utils.logger import root_logger as logger
# from sqlalchemy_searchable import make_searchable

View File

@ -2,8 +2,8 @@ import json
from orm.notification import Notification
from services.db import local_session
from utils.logger import root_logger as logger
from services.redis import redis
from utils.logger import root_logger as logger
def save_notification(action: str, entity: str, payload):

View File

@ -5,8 +5,8 @@ import os
from opensearchpy import OpenSearch
from utils.encoders import CustomJSONEncoder
from services.redis import redis
from utils.encoders import CustomJSONEncoder
# Set redis logging level to suppress DEBUG messages
logger = logging.getLogger("search")

View File

@ -2,6 +2,7 @@ import sentry_sdk
from sentry_sdk.integrations.ariadne import AriadneIntegration
from sentry_sdk.integrations.sqlalchemy import SqlalchemyIntegration
from sentry_sdk.integrations.starlette import StarletteIntegration
from settings import GLITCHTIP_DSN

View File

@ -7,7 +7,12 @@ from typing import Dict
# ga
from google.analytics.data_v1beta import BetaAnalyticsDataClient
from google.analytics.data_v1beta.types import DateRange, Dimension, Metric, RunReportRequest
from google.analytics.data_v1beta.types import (
DateRange,
Dimension,
Metric,
RunReportRequest,
)
from orm.author import Author
from orm.shout import Shout, ShoutAuthor, ShoutTopic

View File

@ -8,9 +8,9 @@ from starlette.exceptions import HTTPException
from starlette.requests import Request
from starlette.responses import JSONResponse
from cache.cache import cache_author
from orm.author import Author
from resolvers.stat import get_with_stat
from cache.cache import cache_author
from services.db import local_session