saveQuestionnaireResponse method Null safety

Future<QuestionnaireResponse?> saveQuestionnaireResponse(
  1. {required CarePlan carePlan,
  2. required QuestionnaireResponse response}
)

Implementation

Future<fhir.QuestionnaireResponse?> saveQuestionnaireResponse({
  required CarePlan carePlan,
  required fhir.QuestionnaireResponse response,
}) async {
  final questionnaireCanonical = response.questionnaire?.value.toString();
  final authoredInstant = response.authored?.valueDateTime != null
      ? ZonedDateTime.atLeniently(
              LocalDateTime.dateTime(response.authored!.valueDateTime!),
              DateTimeZone.local)
          .toInstant()
      : null;
  final jsonResponse = response.toJson();
  final itemJson = jsonResponse.containsKey("item")
      ? jsonResponse["item"] as List<dynamic>
      : <dynamic>[];
  final gqlQueryString = '''
    mutation CreateQuestionnaireResponse(\$itemJson: JSON!) {
      createQuestionnaireResponse(
        input: {
          data: {
            basedOn: "${carePlan.id}",
            ${questionnaireCanonical != null ? 'questionnaire: "$questionnaireCanonical",' : ''}
            ${authoredInstant != null ? 'authored: "${InstantPattern.extendedIso.format(authoredInstant)}",' : ''}
            status: "completed",
            item: \$itemJson,
          }
        }
      ) {
        questionnaireResponse {
          ${QuestionnaireResponseGqlEntity.gqlQueryFragment}
        }
      }
    }
  ''';

  try {
    final queryResult = await graphQLClient.mutate<void>(
      MutationOptions(
        document: gql(gqlQueryString),
        variables: {
          "itemJson": jsonEncode(itemJson),
        },
      ),
    );

    if (queryResult.hasException) {
      logger?.e(queryResult.exception.toString());
      return null;
    }

    final data = queryResult.data!['createQuestionnaireResponse']
        as Map<String, dynamic>;

    final questionnaireResponse = QuestionnaireResponseGqlEntity.fromJson(
            data['questionnaireResponse'])!
        .toQuestionnaireResponse();

    if (!_questionnaireResponseStreamController.isClosed) {
      _questionnaireResponseStreamController.add(
        [
          EntityCreated<fhir.QuestionnaireResponse>(questionnaireResponse),
        ].toBuiltList(),
      );
    }
    return questionnaireResponse;
  } catch (e, stackTrace) {
    logger?.e(
        'Could not save questionnaire response: ', e.toString(), stackTrace);
    return null;
  }
}