createSupporter method Null safety
- {required String firebaseUid}
Creates a new supporter in the backend and returns the current instance. If a supporter already exists, returns the existing instance. The supporter is referenced by its Firebase uid. Throws an exception if an error occurred.
Implementation
Future<Supporter?> createSupporter({required String firebaseUid}) async {
// get ID of user instance
final userGqlQueryString = '''
query FindUser {
users(
where: {
firebaseUid: "$firebaseUid"
}
) {
id
${UserGqlEntity.gqlQueryFragment}
}
}
''';
String? userId;
List<dynamic> userData;
try {
final queryResult = await graphQLClient.query<void>(QueryOptions(
document: gql(userGqlQueryString),
fetchPolicy: FetchPolicy.networkOnly,
));
if (queryResult.hasException) {
logger?.e(queryResult.exception.toString());
throw queryResult.exception!;
}
userData = queryResult.data!['users'] as List<dynamic>;
if (userData.isNotEmpty) {
userId = userData.first['id'] as String;
}
} catch (e, stackTrace) {
logger?.e('Could not determine if supporter instance already exists', e,
stackTrace);
rethrow;
}
// return error if we could not query the corresponding user instance id
if (userId == null) {
return null;
}
final gqlQueryString = '''
mutation CreateSupporter {
createSupporter(
input: {
data: {
user: "$userId"
}
}
) {
supporter {
${SupporterGqlEntity.gqlQueryFragment}
}
}
}
''';
try {
final queryResult = await graphQLClient.mutate<void>(MutationOptions(
document: gql(gqlQueryString),
fetchPolicy: FetchPolicy.networkOnly,
));
if (queryResult.hasException) {
logger?.e(queryResult.exception.toString());
throw queryResult.exception!;
}
final supporterData = queryResult.data!['createSupporter']['supporter']
as Map<String, dynamic>;
if (supporterData.isNotEmpty) {
final supporterGqlEntity = SupporterGqlEntity.fromJson(supporterData);
if (supporterGqlEntity != null) {
return supporterGqlEntity.toSupporter();
}
}
return null;
} catch (e, stackTrace) {
logger?.e(
'Could not create supporter instance in backend', e, stackTrace);
rethrow;
}
}