from fastapi import APIRouter, Depends, Request, Query, status from src.application.domain.dto import AdminAuthContext from src.presentation.decorators.admin_auth import require_admin_access, require_admin_role from src.presentation.dependencies.commands import ( get_list_orders_command, get_list_orders_by_date_command, get_get_order_command, ) from src.presentation.schemas.mappers import order_to_response from src.presentation.schemas.order import ( OrdersResponse, OrderResponse, OrderDetailResponse, ) from src.application.commands.orders_commands import ( ListOrdersCommand, ListOrdersByDateCommand, GetOrderCommand, ) orders_router = APIRouter(prefix='/orders', tags=['orders']) @orders_router.get('', response_model=OrdersResponse) async def list_orders( limit: int = Query(default=50, ge=1, le=200), offset: int = Query(default=0, ge=0), q: str | None = Query(default=None, min_length=1, max_length=255), auth: AdminAuthContext = Depends(require_admin_access), command: ListOrdersCommand = Depends(get_list_orders_command), ): items, total = await command(limit=limit, offset=offset, search=q) return OrdersResponse( items=[order_to_response(x) for x in items], total=total, ) @orders_router.get('/{order_id}', response_model=OrderDetailResponse) async def get_order( order_id: str, auth: AdminAuthContext = Depends(require_admin_access), command: GetOrderCommand = Depends(get_get_order_command), ): order = await command(order_id=order_id) return OrderDetailResponse( id=order.id, created_at=order.created_at.isoformat() if order.created_at is not None else None, updated_at=order.updated_at.isoformat() if order.updated_at is not None else None, user_id=order.user_id, usdt_amount=str(order.usdt_amount) if order.usdt_amount is not None else None, usdt_exchange_rate=str(order.usdt_exchange_rate) if order.usdt_exchange_rate is not None else None, gas_fee=str(order.gas_fee) if order.gas_fee is not None else None, total_price=str(order.total_price) if order.total_price is not None else None, service_fee=str(order.service_fee) if order.service_fee is not None else None, status=order.status, client_payment_id=order.client_payment_id, itpay_payment_qr_url_desktop=order.itpay_payment_qr_url_desktop, itpay_payment_qr_url_android=order.itpay_payment_qr_url_android, itpay_payment_qr_url_ios=order.itpay_payment_qr_url_ios, itpay_payment_qr_image_desktop=order.itpay_payment_qr_image_desktop, itpay_payment_qr_image_android=order.itpay_payment_qr_image_android, itpay_payment_qr_image_ios=order.itpay_payment_qr_image_ios, itpay_id=order.itpay_id, itpay_qr_id=order.itpay_qr_id, itpay_amount=str(order.itpay_amount) if order.itpay_amount is not None else None, itpay_created_at=order.itpay_created_at.isoformat() if order.itpay_created_at is not None else None, ) @orders_router.get('/filter/date', response_model=OrdersResponse) async def list_orders_by_date( year: int = Query(..., ge=2000, le=2100), month: int = Query(..., ge=1, le=12), limit: int = Query(default=50, ge=1, le=200), offset: int = Query(default=0, ge=0), auth: AdminAuthContext = Depends(require_admin_access), command: ListOrdersByDateCommand = Depends(get_list_orders_by_date_command), ): orders, total = await command(year=year, month=month, limit=limit, offset=offset) return OrdersResponse( items=[order_to_response(o) for o in orders], total=total, )