downloadRelatedTrackedEntityInstances method

Future<List<TrackedEntityInstance>> downloadRelatedTrackedEntityInstances({
  1. required List<TrackedEntityInstanceRelationship> relationships,
  2. Dio? dioTestClient,
})

Implementation

Future<List<TrackedEntityInstance>> downloadRelatedTrackedEntityInstances(
    {required List<TrackedEntityInstanceRelationship> relationships,
    Dio? dioTestClient}) async {
  final requests = (await Future.wait(relationships.map((relationship) async {
    ProgramRelationship? programRelationship =
        await ProgramRelationshipQuery(database: database)
            .byId(relationship.relationshipType)
            .getOne();

    Map<String, dynamic> resultMap = {};
    resultMap['trackedEntityInstance'] = relationship.toTrackedInstance;
    resultMap['program'] = programRelationship?.toProgram;

    return programRelationship?.toProgram != null ? resultMap : null;
  })))
      .skipWhile((value) => value == null);

  Map<String, List<String>> requestByProgram = {};
  requests.forEach((request) {
    if (request != null && request['program'] != null) {
      requestByProgram[request['program']] = [
        ...(requestByProgram[request['program']] ?? []),
        request['trackedEntityInstance']
      ];
    }
  });

  final queue = Queue(parallel: 50);
  num availableItemCount = 0;
  requestByProgram.keys.forEach((String program) {
    availableItemCount++;
    queue.add(() => downloadByProgramAndInstances(
        program: program,
        trackedEntityInstances: requestByProgram[program] as List<String>,
        dioTestClient: dioTestClient));
  });

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

  return [];
}