createSupporter method Null safety

Future<Supporter?> createSupporter(
  1. {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;
  }
}