From 23a205f3bd516fc2f9db4a1429ba7252d8393fb1 Mon Sep 17 00:00:00 2001 From: Roman Dyakov Date: Mon, 15 Apr 2024 04:08:11 +0300 Subject: [PATCH 1/6] Models --- .../27dda7e6236a_create_group_request.py | 38 +++++++++++++++++++ social/models/__init__.py | 3 +- social/models/create_group_request.py | 20 ++++++++++ social/models/group.py | 6 +-- 4 files changed, 63 insertions(+), 4 deletions(-) create mode 100644 migrations/versions/27dda7e6236a_create_group_request.py create mode 100644 social/models/create_group_request.py diff --git a/migrations/versions/27dda7e6236a_create_group_request.py b/migrations/versions/27dda7e6236a_create_group_request.py new file mode 100644 index 0000000..1d84b53 --- /dev/null +++ b/migrations/versions/27dda7e6236a_create_group_request.py @@ -0,0 +1,38 @@ +"""Create group request + +Revision ID: 27dda7e6236a +Revises: 62addefd9655 +Create Date: 2024-04-15 03:59:03.133907 + +""" + +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = '27dda7e6236a' +down_revision = '62addefd9655' +branch_labels = None +depends_on = None + + +def upgrade(): + op.create_table( + 'create_group_request', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('secret_key', sa.String(), nullable=False), + sa.Column('owner_id', sa.Integer(), nullable=False), + sa.Column('mapped_group_id', sa.Integer(), nullable=True), + sa.Column('create_ts', sa.DateTime(), nullable=False), + sa.Column('valid_ts', sa.DateTime(), nullable=False), + sa.ForeignKeyConstraint( + ['mapped_group_id'], + ['group.id'], + ), + sa.PrimaryKeyConstraint('id'), + ) + + +def downgrade(): + op.drop_table('create_group_request') diff --git a/social/models/__init__.py b/social/models/__init__.py index f5530c2..b3224bc 100644 --- a/social/models/__init__.py +++ b/social/models/__init__.py @@ -1,5 +1,6 @@ from .group import TelegramChannel, TelegramChat, VkChat, VkGroup +from .create_group_request import CreateGroupRequest from .webhook_storage import WebhookStorage -__all__ = ['WebhookStorage', 'TelegramChannel', 'TelegramChat', 'VkGroup', 'VkChat'] +__all__ = ['WebhookStorage', 'TelegramChannel', 'TelegramChat', 'VkGroup', 'VkChat', 'CreateGroupRequest'] diff --git a/social/models/create_group_request.py b/social/models/create_group_request.py new file mode 100644 index 0000000..a722d98 --- /dev/null +++ b/social/models/create_group_request.py @@ -0,0 +1,20 @@ +from datetime import UTC, datetime, timedelta + +import sqlalchemy as sa +from sqlalchemy.orm import Mapped, mapped_column, relationship + +from .base import Base +from .group import Group +from social.utils.string import random_string + + +class CreateGroupRequest(Base): + id: Mapped[int] = mapped_column(primary_key=True) + secret_key: Mapped[str] = mapped_column(default=lambda: random_string(32)) + owner_id: Mapped[int] + mapped_group_id: Mapped[int | None] = mapped_column(sa.ForeignKey("group.id")) + + create_ts: Mapped[datetime] = mapped_column(default=lambda: datetime.now(UTC)) + valid_ts: Mapped[datetime] = mapped_column(default=lambda: datetime.now(UTC) + timedelta(days=1)) + + mapped_group: Mapped[Group] = relationship("group") diff --git a/social/models/group.py b/social/models/group.py index 1c74850..1b2276a 100644 --- a/social/models/group.py +++ b/social/models/group.py @@ -12,7 +12,7 @@ class Group(Base): owner_id: Mapped[int | None] is_deleted: Mapped[bool] = mapped_column(default=False) - last_active_ts: Mapped[datetime | None] + last_active_ts: Mapped[datetime] create_ts: Mapped[datetime] = mapped_column(default=lambda: datetime.now(UTC)) update_ts: Mapped[datetime] = mapped_column(default=lambda: datetime.now(UTC), onupdate=lambda: datetime.now(UTC)) @@ -44,7 +44,7 @@ class VkChat(Group): class TelegramChannel(Group): id: Mapped[int] = mapped_column(sa.ForeignKey("group.id"), primary_key=True) - channel_id: Mapped[int] + channel_id: Mapped[int] = mapped_column(sa.BigInteger) __mapper_args__ = { "polymorphic_identity": "tg_channel", @@ -53,7 +53,7 @@ class TelegramChannel(Group): class TelegramChat(Group): id: Mapped[int] = mapped_column(sa.ForeignKey("group.id"), primary_key=True) - chat_id: Mapped[int] + chat_id: Mapped[int] = mapped_column(sa.BigInteger) __mapper_args__ = { "polymorphic_identity": "tg_chat", From 9d3a7dace3be96671902f2465b9abddab434f6a2 Mon Sep 17 00:00:00 2001 From: Roman Dyakov Date: Mon, 15 Apr 2024 04:08:42 +0300 Subject: [PATCH 2/6] Requests --- social/exceptions.py | 6 +++++ social/routes/group.py | 55 ++++++++++++++++++++++++++++++++++++++++++ social/routes/vk.py | 5 ++-- 3 files changed, 63 insertions(+), 3 deletions(-) create mode 100644 social/routes/group.py diff --git a/social/exceptions.py b/social/exceptions.py index e69de29..662ded2 100644 --- a/social/exceptions.py +++ b/social/exceptions.py @@ -0,0 +1,6 @@ +class SocialApiError(Exception): + """Корневая ошибка Social API""" + + +class GroupRequestNotFound(SocialApiError): + """Не найдено запроса на создание группы""" diff --git a/social/routes/group.py b/social/routes/group.py new file mode 100644 index 0000000..0c0e64c --- /dev/null +++ b/social/routes/group.py @@ -0,0 +1,55 @@ +import logging +from datetime import UTC, datetime + +from auth_lib.fastapi import UnionAuth +from fastapi import APIRouter, Depends, Request +from fastapi.responses import PlainTextResponse +from fastapi_sqlalchemy import db +from pydantic import BaseModel, ConfigDict + +from social.exceptions import GroupRequestNotFound +from social.settings import get_settings +from social.models.create_group_request import CreateGroupRequest + + +router = APIRouter(prefix="/group", tags=['User defined groups']) +settings = get_settings() +logger = logging.getLogger(__name__) + + +class GroupRequestGet(BaseModel): + secret_key: str + valid_ts: datetime + + +class GroupGet(BaseModel): + group_id: int + + +@router.post('') +def create_group_request( + user: dict[str] = Depends(UnionAuth(["social.group.create"])), +) -> GroupRequestGet: + obj = CreateGroupRequest(owner_id=user.get("id")) + db.session.add(obj) + db.session.commit() + return obj + + +@router.get('') +def validate_group_request( + secret_key: str, + user: dict[str] = Depends(UnionAuth(["social.group.create"])), +) -> GroupGet | GroupRequestGet: + obj = ( + db.session.query(CreateGroupRequest) + .where(CreateGroupRequest.secret_key == secret_key, CreateGroupRequest.owner_id == user.get("id")) + .one_or_none() + ) + if obj is None or obj.valid_ts < datetime.now(UTC): + raise GroupRequestNotFound(user_id=user.get("id"), secret_key=secret_key) + + if obj.mapped_group_id is not None: + return GroupGet.model_validate(obj.mapped_group) + + return GroupRequestGet.model_validate(obj) diff --git a/social/routes/vk.py b/social/routes/vk.py index 83c2003..c226a7b 100644 --- a/social/routes/vk.py +++ b/social/routes/vk.py @@ -7,7 +7,6 @@ from fastapi_sqlalchemy import db from pydantic import BaseModel, ConfigDict -from social.handlers_telegram import get_application from social.models.group import VkChat, VkGroup from social.models.webhook_storage import WebhookStorage, WebhookSystems from social.settings import get_settings @@ -17,7 +16,6 @@ router = APIRouter(prefix="/vk", tags=['vk']) settings = get_settings() logger = logging.getLogger(__name__) -application = get_application() class VkGroupCreate(BaseModel): @@ -81,7 +79,8 @@ async def vk_webhook(request: Request) -> str: @router.put('/{group_id}') def create_or_replace_group( - group_id: int, group_info: VkGroupCreate, + group_id: int, + group_info: VkGroupCreate, user: dict[str] = Depends(UnionAuth(["social.group.create"])), ) -> VkGroupCreateResponse: group = db.session.query(VkGroup).where(VkGroup.group_id == group_id).one_or_none() From b36c3a9f4daa9230873821584438e0b932dc8126 Mon Sep 17 00:00:00 2001 From: Roman Dyakov Date: Mon, 15 Apr 2024 04:14:03 +0300 Subject: [PATCH 3/6] refactor --- social/routes/telegram.py | 34 ++++++++++++++++++---------------- 1 file changed, 18 insertions(+), 16 deletions(-) diff --git a/social/routes/telegram.py b/social/routes/telegram.py index 1a595f7..49b1746 100644 --- a/social/routes/telegram.py +++ b/social/routes/telegram.py @@ -18,6 +18,23 @@ application = get_application() +def create_group(update: Update): + chat = update.effective_chat + obj = None + if chat.type in ['group', 'supergroup']: + obj = db.session.query(TelegramChat).where(TelegramChat.chat_id == chat.id).one_or_none() + if obj is None: + obj = TelegramChat(chat_id=chat.id) + db.session.add(obj) + elif chat.type == 'channel': + obj = db.session.query(TelegramChannel).where(TelegramChannel.channel_id == chat.id).one_or_none() + if obj is None: + obj = TelegramChannel(channel_id=chat.id) + db.session.add(obj) + + obj.last_active_ts = datetime.now(UTC) + db.session.commit() + @router.post('') async def telegram_webhook(request: Request): """Принимает любой POST запрос от Telegram""" @@ -35,22 +52,7 @@ async def telegram_webhook(request: Request): update = Update.de_json(data=request_data, bot=application.bot) add_msg = create_task(application.update_queue.put(update)) try: - chat = update.effective_chat - obj = None - if chat.type in ['group', 'supergroup']: - obj = db.session.query(TelegramChat).where(TelegramChat.chat_id == chat.id).one_or_none() - if obj is None: - obj = TelegramChat(chat_id=chat.id) - db.session.add(obj) - elif chat.type == 'channel': - obj = db.session.query(TelegramChannel).where(TelegramChannel.channel_id == chat.id).one_or_none() - if obj is None: - obj = TelegramChannel(channel_id=chat.id) - db.session.add(obj) - - obj.last_active_ts = datetime.now(UTC) - db.session.commit() - logger.debug(obj) + create_group(update) except Exception as exc: logger.exception(exc) finally: From 78a9eae2af22625fa6145517cab57ff35ffc7281 Mon Sep 17 00:00:00 2001 From: Roman Dyakov Date: Mon, 15 Apr 2024 04:25:59 +0300 Subject: [PATCH 4/6] Validate for tg --- social/handlers_telegram/base.py | 8 +++++++ social/routes/telegram.py | 28 +++-------------------- social/utils/telegram_groups.py | 38 ++++++++++++++++++++++++++++++++ 3 files changed, 49 insertions(+), 25 deletions(-) create mode 100644 social/utils/telegram_groups.py diff --git a/social/handlers_telegram/base.py b/social/handlers_telegram/base.py index c33d0ec..f972ba3 100644 --- a/social/handlers_telegram/base.py +++ b/social/handlers_telegram/base.py @@ -6,6 +6,7 @@ from telegram.ext import Application, CommandHandler, ContextTypes from social.settings import get_settings +from social.utils.telegram_groups import approve_telegram_group from .handlers_viribus import register_handlers from .utils import CustomContext @@ -24,6 +25,7 @@ def get_application(): logger.info("Telegram API initialized successfully") # Общие хэндлеры app.add_handler(CommandHandler(callback=send_help, command="help")) + app.add_handler(CommandHandler(callback=get_validate, command="validate")) # Хэндлеры конкретных чатов register_handlers(app) @@ -43,3 +45,9 @@ async def send_help(update: Update, context: CustomContext): ), parse_mode='markdown', ) + + +async def get_validate(update: Update, context: CustomContext): + approve_telegram_group(update) + res = await update.effective_message.delete() + logger.info(f"Validation message handled, delete status = {res}") diff --git a/social/routes/telegram.py b/social/routes/telegram.py index 49b1746..285c586 100644 --- a/social/routes/telegram.py +++ b/social/routes/telegram.py @@ -1,15 +1,14 @@ import logging from asyncio import create_task -from datetime import UTC, datetime from fastapi import APIRouter, Request from fastapi_sqlalchemy import db from telegram import Update from social.handlers_telegram import get_application -from social.models import TelegramChannel, TelegramChat from social.models.webhook_storage import WebhookStorage, WebhookSystems from social.settings import get_settings +from social.utils.telegram_groups import create_telegram_group router = APIRouter(prefix="/telegram", tags=["webhooks"]) @@ -18,23 +17,6 @@ application = get_application() -def create_group(update: Update): - chat = update.effective_chat - obj = None - if chat.type in ['group', 'supergroup']: - obj = db.session.query(TelegramChat).where(TelegramChat.chat_id == chat.id).one_or_none() - if obj is None: - obj = TelegramChat(chat_id=chat.id) - db.session.add(obj) - elif chat.type == 'channel': - obj = db.session.query(TelegramChannel).where(TelegramChannel.channel_id == chat.id).one_or_none() - if obj is None: - obj = TelegramChannel(channel_id=chat.id) - db.session.add(obj) - - obj.last_active_ts = datetime.now(UTC) - db.session.commit() - @router.post('') async def telegram_webhook(request: Request): """Принимает любой POST запрос от Telegram""" @@ -50,12 +32,8 @@ async def telegram_webhook(request: Request): db.session.commit() update = Update.de_json(data=request_data, bot=application.bot) - add_msg = create_task(application.update_queue.put(update)) + await application.update_queue.put(update) try: - create_group(update) + create_telegram_group(update) except Exception as exc: logger.exception(exc) - finally: - await add_msg - - return diff --git a/social/utils/telegram_groups.py b/social/utils/telegram_groups.py new file mode 100644 index 0000000..eec25ab --- /dev/null +++ b/social/utils/telegram_groups.py @@ -0,0 +1,38 @@ +from datetime import UTC, datetime +from social.models import TelegramChannel, TelegramChat, CreateGroupRequest + +from fastapi_sqlalchemy import db +from telegram import Update + + +def create_telegram_group(update: Update): + chat = update.effective_chat + obj = None + if chat.type in ['group', 'supergroup']: + obj = db.session.query(TelegramChat).where(TelegramChat.chat_id == chat.id).one_or_none() + if obj is None: + obj = TelegramChat(chat_id=chat.id) + db.session.add(obj) + elif chat.type == 'channel': + obj = db.session.query(TelegramChannel).where(TelegramChannel.channel_id == chat.id).one_or_none() + if obj is None: + obj = TelegramChannel(channel_id=chat.id) + db.session.add(obj) + + if not obj: + return + + obj.last_active_ts = datetime.now(UTC) + db.session.commit() + return obj + + +def approve_telegram_group(update: Update): + group = create_telegram_group(update) + text = update.effective_message.text + if not text or not group: + return + text = text.removeprefix('/validate').removeprefix('@ViribusSocialBot').strip() + db.session.query(CreateGroupRequest).where(CreateGroupRequest.secret_key == text).update( + {CreateGroupRequest.mapped_group_id: group.id} + ) From 4afbe6e8a24ca26c3830c5563b02be51c281275f Mon Sep 17 00:00:00 2001 From: Roman Dyakov Date: Mon, 15 Apr 2024 05:05:14 +0300 Subject: [PATCH 5/6] Validation complete --- social/exceptions.py | 5 +++++ social/handlers_telegram/base.py | 9 ++++++--- social/models/create_group_request.py | 2 +- social/routes/__init__.py | 1 + social/routes/base.py | 2 ++ social/routes/exceptions.py | 17 +++++++++++++++++ social/routes/group.py | 8 ++++---- social/utils/telegram_groups.py | 7 +++++++ 8 files changed, 43 insertions(+), 8 deletions(-) create mode 100644 social/routes/exceptions.py diff --git a/social/exceptions.py b/social/exceptions.py index 662ded2..f3ae27c 100644 --- a/social/exceptions.py +++ b/social/exceptions.py @@ -4,3 +4,8 @@ class SocialApiError(Exception): class GroupRequestNotFound(SocialApiError): """Не найдено запроса на создание группы""" + + def __init__(self, user_id: int, secret_key: str, *args) -> None: + self.user_id = user_id + self.secret_key = secret_key + super().__init__(*args) diff --git a/social/handlers_telegram/base.py b/social/handlers_telegram/base.py index f972ba3..10e1956 100644 --- a/social/handlers_telegram/base.py +++ b/social/handlers_telegram/base.py @@ -2,6 +2,7 @@ from functools import lru_cache from textwrap import dedent +from fastapi_sqlalchemy import db from telegram import Update from telegram.ext import Application, CommandHandler, ContextTypes @@ -25,7 +26,7 @@ def get_application(): logger.info("Telegram API initialized successfully") # Общие хэндлеры app.add_handler(CommandHandler(callback=send_help, command="help")) - app.add_handler(CommandHandler(callback=get_validate, command="validate")) + app.add_handler(CommandHandler(callback=validate_group, command="validate", has_args=1)) # Хэндлеры конкретных чатов register_handlers(app) @@ -47,7 +48,9 @@ async def send_help(update: Update, context: CustomContext): ) -async def get_validate(update: Update, context: CustomContext): - approve_telegram_group(update) +async def validate_group(update: Update, context: CustomContext): + logger.info("Validation message received") + with db(): + approve_telegram_group(update) res = await update.effective_message.delete() logger.info(f"Validation message handled, delete status = {res}") diff --git a/social/models/create_group_request.py b/social/models/create_group_request.py index a722d98..b41205f 100644 --- a/social/models/create_group_request.py +++ b/social/models/create_group_request.py @@ -17,4 +17,4 @@ class CreateGroupRequest(Base): create_ts: Mapped[datetime] = mapped_column(default=lambda: datetime.now(UTC)) valid_ts: Mapped[datetime] = mapped_column(default=lambda: datetime.now(UTC) + timedelta(days=1)) - mapped_group: Mapped[Group] = relationship("group") + mapped_group: Mapped[Group | None] = relationship(Group) diff --git a/social/routes/__init__.py b/social/routes/__init__.py index e69de29..92f9000 100644 --- a/social/routes/__init__.py +++ b/social/routes/__init__.py @@ -0,0 +1 @@ +from . import exceptions # noqa diff --git a/social/routes/base.py b/social/routes/base.py index ae79ad2..05f05f1 100644 --- a/social/routes/base.py +++ b/social/routes/base.py @@ -12,6 +12,7 @@ from .github import router as github_router from .telegram import router as telegram_router from .vk import router as vk_router +from .group import router as group_router settings = get_settings() @@ -56,6 +57,7 @@ async def lifespan(app: FastAPI): ) +app.include_router(group_router) app.include_router(github_router) app.include_router(telegram_router) app.include_router(vk_router) diff --git a/social/routes/exceptions.py b/social/routes/exceptions.py new file mode 100644 index 0000000..815c76e --- /dev/null +++ b/social/routes/exceptions.py @@ -0,0 +1,17 @@ +from fastapi import Request +from fastapi.responses import JSONResponse +from .base import app +from social.exceptions import GroupRequestNotFound + + +@app.exception_handler(GroupRequestNotFound) +def group_request_not_found(request: Request, exc: GroupRequestNotFound) -> JSONResponse: + return JSONResponse( + status_code=404, + content={ + 'details': 'Group request not found', + 'ru': 'Запрос на создание группы не найден', + 'user_id': exc.user_id, + 'secret_key': exc.secret_key, + }, + ) diff --git a/social/routes/group.py b/social/routes/group.py index 0c0e64c..5fc0a21 100644 --- a/social/routes/group.py +++ b/social/routes/group.py @@ -23,7 +23,7 @@ class GroupRequestGet(BaseModel): class GroupGet(BaseModel): - group_id: int + id: int @router.post('') @@ -46,10 +46,10 @@ def validate_group_request( .where(CreateGroupRequest.secret_key == secret_key, CreateGroupRequest.owner_id == user.get("id")) .one_or_none() ) - if obj is None or obj.valid_ts < datetime.now(UTC): + if obj is None or obj.valid_ts.replace(tzinfo=UTC) < datetime.now(UTC): raise GroupRequestNotFound(user_id=user.get("id"), secret_key=secret_key) if obj.mapped_group_id is not None: - return GroupGet.model_validate(obj.mapped_group) + return GroupGet.model_validate(obj.mapped_group, from_attributes=True) - return GroupRequestGet.model_validate(obj) + return GroupRequestGet.model_validate(obj, from_attributes=True) diff --git a/social/utils/telegram_groups.py b/social/utils/telegram_groups.py index eec25ab..7e803c6 100644 --- a/social/utils/telegram_groups.py +++ b/social/utils/telegram_groups.py @@ -1,3 +1,4 @@ +import logging from datetime import UTC, datetime from social.models import TelegramChannel, TelegramChat, CreateGroupRequest @@ -5,6 +6,9 @@ from telegram import Update +logger = logging.getLogger(__name__) + + def create_telegram_group(update: Update): chat = update.effective_chat obj = None @@ -28,11 +32,14 @@ def create_telegram_group(update: Update): def approve_telegram_group(update: Update): + logger.debug("Validation started") group = create_telegram_group(update) text = update.effective_message.text if not text or not group: + logger.error("Telegram group not validated (secret=%s, group=%s)", text, group) return text = text.removeprefix('/validate').removeprefix('@ViribusSocialBot').strip() db.session.query(CreateGroupRequest).where(CreateGroupRequest.secret_key == text).update( {CreateGroupRequest.mapped_group_id: group.id} ) + logger.info("Telegram group %d validated (secret=%s)", group.id, text) From 172c96b38eaa9dd481d351b97ff36c3c4f769379 Mon Sep 17 00:00:00 2001 From: Roman Dyakov Date: Mon, 15 Apr 2024 05:11:54 +0300 Subject: [PATCH 6/6] Fix style --- migrations/versions/27dda7e6236a_create_group_request.py | 2 +- social/models/__init__.py | 2 +- social/models/create_group_request.py | 3 ++- social/routes/base.py | 2 +- social/routes/exceptions.py | 4 +++- social/routes/group.py | 7 +++---- social/routes/telegram.py | 1 - social/utils/telegram_groups.py | 3 ++- 8 files changed, 13 insertions(+), 11 deletions(-) diff --git a/migrations/versions/27dda7e6236a_create_group_request.py b/migrations/versions/27dda7e6236a_create_group_request.py index 1d84b53..a2b0c70 100644 --- a/migrations/versions/27dda7e6236a_create_group_request.py +++ b/migrations/versions/27dda7e6236a_create_group_request.py @@ -6,8 +6,8 @@ """ -from alembic import op import sqlalchemy as sa +from alembic import op # revision identifiers, used by Alembic. diff --git a/social/models/__init__.py b/social/models/__init__.py index b3224bc..012c0e3 100644 --- a/social/models/__init__.py +++ b/social/models/__init__.py @@ -1,5 +1,5 @@ -from .group import TelegramChannel, TelegramChat, VkChat, VkGroup from .create_group_request import CreateGroupRequest +from .group import TelegramChannel, TelegramChat, VkChat, VkGroup from .webhook_storage import WebhookStorage diff --git a/social/models/create_group_request.py b/social/models/create_group_request.py index b41205f..b567837 100644 --- a/social/models/create_group_request.py +++ b/social/models/create_group_request.py @@ -3,9 +3,10 @@ import sqlalchemy as sa from sqlalchemy.orm import Mapped, mapped_column, relationship +from social.utils.string import random_string + from .base import Base from .group import Group -from social.utils.string import random_string class CreateGroupRequest(Base): diff --git a/social/routes/base.py b/social/routes/base.py index 05f05f1..396920a 100644 --- a/social/routes/base.py +++ b/social/routes/base.py @@ -10,9 +10,9 @@ from .discord import router as discord_router from .github import router as github_router +from .group import router as group_router from .telegram import router as telegram_router from .vk import router as vk_router -from .group import router as group_router settings = get_settings() diff --git a/social/routes/exceptions.py b/social/routes/exceptions.py index 815c76e..d5da725 100644 --- a/social/routes/exceptions.py +++ b/social/routes/exceptions.py @@ -1,8 +1,10 @@ from fastapi import Request from fastapi.responses import JSONResponse -from .base import app + from social.exceptions import GroupRequestNotFound +from .base import app + @app.exception_handler(GroupRequestNotFound) def group_request_not_found(request: Request, exc: GroupRequestNotFound) -> JSONResponse: diff --git a/social/routes/group.py b/social/routes/group.py index 5fc0a21..1694c0f 100644 --- a/social/routes/group.py +++ b/social/routes/group.py @@ -2,14 +2,13 @@ from datetime import UTC, datetime from auth_lib.fastapi import UnionAuth -from fastapi import APIRouter, Depends, Request -from fastapi.responses import PlainTextResponse +from fastapi import APIRouter, Depends from fastapi_sqlalchemy import db -from pydantic import BaseModel, ConfigDict +from pydantic import BaseModel from social.exceptions import GroupRequestNotFound -from social.settings import get_settings from social.models.create_group_request import CreateGroupRequest +from social.settings import get_settings router = APIRouter(prefix="/group", tags=['User defined groups']) diff --git a/social/routes/telegram.py b/social/routes/telegram.py index 285c586..db6ac71 100644 --- a/social/routes/telegram.py +++ b/social/routes/telegram.py @@ -1,5 +1,4 @@ import logging -from asyncio import create_task from fastapi import APIRouter, Request from fastapi_sqlalchemy import db diff --git a/social/utils/telegram_groups.py b/social/utils/telegram_groups.py index 7e803c6..382f2f4 100644 --- a/social/utils/telegram_groups.py +++ b/social/utils/telegram_groups.py @@ -1,10 +1,11 @@ import logging from datetime import UTC, datetime -from social.models import TelegramChannel, TelegramChat, CreateGroupRequest from fastapi_sqlalchemy import db from telegram import Update +from social.models import CreateGroupRequest, TelegramChannel, TelegramChat + logger = logging.getLogger(__name__)