54 lines
1.6 KiB
Python
54 lines
1.6 KiB
Python
"""PostgreSQL order repository."""
|
|
|
|
from contextlib import AbstractAsyncContextManager
|
|
from dataclasses import dataclass
|
|
from typing import Any
|
|
|
|
from sqlalchemy.ext.asyncio import AsyncSession, async_sessionmaker
|
|
|
|
from app.repositories.order.models import Order
|
|
|
|
|
|
@dataclass(frozen=True)
|
|
class OrderData:
|
|
order_uuid: str
|
|
payment_url: str
|
|
price: int
|
|
delivery_type: int
|
|
tariff_code: int
|
|
sender: dict[str, Any]
|
|
recipient: dict[str, Any]
|
|
from_location: dict[str, Any]
|
|
to_location: dict[str, Any]
|
|
packages: list[dict[str, Any]]
|
|
services: list[dict[str, Any]] | None
|
|
comment: str | None
|
|
|
|
|
|
class OrderRepository:
|
|
def __init__(self, session_factory: async_sessionmaker[AsyncSession]) -> None:
|
|
self._session_factory = session_factory
|
|
|
|
def session(self) -> AbstractAsyncContextManager[AsyncSession]:
|
|
return self._session_factory.begin()
|
|
|
|
async def create_order(self, session: AsyncSession, order_data: OrderData) -> Order:
|
|
order = Order(
|
|
order_uuid=order_data.order_uuid,
|
|
payment_url=order_data.payment_url,
|
|
price=order_data.price,
|
|
delivery_type=order_data.delivery_type,
|
|
tariff_code=order_data.tariff_code,
|
|
sender=order_data.sender,
|
|
recipient=order_data.recipient,
|
|
from_location=order_data.from_location,
|
|
to_location=order_data.to_location,
|
|
packages=order_data.packages,
|
|
services=order_data.services,
|
|
comment=order_data.comment,
|
|
)
|
|
session.add(order)
|
|
await session.flush()
|
|
await session.refresh(order)
|
|
return order
|