69 lines
2.0 KiB
Python
69 lines
2.0 KiB
Python
from sqlalchemy.ext.asyncio import AsyncSession
|
|
from sqlalchemy import delete, select
|
|
from typing import Optional
|
|
|
|
from sqlalchemy.orm import selectinload
|
|
|
|
from db.models import Order, OrderStatus, OrderItem
|
|
|
|
|
|
class OrderRepository:
|
|
async def get_order_by_id(
|
|
self, session: AsyncSession, order_id: int
|
|
) -> Optional[Order]:
|
|
stmt = select(Order).where(Order.id == order_id)
|
|
return await session.scalar(stmt)
|
|
|
|
async def get_orders_by_user(
|
|
self, session: AsyncSession, customer: int
|
|
) -> list[Order]:
|
|
stmt = select(Order).where(Order.customer == customer)
|
|
result = await session.scalars(stmt)
|
|
|
|
return list(result)
|
|
|
|
async def get_draft_order_by_user(
|
|
self, session: AsyncSession, customer: int
|
|
) -> Optional[Order]:
|
|
stmt = (
|
|
select(Order)
|
|
.where(Order.customer == customer)
|
|
.where(Order.status == OrderStatus.DRAFT)
|
|
.limit(1)
|
|
.options(selectinload(Order.items).selectinload(OrderItem.product))
|
|
)
|
|
return await session.scalar(stmt)
|
|
|
|
async def create_order(
|
|
self,
|
|
session: AsyncSession,
|
|
customer: int,
|
|
status: OrderStatus = OrderStatus.DRAFT,
|
|
):
|
|
order = Order(customer=customer, status=status)
|
|
|
|
session.add(order)
|
|
await session.commit()
|
|
|
|
return order
|
|
|
|
async def remove_order_by_id(self, session: AsyncSession, order_id: int):
|
|
stmt = delete(Order).where(Order.id == order_id)
|
|
|
|
await session.execute(stmt)
|
|
await session.commit()
|
|
|
|
async def remove_order_by_customer(self, session: AsyncSession, customer: int):
|
|
stmt = delete(Order).where(Order.customer == customer)
|
|
|
|
await session.execute(stmt)
|
|
await session.commit()
|
|
|
|
async def update_order_status(
|
|
self, session: AsyncSession, order_id: int, status: OrderStatus
|
|
):
|
|
order = await self.get_order_by_id(session, order_id)
|
|
order.status = status
|
|
|
|
await session.commit()
|