submitVersionForReview method
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;
}