buildPresentation function

Future<String> buildPresentation(
  1. List credentials,
  2. WalletStore wallet,
  3. String challenge, {
  4. List<String>? additionalDids,
  5. List? disclosedCredentials,
  6. dynamic loadDocumentFunction(
    1. Uri url,
    2. LoadDocumentOptions? options
    ) = loadDocumentStrict,
})

Builds a presentation for credentials.

If not only the ownership of the dids in the credentials should be proofed a List of additionalDids could be given and a proof section for each did is added.

Implementation

Future<String> buildPresentation(
    List<dynamic> credentials, WalletStore wallet, String challenge,
    {List<String>? additionalDids,
    List<dynamic>? disclosedCredentials,
    Function(Uri url, LoadDocumentOptions? options) loadDocumentFunction =
        loadDocumentStrict}) async {
  List<Map<String, dynamic>?> credMapList = [];
  List<String?> holderDids = [];
  PresentationSubmission? submission;
  for (var element in credentials) {
    if (element is FilterResult) {
      List<InputDescriptorMappingObject> mapping = [];
      if (submission != null) {
        mapping = submission.descriptorMap;
      }
      for (var cred in element.credentials) {
        var credEntry = cred.toJson();
        credMapList.add(credEntry);
        holderDids.add(getHolderDidFromCredential(credEntry));
        for (var descriptor in element.matchingDescriptorIds) {
          var map = InputDescriptorMappingObject(
              id: descriptor,
              format: 'ldp_vc',
              path: JsonPath(
                  '\$.verifiableCredential[${credMapList.length - 1}]'));
          mapping.add(map);
        }
      }
      submission = PresentationSubmission(
          presentationDefinitionId: element.presentationDefinitionId,
          descriptorMap: mapping);
    } else {
      Map<String, dynamic> credMap;
      if (element is VerifiableCredential) {
        credMap = element.toJson();
      } else {
        credMap = credentialToMap(element);
      }
      credMapList.add(credMap);
      holderDids.add(getHolderDidFromCredential(credMap));
    }
  }

  List<String> context = ['https://www.w3.org/2018/credentials/v1'];
  List<String> type = ['VerifiablePresentation'];
  if (submission != null) {
    context.add(
        'https://identity.foundation/presentation-exchange/submission/v1/');
    type.add('PresentationSubmission');
  }

  Map<String, dynamic> presentation = {
    '@context': context,
    'type': type,
    'verifiableCredential': credMapList
  };

  if (submission != null) {
    presentation['presentation_submission'] = submission.toJson();
  }

  if (disclosedCredentials != null) {
    List<Map<String, dynamic>?> disclosedCreds = [];
    for (var element in disclosedCredentials) {
      var credMap = credentialToMap(element);
      disclosedCreds.add(credMap);
    }
    presentation['disclosedCredentials'] = disclosedCreds;
    var type = presentation['type'] as List<String?>;
    type.add('DisclosedCredentialPresentation');
    presentation['type'] = type;
  }
  List<Map<String, dynamic>> proofList = [];
  for (var element in holderDids) {
    var signer = _determineSignerForDid(element!, loadDocumentFunction);
    proofList.add(await signer.buildProof(presentation, wallet, element,
        challenge: challenge));
  }
  if (additionalDids != null) {
    for (var element in additionalDids) {
      var signer = _determineSignerForDid(element, loadDocumentFunction);
      proofList.add(await signer.buildProof(presentation, wallet, element,
          challenge: challenge));
    }
  }
  presentation['proof'] = proofList;
  return jsonEncode(presentation);
}