diff --git a/alembic/versions/8011a3651239_users.py b/alembic/versions/8011a3651239_users.py new file mode 100644 index 0000000..ee79272 --- /dev/null +++ b/alembic/versions/8011a3651239_users.py @@ -0,0 +1,36 @@ +"""+users + +Revision ID: 8011a3651239 +Revises: 6621b149364e +Create Date: 2026-08-18 13:32:42.638070 + +""" +from typing import Sequence, Union + +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision: str = '8011a3651239' +down_revision: Union[str, Sequence[str], None] = '6621b149364e' +branch_labels: Union[str, Sequence[str], None] = None +depends_on: Union[str, Sequence[str], None] = None + + +def upgrade() -> None: + """Upgrade schema.""" + # ### commands auto generated by Alembic - please adjust! ### + op.create_table('users', + sa.Column('id', sa.BIGINT(), nullable=False), + sa.PrimaryKeyConstraint('id'), + sa.UniqueConstraint('id') + ) + # ### end Alembic commands ### + + +def downgrade() -> None: + """Downgrade schema.""" + # ### commands auto generated by Alembic - please adjust! ### + op.drop_table('users') + # ### end Alembic commands ### diff --git a/config.py b/config.py index a548050..5e15296 100644 --- a/config.py +++ b/config.py @@ -29,6 +29,8 @@ card_info = CardInfo(os.getenv("CARD_NUMBER", ""), os.getenv("CARD_HOLDER", "")) REDIS_URL = os.getenv("REDIS_URL", "redis://localhost:6379/1") PROXY_URL = os.getenv("PROXY_URL") +WELCOME_VIDEO_NOTE_FP = os.getenv("WELCOME_VIDEO_NOTE_FP", "static/welcome.mp4") + ### Constants ### PAGE_SIZE = 8 diff --git a/db/models/__init__.py b/db/models/__init__.py index d71845b..bc55398 100644 --- a/db/models/__init__.py +++ b/db/models/__init__.py @@ -1,6 +1,7 @@ from .invoices import Invoice, InvoiceStatus from .orders import Order, OrderItem, OrderStatus from .products import Category, Product +from .users import User __all__ = [ "Category", @@ -10,4 +11,5 @@ __all__ = [ "OrderItem", "OrderStatus", "Product", + "User", ] diff --git a/db/models/users.py b/db/models/users.py new file mode 100644 index 0000000..e22fcb0 --- /dev/null +++ b/db/models/users.py @@ -0,0 +1,10 @@ +from sqlalchemy import BIGINT +from sqlalchemy.orm import Mapped, mapped_column + +from db.base import Base + + +class User(Base): + __tablename__ = "users" + + id: Mapped[int] = mapped_column(BIGINT, unique=True, nullable=False, primary_key=True) diff --git a/handlers/client/menu.py b/handlers/client/menu.py index 81aef7c..b96b52a 100644 --- a/handlers/client/menu.py +++ b/handlers/client/menu.py @@ -1,13 +1,16 @@ import contextlib +import os from aiogram import F, Router from aiogram.filters import Command from aiogram.fsm.context import FSMContext -from aiogram.types import CallbackQuery, Message +from aiogram.types import CallbackQuery, FSInputFile, Message from sqlalchemy.ext.asyncio import AsyncSession +from config import WELCOME_VIDEO_NOTE_FP from misc.kb.client import main_menu_kb from repositories.order_items import OrderItemRepository +from repositories.users import create_user, get_user from services.orders import OrderService router = Router() @@ -22,6 +25,12 @@ async def user_main_menu( ): await state.clear() + if not await get_user(session, msg.from_user.id): + if os.path.isfile(WELCOME_VIDEO_NOTE_FP): + await msg.bot.send_chat_action(msg.from_user.id, "record_video") + await msg.answer_video_note(FSInputFile(WELCOME_VIDEO_NOTE_FP)) + await create_user(session, msg.from_user.id) + cart_items = await order_items_repo.get_items_count_by_customer(session, msg.from_user.id) await msg.answer( "Добрый день!\n" 'Нажмите "Каталог" чтобы выбрать товар или воспользуйтесь поиском.', diff --git a/repositories/users.py b/repositories/users.py new file mode 100644 index 0000000..6f5dbd2 --- /dev/null +++ b/repositories/users.py @@ -0,0 +1,20 @@ +from sqlalchemy import select +from sqlalchemy.ext.asyncio import AsyncSession + +from db.models.users import User + + +async def get_user(session: AsyncSession, user_id: int) -> User | None: + stmt = select(User).where(User.id == user_id) + r = await session.execute(stmt) + + return r.scalar_one_or_none() + +async def create_user(session: AsyncSession, user_id: int) -> User: + user = User( + id=user_id + ) + session.add(user) + await session.commit() + + return user diff --git a/static/welcome.mp4 b/static/welcome.mp4 new file mode 100644 index 0000000..ebdb699 Binary files /dev/null and b/static/welcome.mp4 differ