submitVersionForReview method

  1. @override
Future<String> submitVersionForReview({
  1. required String appId,
  2. required String appStoreVersionId,
})
override

Creates or reuses the review submission for an App Store version.

Implementation

@override
Future<String> submitVersionForReview({
  required String appId,
  required String appStoreVersionId,
}) async {
  final submissions =
      <ReviewSubmissionDto>[
        for (final item in await _collection(
          '/v1/apps/$appId/reviewSubmissions?'
          'filter%5Bplatform%5D=IOS&'
          'include=appStoreVersionForReview&limit=200',
        ))
          _reviewSubmission(item),
      ].where(
        (submission) => submission.appStoreVersionId == appStoreVersionId,
      );
  ReviewSubmissionDto? completed;
  for (final submission in submissions) {
    switch (submission.state) {
      case ReviewSubmissionState.readyForReview:
        await _submitReviewSubmission(submission.id);
        return submission.id;
      case ReviewSubmissionState.waitingForReview:
      case ReviewSubmissionState.inReview:
      case ReviewSubmissionState.completing:
        return submission.id;
      case ReviewSubmissionState.complete:
        completed ??= submission;
      case ReviewSubmissionState.unresolvedIssues:
        throw const SmfError(
          'App Review reported unresolved issues. Resolve them in App Store '
          'Connect before retrying.',
          SmfErrorCode.appReviewUnresolved,
        );
      case ReviewSubmissionState.canceling:
        throw const SmfError(
          'The App Store review submission is still canceling. Wait for '
          'Apple to finish before retrying.',
          SmfErrorCode.appReviewCanceling,
        );
    }
  }
  if (completed != null) return completed.id;

  final created = _map(
    await _request(
      'POST',
      '/v1/reviewSubmissions',
      body: <String, Object?>{
        'data': <String, Object?>{
          'type': 'reviewSubmissions',
          'relationships': <String, Object?>{
            'app': <String, Object?>{
              'data': <String, Object?>{'type': 'apps', 'id': appId},
            },
          },
        },
      },
    ),
    'review submission',
  );
  final submission = _map(created['data'], 'review submission.data');
  final submissionId = _string(submission['id'], 'review submission.id');
  await _request(
    'POST',
    '/v1/reviewSubmissionItems',
    body: <String, Object?>{
      'data': <String, Object?>{
        'type': 'reviewSubmissionItems',
        'relationships': <String, Object?>{
          'reviewSubmission': <String, Object?>{
            'data': <String, Object?>{
              'type': 'reviewSubmissions',
              'id': submissionId,
            },
          },
          'appStoreVersion': <String, Object?>{
            'data': <String, Object?>{
              'type': 'appStoreVersions',
              'id': appStoreVersionId,
            },
          },
        },
      },
    },
  );
  await _submitReviewSubmission(submissionId);
  return submissionId;
}