TorbatYar/backend/services/hospitality/app/repositories/qr.py
Mortezakoohjani 5c6a2e78cf feat(platform): seed service registry, deploy all modules, and fix homepage catalog.
Register all active platform services and base features in core DB so admin can manage them, add delivery/hospitality/sports-center backend phases, update apps catalog and production deploy tooling.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-27 12:39:51 +03:30

93 lines
3.1 KiB
Python

"""QR Menu & QR Ordering repositories — Phase 12.2."""
from __future__ import annotations
from uuid import UUID
from sqlalchemy import select
from app.models.qr import Cart, CartLine, QrCode, QrMenuSession, QrOrderingSession
from app.repositories.base import TenantBaseRepository
class QrCodeRepository(TenantBaseRepository[QrCode]):
model = QrCode
async def get_by_code(
self, tenant_id: UUID, venue_id: UUID, code: str
) -> QrCode | None:
stmt = select(QrCode).where(
QrCode.tenant_id == tenant_id,
QrCode.venue_id == venue_id,
QrCode.code == code,
QrCode.is_deleted.is_(False),
)
result = await self.session.execute(stmt)
return result.scalar_one_or_none()
async def get_by_token(self, tenant_id: UUID, token: str) -> QrCode | None:
stmt = select(QrCode).where(
QrCode.tenant_id == tenant_id,
QrCode.token == token,
QrCode.is_deleted.is_(False),
)
result = await self.session.execute(stmt)
return result.scalar_one_or_none()
class QrMenuSessionRepository(TenantBaseRepository[QrMenuSession]):
model = QrMenuSession
async def get_by_token(
self, tenant_id: UUID, session_token: str
) -> QrMenuSession | None:
stmt = select(QrMenuSession).where(
QrMenuSession.tenant_id == tenant_id,
QrMenuSession.session_token == session_token,
QrMenuSession.is_deleted.is_(False),
)
result = await self.session.execute(stmt)
return result.scalar_one_or_none()
class QrOrderingSessionRepository(TenantBaseRepository[QrOrderingSession]):
model = QrOrderingSession
async def get_by_token(
self, tenant_id: UUID, session_token: str
) -> QrOrderingSession | None:
stmt = select(QrOrderingSession).where(
QrOrderingSession.tenant_id == tenant_id,
QrOrderingSession.session_token == session_token,
QrOrderingSession.is_deleted.is_(False),
)
result = await self.session.execute(stmt)
return result.scalar_one_or_none()
class CartRepository(TenantBaseRepository[Cart]):
model = Cart
async def get_by_ordering_session(
self, tenant_id: UUID, ordering_session_id: UUID
) -> Cart | None:
stmt = select(Cart).where(
Cart.tenant_id == tenant_id,
Cart.ordering_session_id == ordering_session_id,
Cart.is_deleted.is_(False),
)
result = await self.session.execute(stmt)
return result.scalar_one_or_none()
class CartLineRepository(TenantBaseRepository[CartLine]):
model = CartLine
async def list_by_cart(self, tenant_id: UUID, cart_id: UUID):
stmt = select(CartLine).where(
CartLine.tenant_id == tenant_id,
CartLine.cart_id == cart_id,
CartLine.is_deleted.is_(False),
)
result = await self.session.execute(stmt)
return result.scalars().all()