createPractitioner method Null safety

Future<Practitioner?> createPractitioner(
  1. {required String firebaseUid}
)

Implementation

Future<Practitioner?> createPractitioner(
    {required final 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 practitioner already exists in backend',
        e, stackTrace);
    rethrow;
  }

  // return error if we could not query the corresponding user instance id
  if (userId == null) {
    return null;
  }

  final gqlQueryString = '''
      mutation CreatePractitioner {
        createPractitioner(
          input: {
            data: {
              user: "$userId"
            }
          }
        ) {
          practitioner {
            ${PractitionerGqlEntity.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 practitionerData = queryResult.data!['createPractitioner']
        ['practitioner'] as Map<String, dynamic>;

    if (practitionerData.isNotEmpty) {
      final practitionerGqlEntity =
          PractitionerGqlEntity.fromJson(practitionerData);

      if (practitionerGqlEntity != null) {
        return practitionerGqlEntity.toPractitioner();
      }
    }

    return null;
  } catch (e, stackTrace) {
    logger?.e('Could not create practitioner instance', e, stackTrace);
    rethrow;
  }
}