fix: 409 is exception

This commit is contained in:
2026-05-09 14:57:15 +03:00
parent 766280fd45
commit ad51f1220f

View File

@@ -1,12 +1,13 @@
from urllib.parse import parse_qs from urllib.parse import parse_qs
import orjson import orjson
from fastapi import APIRouter, Depends, Request, Response from fastapi import APIRouter, Depends, Request
from fastapi.responses import ORJSONResponse from fastapi.responses import ORJSONResponse
from src.application.commands import CreateOrderCommand from src.application.commands import CreateOrderCommand
from src.application.commands import CreatePaymentCloudkassirCommand from src.application.commands import CreatePaymentCloudkassirCommand
from src.application.contracts import ILogger from src.application.contracts import ILogger
from src.application.domain.dto import AuthContext from src.application.domain.dto import AuthContext
from src.application.domain.enums import OrderStatus from src.application.domain.enums import OrderStatus
from src.application.domain.exceptions import ConflictException
from src.presentation.decorators import require_access_token, csrf_protect from src.presentation.decorators import require_access_token, csrf_protect
from src.presentation.dependencies.commands import get_create_order_command, get_create_payment_cloudkassir_command from src.presentation.dependencies.commands import get_create_order_command, get_create_payment_cloudkassir_command
from src.presentation.dependencies.logger import get_logger from src.presentation.dependencies.logger import get_logger
@@ -25,7 +26,7 @@ order_router = APIRouter(prefix='/order', tags=['orders'])
401: {'model': ErrorResponse, 'description': 'Unauthorized'}, 401: {'model': ErrorResponse, 'description': 'Unauthorized'},
403: {'model': ErrorResponse, 'description': 'Forbidden'}, 403: {'model': ErrorResponse, 'description': 'Forbidden'},
404: {'model': ErrorResponse, 'description': 'Not Found'}, 404: {'model': ErrorResponse, 'description': 'Not Found'},
409: {'model': CreateOrderResponse | ErrorResponse, 'description': 'Conflict'}, 409: {'model': ErrorResponse, 'description': 'Conflict'},
500: {'model': ErrorResponse, 'description': 'Internal Server Error'}, 500: {'model': ErrorResponse, 'description': 'Internal Server Error'},
502: {'model': ErrorResponse, 'description': 'Bad Gateway'}, 502: {'model': ErrorResponse, 'description': 'Bad Gateway'},
503: {'model': ErrorResponse, 'description': 'Service Unavailable'}, 503: {'model': ErrorResponse, 'description': 'Service Unavailable'},
@@ -34,7 +35,6 @@ order_router = APIRouter(prefix='/order', tags=['orders'])
#@csrf_protect() #@csrf_protect()
async def create_order( async def create_order(
payment_data: CreateOrder, payment_data: CreateOrder,
response: Response,
#auth: AuthContext = Depends(require_access_token), #auth: AuthContext = Depends(require_access_token),
command: CreateOrderCommand = Depends(get_create_order_command), command: CreateOrderCommand = Depends(get_create_order_command),
logger: ILogger = Depends(get_logger), logger: ILogger = Depends(get_logger),
@@ -46,10 +46,19 @@ async def create_order(
OrderStatus.REJECTED, OrderStatus.REJECTED,
OrderStatus.ERROR, OrderStatus.ERROR,
) )
http_code = 409 if itpay_error else 201 log_ids = {
response.status_code = http_code 'event': 'order_create_itpay_failed' if itpay_error else 'order_created',
'order_id': o.id,
'user_id': o.user_id,
'client_payment_id': o.client_payment_id,
'itpay_id': o.itpay_id,
'order_status': o.status.value if o.status is not None else None,
}
logger.info(log_ids)
if itpay_error:
raise ConflictException(message='Payment provider rejected order')
content = CreateOrderResponse( content = CreateOrderResponse(
status_code=http_code, status_code=201,
order=OrderPaymentResponse( order=OrderPaymentResponse(
id=o.id, id=o.id,
created_at=o.created_at.isoformat() if o.created_at is not None else None, created_at=o.created_at.isoformat() if o.created_at is not None else None,
@@ -74,15 +83,6 @@ async def create_order(
itpay_created_at=o.itpay_created_at.isoformat() if o.itpay_created_at is not None else None, itpay_created_at=o.itpay_created_at.isoformat() if o.itpay_created_at is not None else None,
), ),
) )
log_ids = {
'event': 'order_create_itpay_failed' if itpay_error else 'order_created',
'order_id': o.id,
'user_id': o.user_id,
'client_payment_id': o.client_payment_id,
'itpay_id': o.itpay_id,
'order_status': o.status.value if o.status is not None else None,
}
logger.info(log_ids)
return content return content