connect database

This commit is contained in:
2025-09-27 09:13:20 +03:00
parent 5982351dd2
commit 1a49545fff
16 changed files with 180 additions and 38 deletions

View File

@@ -7,19 +7,25 @@ from aiogram_dialog import setup_dialogs
from app.bot.dialogs.flows import dialogs_router
from app.bot.handlers.commands import commands_router
from app.bot.middlewares import GetUserMiddleware
from app.bot.middlewares import DbSessionMiddleware, GetUserMiddleware
from config.config import settings
bot = Bot(token=settings.bot_token, default=DefaultBotProperties(parse_mode=ParseMode.MARKDOWN_V2))
bot = Bot(
token=settings.bot_token,
default=DefaultBotProperties(parse_mode=ParseMode.MARKDOWN_V2),
)
dp = Dispatcher()
async def main():
setup_dialogs(dp)
dp.update.outer_middleware(DbSessionMiddleware())
dp.update.outer_middleware(GetUserMiddleware())
dp.include_router(commands_router)
dp.include_router(dialogs_router)
dp.update.outer_middleware(GetUserMiddleware())
await dp.start_polling(bot)

View File

@@ -1,23 +1,39 @@
from aiogram_dialog import Dialog, Window
from aiogram_dialog.widgets.kbd import Column, Select
from aiogram_dialog.widgets.kbd import Back, Cancel, Column, Select
from aiogram_dialog.widgets.text import Const, Format
from .getters import events_getter
from .states import EventsSG
async def on_event_selected(
c,
widget: Select,
manager,
item_id: str,
):
manager.dialog_data["selected_event"] = item_id
await manager.next()
events_dialog = Dialog(
Window(
Const("События"),
Column(
Cancel(Const("Назад")),
Select(
Format("{item}"),
id="categ",
item_id_getter=lambda x: x,
items="events",
)
on_click=on_event_selected,
),
),
getter=events_getter,
state=EventsSG.events_list,
),
# Window(state=EventsSG.event),
Window(
Format("{dialog_data[selected_event]}"),
Back(Const("Назад")),
state=EventsSG.event,
),
)

View File

@@ -3,13 +3,15 @@ from aiogram_dialog.widgets.input import TextInput
from aiogram_dialog.widgets.kbd import Cancel, SwitchTo
from aiogram_dialog.widgets.text import Const, Format
from app.bot.dialogs.widgets.getters import user_getter
from .states import ProfileSG
profile_dialog = Dialog(
Window(
Const("*Профиль*"),
Format("Имя:"),
Format("Телефон:"),
Format("Имя: {user.fullname}"),
Format("Телефон: {user.phone}"),
SwitchTo(
Const("изменить имя"),
id="change_name",
@@ -22,6 +24,7 @@ profile_dialog = Dialog(
),
Cancel(Const("назад")),
state=ProfileSG.profile,
getter=user_getter,
),
Window(
Const("Введите имя"),

View File

@@ -4,17 +4,17 @@ from aiogram_dialog.widgets.text import Const, Format
from app.bot.dialogs.flows.events.dialogs import EventsSG
from app.bot.dialogs.flows.profile.dialogs import ProfileSG
from app.bot.dialogs.widgets.getters import is_admin, username_getter
from app.bot.dialogs.widgets.getters import is_admin_getter, user_getter
from .states import StartSG
start_dialog = Dialog(
Window(
Format("Привет, {username}"),
Format("Привет, {user.fullname}"),
Start(Const("события"), id="events", state=EventsSG.events_list),
Button(Const("создать событие"), id="create_event", when="is_admin"),
Start(Const("профиль"), id="profile", state=ProfileSG.profile),
getter=[username_getter, is_admin],
getter=[user_getter, is_admin_getter],
state=StartSG.start,
)
)

View File

@@ -1,13 +1,16 @@
from aiogram.types import User
from aiogram_dialog import DialogManager
from app.infrastructure.database.models import User as UserModel
async def username_getter(
dialog_manager: DialogManager, event_from_user: User, **kwargs
) -> dict[str, str]:
return {"username": event_from_user.username}
async def is_admin(
dialog_manager: DialogManager, event_from_user: User, **kwargs
async def user_getter(
dialog_manager: DialogManager, event_from_user: User, user: UserModel, **kwargs
) -> dict[str, str]:
return {"is_admin": False}
return {"user": user}
async def is_admin_getter(
dialog_manager: DialogManager, event_from_user: User, user: UserModel, **kwargs
) -> dict[str, str]:
return {"is_admin": user.role == "admin"}

View File

@@ -1,3 +1,4 @@
from .database import DbSessionMiddleware
from .get_user import GetUserMiddleware
__all__ = ["GetUserMiddleware"]
__all__ = ["DbSessionMiddleware", "GetUserMiddleware"]

View File

@@ -0,0 +1,18 @@
from typing import Any, Awaitable, Callable
from aiogram import BaseMiddleware
from aiogram.types import Update
from app.infrastructure.database import get_session
class DbSessionMiddleware(BaseMiddleware):
async def __call__(
self,
handler: Callable[[Update, dict[str, Any]], Awaitable[Any]],
event: Update,
data: dict[str, Any],
):
async with get_session() as session:
data["session"] = session
return await handler(event, data)

View File

@@ -1,7 +1,9 @@
from typing import Any, Awaitable, Callable
from aiogram import BaseMiddleware
from aiogram.types import Update
from aiogram.types import Update, User
from app.infrastructure.database.crud import create_user, get_user_by_tg_id
class GetUserMiddleware(BaseMiddleware):
@@ -11,5 +13,14 @@ class GetUserMiddleware(BaseMiddleware):
event: Update,
data: dict[str, Any],
):
data.update(user={"is_admin": False})
return await handler(event, data)
session = data["session"]
tg_user: User = data.get("event_from_user")
user = await get_user_by_tg_id(session, tg_user.id)
if user is None:
user = await create_user(
session,
tg_user.id,
tg_user.username,
)
data["user"] = user
return await handler(event, data)