getPatient method Null safety

Future<Patient?> getPatient(
  1. {String? firebaseUid,
  2. String? patientId}
)

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

Implementation

Future<Patient?> getPatient({String? firebaseUid, String? patientId}) async {
  if (firebaseUid == null && patientId == null) {
    return null;
  }

  late String gqlQueryString;
  if (firebaseUid != null) {
    gqlQueryString = '''
      query RetrievePatient {
        patients(
          where: {
            user: {
              firebaseUid: "$firebaseUid"
            }
          }
        ) {
          ${PatientGqlEntity.gqlQueryFragment}
        }
      }
    ''';
  } else {
    gqlQueryString = '''
      query RetrievePatient {
        patients(
          where: {
            id: "$patientId"
          }
        ) {
          ${PatientGqlEntity.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!['patients'] as List<dynamic>;

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

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

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