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;
}
}