createPatient method Null safety

Future<Patient?> createPatient(
  1. {required String firebaseUid}
)

Creates a new patient in the backend and returns the current instance. If a patient already exists, returns the existing instance. The patient is referenced by its Firebase uid. Throws an exception if an error occurred.

Implementation

Future<Patient?> createPatient({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 patient 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 CreatePatient {
        createPatient(
          input: {
            data: {
              user: "$userId"
            }
          }
        ) {
          patient {
            ${PatientGqlEntity.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 patientData =
        queryResult.data!['createPatient']['patient'] as Map<String, dynamic>;

    if (patientData.isNotEmpty) {
      final patientGqlEntity = PatientGqlEntity.fromJson(patientData);

      if (patientGqlEntity != null) {
        return patientGqlEntity.toPatient();
      }
    }

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