# Affinidi Iota Framework

> Manage Affinidi Iota Framework configuration to request data from Affinidi Vault.

## Install Dependency

Package: affinidi_tdk_iota_client

```bash
dart pub add affinidi_tdk_iota_client
```

Check the latest version on [pub.dev](https://pub.dev/packages/affinidi_tdk_iota_client) or view the source on [GitHub](https://github.com/affinidi/affinidi-tdk-dart/tree/main/clients/iota_client).

## Classes and Methods

### Configurations API

Manage Affinidi Iota Framework configurations to integrate your application to request data from Affinidi Vault.

#### createIotaConfiguration

Create an Affinidi Iota Framework configuration.

Parameters

    createIotaConfigurationInput
    [CreateIotaConfigurationInput](https://github.com/affinidi/affinidi-tdk-dart/tree/main/clients/iota_client/doc/CreateIotaConfigurationInput.md)
    Required
  Configuration details for the Iota Framework.

Example

```dart
import 'package:dio/dio.dart';
import 'package:affinidi_tdk_auth_provider/affinidi_tdk_auth_provider.dart';
import 'package:affinidi_tdk_iota_client/affinidi_tdk_iota_client.dart';
import 'package:dotenv/dotenv.dart';
import 'package:built_collection/built_collection.dart';

try {
    late ConfigurationsApi configurationsApi;

    final dio = Dio(BaseOptions(
        baseUrl: AffinidiTdkIotaClient.basePath,
        connectTimeout: const Duration(seconds: 5),
        receiveTimeout: const Duration(seconds: 5),
    ));

    final apiClient = AffinidiTdkIotaClient(
        dio: dio, authTokenHook: authProvider.fetchProjectScopedToken);

    configurationsApi = apiClient.getConfigurationsApi();

    final clientMetadata = IotaConfigurationDtoClientMetadataBuilder()
      ..name = "TestName"
      ..logo = "https://example.com/logo.png"
      ..origin = "https://example.com"
      ..build();

    final createIotaConfigurationInput = CreateIotaConfigurationInputBuilder()
      ..name ="Sample App"
      ..walletAri = ""
      ..redirectUris = ListBuilder(["http://localhost"]) 
      ..enableVerification = false
      ..enableConsentAuditLog = false
      ..clientMetadata = clientMetadata
      ..description = "Description"
      ..mode = CreateIotaConfigurationInputModeEnum.redirect
      ..enableIdvProviders = false;

    final configuration = (await configurationsApi.createIotaConfiguration(createIotaConfigurationInput: createIotaConfigurationInput.build())).data;

    print(configuration);
  } catch (e) {
    print('Exception: $e');
  }
```

#### deleteIotaConfigurationById

Delete an existing Affinidi Iota Framework configuration by ID.

Parameters

    configurationId
    String
    Required
  ID of the Affinidi Iota configuration to delete.

Example

```dart
import 'package:dio/dio.dart';
import 'package:affinidi_tdk_auth_provider/affinidi_tdk_auth_provider.dart';
import 'package:affinidi_tdk_iota_client/affinidi_tdk_iota_client.dart';
import 'package:dotenv/dotenv.dart';

try {

    late ConfigurationsApi configurationsApi;

    final dio = Dio(BaseOptions(
        baseUrl: AffinidiTdkIotaClient.basePath,
        connectTimeout: const Duration(seconds: 5),
        receiveTimeout: const Duration(seconds: 5),
    ));

    final apiClient = AffinidiTdkIotaClient(
       dio: dio, authTokenHook: authProvider.fetchProjectScopedToken);

    configurationsApi = apiClient.getConfigurationsApi();

    final configurationId = "";

    final response = (await configurationsApi.deleteIotaConfigurationById(configurationId: configurationId));

    print(response);
  } catch (e) {
    print('Exception: $e');
  }
```

#### getIotaConfigurationById

Retrieves an existing Affinidi Iota Framework configuration by ID.

Parameters

    configurationId
    String
    Required
  ID of the Affinidi Iota configuration to retrieve.

Example

```dart
import 'package:dio/dio.dart';
import 'package:affinidi_tdk_auth_provider/affinidi_tdk_auth_provider.dart';
import 'package:affinidi_tdk_iota_client/affinidi_tdk_iota_client.dart';
import 'package:dotenv/dotenv.dart';

try {

    late ConfigurationsApi configurationsApi;

    final dio = Dio(BaseOptions(
        baseUrl: AffinidiTdkIotaClient.basePath,
        connectTimeout: const Duration(seconds: 5),
        receiveTimeout: const Duration(seconds: 5),
    ));

    final apiClient = AffinidiTdkIotaClient(
       dio: dio, authTokenHook: authProvider.fetchProjectScopedToken);

    configurationsApi = apiClient.getConfigurationsApi();

    final configurationId = "";

    final response = (await configurationsApi.getIotaConfigurationById(configurationId: configurationId));

    print(response);
  } catch (e) {
    print('Exception: $e');
  }
```

#### getIotaConfigurationMetaData

Retrieves the metadata of an existing Affinidi Iota Framework configuration.

Parameters

    projectId
    String
    Required
  Project ID where the Affinidi Iota Framework was created.

    configurationId
    String
    Required
  ID of the existing Affinidi Iota Framework configuration.

Example

```dart
import 'package:affinidi_tdk_iota_client/affinidi_tdk_iota_client.dart';
import 'package:dotenv/dotenv.dart';

try {

    late ConfigurationsApi configurationsApi;

    final dio = Dio(BaseOptions(
        baseUrl: AffinidiTdkIotaClient.basePath,
        connectTimeout: const Duration(seconds: 5),
        receiveTimeout: const Duration(seconds: 5),
    ));

    final apiClient = AffinidiTdkIotaClient(
       dio: dio, authTokenHook: authProvider.fetchProjectScopedToken);

    configurationsApi = apiClient.getConfigurationsApi();

    final configurationId = "";
    final projectId =  "

";

    final response = (await configurationsApi.getIotaConfigurationMetaData(configurationId: configurationId, projectId: projectId));

    print(response);
  } catch (e) {
    print('Exception: $e');
  }
```

#### listIotaConfigurations

List all Affinidi Iota Framework configurations.

No parameters required.

Example

```dart
import 'package:dio/dio.dart';
import 'package:affinidi_tdk_auth_provider/affinidi_tdk_auth_provider.dart';
import 'package:affinidi_tdk_iota_client/affinidi_tdk_iota_client.dart';
import 'package:dotenv/dotenv.dart';

try {

    late ConfigurationsApi configurationsApi;

    final dio = Dio(BaseOptions(
        baseUrl: AffinidiTdkIotaClient.basePath,
        connectTimeout: const Duration(seconds: 5),
        receiveTimeout: const Duration(seconds: 5),
    ));

    final apiClient = AffinidiTdkIotaClient(
       dio: dio, authTokenHook: authProvider.fetchProjectScopedToken);

    configurationsApi = apiClient.getConfigurationsApi();

    final response = (await configurationsApi.listIotaConfigurations());

    print(response);
  } catch (e) {
    print('Exception: $e');
  }
```

#### updateIotaConfigurationById

Update an existing Affinidi Iota Framework configuration by ID.

Parameters

    configurationId
    String
    Required
  ID of the existing Affinidi Iota Framework configuration.

    updateConfigurationByIdInput
    [UpdateConfigurationByIdInput](https://github.com/affinidi/affinidi-tdk-dart/tree/main/clients/iota_client/doc/UpdateConfigurationByIdInput.md)
    Required
  Updated configuration details.

Example

```dart
import 'package:dio/dio.dart';
import 'package:affinidi_tdk_auth_provider/affinidi_tdk_auth_provider.dart';
import 'package:affinidi_tdk_iota_client/affinidi_tdk_iota_client.dart';
import 'package:dotenv/dotenv.dart';

try {

    late ConfigurationsApi configurationsApi;

    final dio = Dio(BaseOptions(
        baseUrl: AffinidiTdkIotaClient.basePath,
        connectTimeout: const Duration(seconds: 5),
        receiveTimeout: const Duration(seconds: 5),
    ));

    final apiClient = AffinidiTdkIotaClient(
       dio: dio, authTokenHook: authProvider.fetchProjectScopedToken);

    configurationsApi = apiClient.getConfigurationsApi();

    final updateConfigurationByInput = UpdateConfigurationByIdInputBuilder()
          ..name ="Sample App";

    final configurationId = "";

    final response = (await configurationsApi.updateIotaConfigurationById(configurationId: configurationId, updateConfigurationByIdInput: updateConfigurationByInput.build()));

    print(response);
  } catch (e) {
    print('Exception: $e');
  }
```

### Iota API

Generate access token required to access the Affinidi Iota Framework.

#### awsExchangeCredentials

Exchanges a limited token into a Cognito token.

Parameters

    awsExchangeCredentials
    [AwsExchangeCredentials](https://github.com/affinidi/affinidi-tdk-dart/tree/main/clients/iota_client/doc/AwsExchangeCredentials.md)
    Required
  JWT assertion string.

Example

```dart
import 'package:dio/dio.dart';
import 'package:affinidi_tdk_auth_provider/affinidi_tdk_auth_provider.dart';
import 'package:affinidi_tdk_iota_client/affinidi_tdk_iota_client.dart';
import 'package:dotenv/dotenv.dart';

try {

    late IotaApi iotaApi;

    final dio = Dio(BaseOptions(
        baseUrl: AffinidiTdkIotaClient.basePath,
        connectTimeout: const Duration(seconds: 5),
        receiveTimeout: const Duration(seconds: 5),
    ));

    final apiClient = AffinidiTdkIotaClient(
       dio: dio, authTokenHook: authProvider.fetchProjectScopedToken);

    iotaApi = apiClient.getIotaApi();

    final assertion = '';

    final awsExchangeCredentials = AwsExchangeCredentialsBuilder()
       ..assertion= assertion;

    final response = (await iotaApi.awsExchangeCredentials(awsExchangeCredentials: awsExchangeCredentials.build())).data;

    print(response);
  } catch (e) {
    print('Exception: $e');
  }
```

#### initiateDataSharingRequest

Initiate a data-sharing request for Affinidi Iota Framework and return the signed request token.

Parameters

    initiateDataSharingRequestInput
    [InitiateDataSharingRequestInput](https://github.com/affinidi/affinidi-tdk-dart/tree/main/clients/iota_client/doc/InitiateDataSharingRequestInput.md)
    Required
  Details required to initiate the data sharing request.

Example

```dart
import 'package:dio/dio.dart';
import 'package:affinidi_tdk_auth_provider/affinidi_tdk_auth_provider.dart';
import 'package:affinidi_tdk_iota_client/affinidi_tdk_iota_client.dart';
import 'package:dotenv/dotenv.dart';

try {

    late IotaApi iotaApi;

    final dio = Dio(BaseOptions(
        baseUrl: AffinidiTdkIotaClient.basePath,
        connectTimeout: const Duration(seconds: 5),
        receiveTimeout: const Duration(seconds: 5),
    ));

    final apiClient = AffinidiTdkIotaClient(
       dio: dio, authTokenHook: authProvider.fetchProjectScopedToken);

    iotaApi = apiClient.getIotaApi();

    final initiateDataSharingRequestInput = InitiateDataSharingRequestInputBuilder()
      ..configurationId = ""
      ..mode = InitiateDataSharingRequestInputModeEnum.redirect
      ..queryId = ""
      ..correlationId = ""
      ..nonce = ""
      ..redirectUri = "";

    final response = (await iotaApi.initiateDataSharingRequest(initiateDataSharingRequestInput: initiateDataSharingRequestInput.build()));

    print(response);
  } catch (e) {
    print('Exception: $e');
  }
```

#### fetchIotaVpResponse

Fetch the callback response from Affinidi Vault.

Parameters

    fetchIOTAVPResponseInput
    [FetchIOTAVPResponseInput](https://github.com/affinidi/affinidi-tdk-dart/tree/main/clients/iota_client/doc/FetchIOTAVPResponseInput.md)
    Required
  Details required to retrieve the callback response.

Example

```dart
import 'package:dio/dio.dart';
import 'package:affinidi_tdk_auth_provider/affinidi_tdk_auth_provider.dart';
import 'package:affinidi_tdk_iota_client/affinidi_tdk_iota_client.dart';
import 'package:dotenv/dotenv.dart';

try {

    late IotaApi iotaApi;

    final dio = Dio(BaseOptions(
        baseUrl: AffinidiTdkIotaClient.basePath,
        connectTimeout: const Duration(seconds: 5),
        receiveTimeout: const Duration(seconds: 5),
    ));

    final apiClient = AffinidiTdkIotaClient(
       dio: dio, authTokenHook: authProvider.fetchProjectScopedToken);

    iotaApi = apiClient.getIotaApi();

    final fetchIOTAVPResponseInput = FetchIOTAVPResponseInputBuilder()
      ..configurationId = ""
      ..correlationId = ""
      ..transactionId = "
"
      ..responseCode = "";

    final response = (await iotaApi.fetchIotaVpResponse(fetchIOTAVPResponseInput: fetchIOTAVPResponseInput.build()));

    print(response);
  } catch (e) {
    print('Exception: $e');
  }
```

### Default API

Manage logged consent from Affinidi Iota Framework.

#### listLoggedConsents

Returns the list of logged consents for the project.

Parameters

    configurationId
    String
    Optional
  Returns logged consents for the particular configuration.

    userId
    String
    Optional
  Returns logged consents for the particular user.

    limit
    Integer
    Optional
  Maximum number of records to fetch in a list.

    exclusiveStartKey
    String
    Optional
  The base64url encoded key of the first item this operation will evaluate.

Example

```dart
import 'package:dio/dio.dart';
import 'package:affinidi_tdk_auth_provider/affinidi_tdk_auth_provider.dart';
import 'package:affinidi_tdk_iota_client/affinidi_tdk_iota_client.dart';
import 'package:dotenv/dotenv.dart';

try {

    late DefaultApi defaultApi;

    final dio = Dio(BaseOptions(
        baseUrl: AffinidiTdkIotaClient.basePath,
        connectTimeout: const Duration(seconds: 5),
        receiveTimeout: const Duration(seconds: 5),
    ));

    final apiClient = AffinidiTdkIotaClient(
       dio: dio, authTokenHook: authProvider.fetchProjectScopedToken);

    defaultApi = apiClient.getDefaultApi();

    final configurationId = "";
    final limit = 56;

    final response = (await defaultApi.listLoggedConsents(configurationId: configurationId, limit: limit));

    print(response);
  } catch (e) {
    print('Exception: $e');
  }
```

### PexQuery API

#### iotOIDC4VPCallback

Handles callback from clients with data from the OID4VP transactions, including states, presentation submission, and verification tokens.

Parameters

    callbackInput
    [CallbackInput](https://github.com/affinidi/affinidi-tdk-dart/tree/main/clients/iota_client/doc/CallbackInput.md)
    Required
  Callback data from the client.

Example

```dart
import 'package:dio/dio.dart';
import 'package:affinidi_tdk_auth_provider/affinidi_tdk_auth_provider.dart';
import 'package:affinidi_tdk_iota_client/affinidi_tdk_iota_client.dart';
import 'package:dotenv/dotenv.dart';

try {

    late CallbackApi callbackApi;

    final dio = Dio(BaseOptions(
        baseUrl: AffinidiTdkIotaClient.basePath,
        connectTimeout: const Duration(seconds: 5),
        receiveTimeout: const Duration(seconds: 5),
    ));

    final apiClient = AffinidiTdkIotaClient(
       dio: dio, authTokenHook: authProvider.fetchProjectScopedToken);

    callbackApi = apiClient.getCallbackApi();

    final callbackInput = CallbackInputBuilder()
      ..state = ""
      ..vpToken = ''
      ..presentationSubmission = '

';

    final response = (await callbackApi.iotOIDC4VPCallback(callbackInput: callbackInput.build()));

    print(response);
  } catch (e) {
    print('Exception: $e');
  }
```

#### createPexQuery

Create a Presentation Definition in the Iota configuration.

Parameters

    configurationId
    String
    Required
  ID of the existing Affinidi Iota Framework configuration.

    createPexQueryInput
    [CreatePexQueryInput](https://github.com/affinidi/affinidi-tdk-dart/tree/main/clients/iota_client/doc/CreatePexQueryInput.md)
    Required
  PEX query details.

Example

```dart
import 'package:dio/dio.dart';
import 'dart:convert';
import 'package:affinidi_tdk_auth_provider/affinidi_tdk_auth_provider.dart';
import 'package:affinidi_tdk_iota_client/affinidi_tdk_iota_client.dart';
import 'package:dotenv/dotenv.dart';

try {

    late PexQueryApi pexQueryApi;

    final dio = Dio(BaseOptions(
        baseUrl: AffinidiTdkIotaClient.basePath,
        connectTimeout: const Duration(seconds: 5),
        receiveTimeout: const Duration(seconds: 5),
    ));

    final apiClient = AffinidiTdkIotaClient(
       dio: dio, authTokenHook: authProvider.fetchProjectScopedToken);

    pexQueryApi = apiClient.getPexQueryApi();

    final createPexQueryInput = CreatePexQueryInputBuilder()
      ..name = "Request Data"
      ..vpDefinition = "{PRESENTATION_DEFINITION_JSON_STRING}";

    final configurationId = "";

    final response = (await pexQueryApi.createPexQuery(configurationId: configurationId,createPexQueryInput: createPexQueryInput.build()));

    print(response);
  } catch (e) {
    print('Exception: $e');
  }
```

#### deletePexQueryById

Delete a Presentation Definition based on the query ID from the Iota configuration.

Parameters

    configurationId
    String
    Required
  ID of the existing Affinidi Iota Framework configuration.

    queryId
    String
    Required
  ID of the existing Presentation Definition.

Example

```dart
import 'package:dio/dio.dart';
import 'package:affinidi_tdk_auth_provider/affinidi_tdk_auth_provider.dart';
import 'package:affinidi_tdk_iota_client/affinidi_tdk_iota_client.dart';
import 'package:dotenv/dotenv.dart';

try {

    late PexQueryApi pexQueryApi;

    final dio = Dio(BaseOptions(
        baseUrl: AffinidiTdkIotaClient.basePath,
        connectTimeout: const Duration(seconds: 5),
        receiveTimeout: const Duration(seconds: 5),
    ));

    final apiClient = AffinidiTdkIotaClient(
       dio: dio, authTokenHook: authProvider.fetchProjectScopedToken);

    pexQueryApi = apiClient.getPexQueryApi();

    final configurationId = "";
    final queryId = "";

    final response = (await pexQueryApi.deletePexQueryById(configurationId: configurationId, queryId: queryId));

    print(response);
  } catch (e) {
    print('Exception: $e');
  }
```

#### getPexQueryById

Retrieves a Presentation Definition based on the query ID from the Iota configuration.

Parameters

    configurationId
    String
    Required
  ID of the existing Affinidi Iota Framework configuration.

    queryId
    String
    Required
  ID of the existing Presentation Definition.

Example

```dart
import 'package:dio/dio.dart';
import 'package:affinidi_tdk_auth_provider/affinidi_tdk_auth_provider.dart';
import 'package:affinidi_tdk_iota_client/affinidi_tdk_iota_client.dart';
import 'package:dotenv/dotenv.dart';

try {

    late PexQueryApi pexQueryApi;

    final dio = Dio(BaseOptions(
        baseUrl: AffinidiTdkIotaClient.basePath,
        connectTimeout: const Duration(seconds: 5),
        receiveTimeout: const Duration(seconds: 5),
    ));

    final apiClient = AffinidiTdkIotaClient(
       dio: dio, authTokenHook: authProvider.fetchProjectScopedToken);

    pexQueryApi = apiClient.getPexQueryApi();

    final configurationId = "";
    final queryId = "";

    final response = (await pexQueryApi.getPexQueryById(configurationId: configurationId, queryId: queryId));

    print(response);
  } catch (e) {
    print('Exception: $e');
  }
```

#### listPexQueries

Retrieves all Presentation Definitions in the Iota configuration.

Parameters

    configurationId
    String
    Required
  ID of the existing Affinidi Iota Framework configuration.

    limit
    Integer
    Optional
  Maximum number of records to return.

Example

```dart
import 'package:dio/dio.dart';
import 'package:affinidi_tdk_auth_provider/affinidi_tdk_auth_provider.dart';
import 'package:affinidi_tdk_iota_client/affinidi_tdk_iota_client.dart';
import 'package:dotenv/dotenv.dart';

try {

    late PexQueryApi pexQueryApi;

    final dio = Dio(BaseOptions(
        baseUrl: AffinidiTdkIotaClient.basePath,
        connectTimeout: const Duration(seconds: 5),
        receiveTimeout: const Duration(seconds: 5),
    ));

    final apiClient = AffinidiTdkIotaClient(
       dio: dio, authTokenHook: authProvider.fetchProjectScopedToken);

    pexQueryApi = apiClient.getPexQueryApi();

    final configurationId = "";
    final limit = 56;

    final response = (await pexQueryApi.listPexQueries(configurationId: configurationId, limit: limit));

    print(response);
  } catch (e) {
    print('Exception: $e');
  }
```

#### updatePexQueryById

Update a Presentation Definition based on the query ID from the Iota configuration.

Parameters

    configurationId
    String
    Required
  ID of the existing Affinidi Iota Framework configuration.

    queryId
    String
    Required
  ID of the existing Presentation Definition.

    updatePexQueryInput
    [UpdatePexQueryInput](https://github.com/affinidi/affinidi-tdk-dart/tree/main/clients/iota_client/doc/UpdatePexQueryInput.md)
    Required
  Updated PEX query details.

Example

```dart
import 'package:dio/dio.dart';
import 'package:affinidi_tdk_auth_provider/affinidi_tdk_auth_provider.dart';
import 'package:affinidi_tdk_iota_client/affinidi_tdk_iota_client.dart';
import 'package:dotenv/dotenv.dart';

try {

    late PexQueryApi pexQueryApi;

    final dio = Dio(BaseOptions(
        baseUrl: AffinidiTdkIotaClient.basePath,
        connectTimeout: const Duration(seconds: 5),
        receiveTimeout: const Duration(seconds: 5),
    ));

    final apiClient = AffinidiTdkIotaClient(
       dio: dio, authTokenHook: authProvider.fetchProjectScopedToken);

    pexQueryApi = apiClient.getPexQueryApi();

    final updatePexQueryInput = UpdatePexQueryInputBuilder()
      ..vpDefinition = "{PRESENTATION_DEFINITION_JSON_STRING}"
      ..description = "Request Data";

    final configurationId = "";
    final queryId = "";

    final response = (await pexQueryApi.updatePexQueryById(configurationId: configurationId, queryId: queryId, updatePexQueryInput: updatePexQueryInput.build()));

    print(response);
  } catch (e) {
    print('Exception: $e');
  }
```
