submitBuildForBetaReview method

  1. @override
Future<String> submitBuildForBetaReview(
  1. String buildId
)
override

Submits an exact build for TestFlight beta review.

Implementation

@override
Future<String> submitBuildForBetaReview(String buildId) async {
  final query = Uri(
    queryParameters: <String, String>{
      'filter[build]': buildId,
      'limit': '200',
    },
  ).query;
  final existing = (await _collection(
    '/v1/betaAppReviewSubmissions?$query',
  )).map(_genericResource);
  for (final submission in existing) {
    final state = BetaReviewState.parse(
      submission.attributes['betaReviewState'],
    );
    switch (state) {
      case BetaReviewState.waitingForReview:
      case BetaReviewState.inReview:
      case BetaReviewState.approved:
        return submission.id;
      case BetaReviewState.rejected:
        throw const SmfError(
          'Apple rejected this build for external TestFlight testing. '
          'Upload a new build before retrying.',
          SmfErrorCode.betaReviewRejected,
        );
    }
  }

  final created = _map(
    await _request(
      'POST',
      '/v1/betaAppReviewSubmissions',
      body: <String, Object?>{
        'data': <String, Object?>{
          'type': 'betaAppReviewSubmissions',
          'relationships': <String, Object?>{
            'build': <String, Object?>{
              'data': <String, Object?>{
                'type': 'builds',
                'id': buildId,
              },
            },
          },
        },
      },
    ),
    'beta app review submission',
  );
  return _string(
    _map(created['data'], 'beta app review submission.data')['id'],
    'beta app review submission.data.id',
  );
}