handler method

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

Implementation

@Route.post('/order/add')
@OpenApiRoute(requestBody: OrderCreateDto)
Future<JsonResponse<void>> handler(Request request) async {
  final bodyStr = await request.readAsString();
  final ordersUmbrella = jsonDecode(bodyStr) as List;
  print('Endpoint: /order/add. Request body: ${(ordersUmbrella)}');
  final ordersList = ordersUmbrella
      .map((json) => OrderCreateDto.fromJson(json as Map<String, dynamic>))
      .toList();

  final orders = <Order>[];
  final districts = <District>[];
  final addedDistricts = <String>{};

  try {
    var districtsIdsList = <String>[];
    for (var order in ordersList) {
      final validateOrderResponse = _validateOrder(order);
      if (validateOrderResponse != null) return validateOrderResponse;

      final districtId = await _findClientDistrict(order.client);

      final isDeliveryProviderEnabled = order.deliveryProviderId != null &&
          order.deliveryProviderId == providerIdRappi;

      //* Получаем департамент парой (Department, storekeperId?)
      final departmentPair = await _getOrderDepartament(
        order,
        districtId,
        districtsIdsList,
        isDeliveryProviderEnabled,
      );

      final plannedDateWithDuration =
          DateWithDuration.getPlannedDateAndDuration(
        preferredDate: order.preferredDate,
        preferredDeliveryTime: order.preferredDeliveryTime,
      );

      final newOrder = _serializeOrderAddData(
        order,
        plannedDateWithDuration,
        departmentPair,
        districtId,
        isDeliveryProviderEnabled,
      );

      orders.add(newOrder);

      if (!addedDistricts.contains(districtId)) {
        districts.add(District(id: districtId));
      }
      addedDistricts.add(districtId);
    }

    final failureOrResult = await repository.addOrders(orders, districts);

    return failureOrResult.fold(
      (l) => JsonResponse.internalServerError(body: {'error': l.toString()}),
      (r) => JsonResponse.ok(body: {'Created orders': r.toString()}),
    );
  } on FormatException catch (e) {
    print('OrderCreateController: A format exception occurred: ${e.message}');

    return JsonResponse.badRequest(
      body: 'OrderCreateController: Bad input data: ${e.message}',
    );
  } catch (e) {
    print({'request': ordersUmbrella});
    print({
      'deserializedRequest':
          orders.map((e) => e.toGQLJson(includeIfNull: false)).toList()
    });
    print('OrderCreateController: $e');

    return JsonResponse.internalServerError(
      body: 'OrderCreateController: $e',
    );
  }
}