feat: updating order status

This commit is contained in:
2026-05-17 16:23:02 +03:00
parent e41e89277f
commit dc213cb9d9
5 changed files with 52 additions and 15 deletions

View File

@@ -1,6 +1,7 @@
from abc import ABC,abstractmethod from abc import ABC,abstractmethod
from src.application.domain.entities.order import OrderEntity from src.application.domain.entities.order import OrderEntity
from src.application.domain.enums import OrderStatus
class IOrderRepository(ABC): class IOrderRepository(ABC):
@@ -37,3 +38,8 @@ class IOrderRepository(ABC):
@abstractmethod @abstractmethod
async def update_after_itpay_failure(self,order: OrderEntity) -> OrderEntity: async def update_after_itpay_failure(self,order: OrderEntity) -> OrderEntity:
raise NotImplementedError raise NotImplementedError
@abstractmethod
async def update_status(self,*,order_id:str,status:OrderStatus) -> None:
raise NotImplementedError

View File

@@ -2,7 +2,7 @@ from __future__ import annotations
from decimal import Decimal from decimal import Decimal
from src.application.abstractions import IUnitOfWork from src.application.abstractions import IUnitOfWork
from src.application.contracts import ILogger,IReceipt from src.application.contracts import ILogger,IReceipt
from src.application.domain.enums import PaymentStatus from src.application.domain.enums import OrderStatus,PaymentStatus
from src.application.domain.exceptions import ApplicationException,NotFoundException,PaymentMetadataException,ReceiptDataException from src.application.domain.exceptions import ApplicationException,NotFoundException,PaymentMetadataException,ReceiptDataException
from src.infrastructure.database.decorators import transactional from src.infrastructure.database.decorators import transactional
@@ -91,3 +91,13 @@ class CreateCryptoTransferCompletedCommand:
receipt_cloudekassir_id=str(receipt_model.get('Id') or '') or None, receipt_cloudekassir_id=str(receipt_model.get('Id') or '') or None,
receipt_cloudekassir_link=str(receipt_model.get('ReceiptLocalUrl') or '') or None, receipt_cloudekassir_link=str(receipt_model.get('ReceiptLocalUrl') or '') or None,
) )
await self._unit_of_work.order_repository.update_status(
order_id=order_id,
status=OrderStatus.COMPLETED,
)
self._logger.info({
'event': 'order_status_changed',
'order_id': order_id,
'user_id': user_id,
'status': OrderStatus.COMPLETED.value,
})

View File

@@ -2,7 +2,7 @@ from __future__ import annotations
from ulid import ULID from ulid import ULID
from src.application.abstractions import IUnitOfWork from src.application.abstractions import IUnitOfWork
from src.application.contracts import ILogger,IQueueMessanger from src.application.contracts import ILogger,IQueueMessanger
from src.application.domain.enums import PaymentStatus from src.application.domain.enums import OrderStatus
from src.application.domain.exceptions import PaymentMetadataException from src.application.domain.exceptions import PaymentMetadataException
from src.infrastructure.config import settings from src.infrastructure.config import settings
from src.infrastructure.database.decorators import transactional from src.infrastructure.database.decorators import transactional
@@ -15,6 +15,20 @@ class CreatePaymentCommand:
self._logger = logger self._logger = logger
self._queue_messanger = queue_messanger self._queue_messanger = queue_messanger
async def _mark_order_completed(self, order_id: str, user_id: str) -> None:
await self._unit_of_work.order_repository.update_status(
order_id=order_id,
status=OrderStatus.COMPLETED,
)
self._logger.info({
'event': 'order_status_changed',
'order_id': order_id,
'user_id': user_id,
'status': OrderStatus.COMPLETED.value,
})
@transactional @transactional
async def __call__(self, payment: ItpayPaymentData) -> None: async def __call__(self, payment: ItpayPaymentData) -> None:
if str(payment.status).strip().lower() != 'completed': if str(payment.status).strip().lower() != 'completed':
@@ -38,7 +52,14 @@ class CreatePaymentCommand:
expired_date=str(payment.expired_date) if payment.expired_date is not None else None, expired_date=str(payment.expired_date) if payment.expired_date is not None else None,
) )
if not payment_created: if not payment_created:
await self._mark_order_completed(order_id, user_id)
return return
await self._mark_order_completed(order_id, user_id)
self._logger.info({
'event': 'payment_money_accepted',
'order_id': order_id,
'user_id': user_id,
})
message_id = str(ULID()) message_id = str(ULID())
message: dict[str,str] = { message: dict[str,str] = {
'order_id': order_id, 'order_id': order_id,
@@ -71,13 +92,3 @@ class CreatePaymentCommand:
'user_id': user_id, 'user_id': user_id,
'message_id': message_id, 'message_id': message_id,
}) })
await self._unit_of_work.payment_repository.update_status(
order_id=order_id,
status=PaymentStatus.WEB3_PROCESSING,
)
self._logger.info({
'event': 'payment_status_changed',
'order_id': order_id,
'user_id': user_id,
'status': PaymentStatus.WEB3_PROCESSING.value,
})

View File

@@ -7,4 +7,3 @@ class OrderStatus(str, Enum):
COMPLETED = 'completed' COMPLETED = 'completed'
CANCELLED = 'cancelled' CANCELLED = 'cancelled'
ERROR = 'error' ERROR = 'error'
CANCELED = 'canceled'

View File

@@ -7,6 +7,7 @@ from sqlalchemy.ext.asyncio import AsyncSession
from src.application.abstractions.repositories.i_order_repository import IOrderRepository from src.application.abstractions.repositories.i_order_repository import IOrderRepository
from src.application.contracts import ILogger from src.application.contracts import ILogger
from src.application.domain.entities.order import OrderEntity from src.application.domain.entities.order import OrderEntity
from src.application.domain.enums import OrderStatus
from src.infrastructure.database.models.order import Order from src.infrastructure.database.models.order import Order
@@ -160,3 +161,13 @@ class OrderRepository(IOrderRepository):
await self._session.execute(stmt) await self._session.execute(stmt)
await self._session.flush() await self._session.flush()
return order return order
async def update_status(self,*,order_id:str,status:OrderStatus) -> None:
stmt=(
update(Order)
.where(Order.id==order_id)
.values(status=status)
)
await self._session.execute(stmt)
await self._session.flush()