upload method

Future<List<Enrollment>?> upload(
  1. dynamic callback(
    1. RequestProgress,
    2. bool
    ), {
  2. Dio? dioTestClient,
})

Implementation

Future<List<Enrollment>?> upload(Function(RequestProgress, bool) callback,
    {Dio? dioTestClient}) async {
  List<Enrollment> enrollments = await this
      .where(attribute: 'synced', value: false)
      .where(attribute: 'dirty', value: true)
      .get();

  final List<String> enrollmentIds = enrollments
      .map((trackedEntityInstance) => trackedEntityInstance.id as String)
      .toList();

  final enrollmentUploadPayload = enrollments.map((enrollment) {
    return Enrollment.toUpload(enrollment);
  }).toList();

  final response = await HttpClient.post(this.apiResourceName as String,
      {'enrollments': enrollmentUploadPayload},
      database: this.database, dioTestClient: dioTestClient);

  final List<dynamic> importSummaries =
      (response.body?['response']?['importSummaries'] ?? []).toList();

  final queue = Queue(parallel: 50);
  num availableItemCount = 0;

  enrollments.forEach((enrollment) {
    final importSummary = importSummaries.lastWhere((summary) =>
        summary['reference'] != null &&
        summary['reference'] == enrollment.id);

    if (importSummary != null) {
      availableItemCount++;
      final syncFailed = importSummary['status'] == 'ERROR';
      enrollment.synced = !syncFailed;
      enrollment.dirty = syncFailed;
      enrollment.syncFailed = syncFailed;
      enrollment.lastSyncDate =
          DateTime.now().toIso8601String().split('.')[0].split('.')[0];
      enrollment.lastSyncSummary = importSummary.toString();
      queue.add(() => EnrollmentQuery().setData(enrollment).save());
    }
  });

  if (availableItemCount == 0) {
    queue.cancel();
  } else {
    await queue.onComplete;
  }

  return await EnrollmentQuery().byIds(enrollmentIds).get();
}