getSupporter method Null safety

Future<Supporter?> getSupporter(
  1. {String? firebaseUid,
  2. String? supporterId}
)

Retrieves a supporter instance either by its Firebase uid or instance id. Returns null if supporter does not exist Throws an exception if an error occurred.

Implementation

Future<Supporter?> getSupporter(
    {String? firebaseUid, String? supporterId}) async {
  late String gqlQueryString;

  if (firebaseUid == null && supporterId == null) {
    return null;
  }

  if (firebaseUid != null) {
    gqlQueryString = '''
      query RetrieveSupporter {
        supporters(
          where: {
            user: {
              firebaseUid: "$firebaseUid"
            }
          }
        ) {
          ${SupporterGqlEntity.gqlQueryFragment}
        }
      }
    ''';
  } else {
    gqlQueryString = '''
      query RetrieveSupporter {
        supporters(
          where: {
            id: "$supporterId"
          }
        ) {
          ${SupporterGqlEntity.gqlQueryFragment}
        }
      }
    ''';
  }
  try {
    final queryResult = await graphQLClient.query<void>(QueryOptions(
      document: gql(gqlQueryString),
      fetchPolicy: FetchPolicy.networkOnly,
    ));

    if (queryResult.hasException) {
      logger?.e(queryResult.exception.toString());
      throw queryResult.exception!;
    }

    final data = queryResult.data!['supporters'] as List<dynamic>;

    if (data.isNotEmpty) {
      // merge in all properties from the base user entity
      final supporterData = data.first as Map<String, dynamic>;
      final supporterGqlFragment = SupporterGqlEntity.fromJson(supporterData);

      if (supporterGqlFragment != null) {
        return supporterGqlFragment.toSupporter();
      }
    }

    return null;
  } catch (e, stackTrace) {
    logger?.e(
        'Could not retrieve supporter instance from backend', e, stackTrace);
    rethrow;
  }
}