feat: users table and welcome videonote

This commit is contained in:
2026-08-18 13:37:59 +07:00
parent 48600d7802
commit fea3ceea87
7 changed files with 80 additions and 1 deletions

View File

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

View File

@@ -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") REDIS_URL = os.getenv("REDIS_URL", "redis://localhost:6379/1")
PROXY_URL = os.getenv("PROXY_URL") PROXY_URL = os.getenv("PROXY_URL")
WELCOME_VIDEO_NOTE_FP = os.getenv("WELCOME_VIDEO_NOTE_FP", "static/welcome.mp4")
### Constants ### ### Constants ###
PAGE_SIZE = 8 PAGE_SIZE = 8

View File

@@ -1,6 +1,7 @@
from .invoices import Invoice, InvoiceStatus from .invoices import Invoice, InvoiceStatus
from .orders import Order, OrderItem, OrderStatus from .orders import Order, OrderItem, OrderStatus
from .products import Category, Product from .products import Category, Product
from .users import User
__all__ = [ __all__ = [
"Category", "Category",
@@ -10,4 +11,5 @@ __all__ = [
"OrderItem", "OrderItem",
"OrderStatus", "OrderStatus",
"Product", "Product",
"User",
] ]

10
db/models/users.py Normal file
View File

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

View File

@@ -1,13 +1,16 @@
import contextlib import contextlib
import os
from aiogram import F, Router from aiogram import F, Router
from aiogram.filters import Command from aiogram.filters import Command
from aiogram.fsm.context import FSMContext 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 sqlalchemy.ext.asyncio import AsyncSession
from config import WELCOME_VIDEO_NOTE_FP
from misc.kb.client import main_menu_kb from misc.kb.client import main_menu_kb
from repositories.order_items import OrderItemRepository from repositories.order_items import OrderItemRepository
from repositories.users import create_user, get_user
from services.orders import OrderService from services.orders import OrderService
router = Router() router = Router()
@@ -22,6 +25,12 @@ async def user_main_menu(
): ):
await state.clear() 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) cart_items = await order_items_repo.get_items_count_by_customer(session, msg.from_user.id)
await msg.answer( await msg.answer(
"<b>Добрый день!</b>\n" 'Нажмите "Каталог" чтобы выбрать товар или воспользуйтесь поиском.', "<b>Добрый день!</b>\n" 'Нажмите "Каталог" чтобы выбрать товар или воспользуйтесь поиском.',

20
repositories/users.py Normal file
View File

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

BIN
static/welcome.mp4 Normal file

Binary file not shown.