handler method

  1. @Route('/order/defer')
  2. @OpenApiRoute(requestBody: OrderDeferDto)
Future<JsonResponse<void>> handler(
  1. Request request
)

Implementation

@Route.post('/order/defer')
@OpenApiRoute(requestBody: OrderDeferDto)
Future<JsonResponse<void>> handler(Request request) async {
  final bodyStr = await request.readAsString();
  final eventData = jsonDecode(bodyStr);
  print('Endpoint: /order/defer. Request body: ${(eventData)}');

  if (eventData.isEmpty) {
    return _badRequest('order is required!');
  }
  if (eventData['orderId'] == null) {
    return _badRequest('orderId must be specified!');
  }

  final orderJson = OrderDeferDto.fromJson(eventData);
  try {
    final order = await orderRepository.getOrder(orderJson.orderId);

    final newDriverRefuseReasonId = orderJson.driverRefuseReasonId;

    final validationResponse = _validateEventData(
      orderJson,
      newDriverRefuseReasonId,
    );
    if (validationResponse != null) return validationResponse;

    final newStatusName = _getNewOrderStatus(
      newDriverRefuseReasonId,
      orderJson.isRecalled,
      order.rescheduleCount,
    );

    final orderUpdateData = _serializeOrderDeferData(
      orderJson,
      newStatusName,
      newDriverRefuseReasonId,
      orderJson.orderId,
    );

    await orderRepository.updateOrderWithGeoEvent(
      orderId: orderJson.orderId,
      order: orderUpdateData,
      latitude: orderJson.lat,
      longitude: orderJson.lng,
    );

    return JsonResponse.ok(body: {'updated': true});
  } catch (e, stackTrace) {
    print('Error: $e');
    print('StackTrace: $stackTrace');
    return JsonResponse.internalServerError(
      body: jsonEncode({
        'error': e.toString(),
      }),
    );
  }
}