uploadMoodEntry method Null safety

Future<MoodEntry?> uploadMoodEntry(
  1. {required MoodEntry entry}
)

Uploads a lMoodEntry to the backend. Returns created MoodEntry on success, null on failure.

Implementation

Future<MoodEntry?> uploadMoodEntry({required MoodEntry entry}) async {
  final gqlQueryString = '''
    mutation UploadMoodEntries {
      createMoodEntry(input: { data: {mood: ${MoodType.toDatabaseFormat(moodType: entry.mood)}, dateTime: "${InstantPattern.extendedIso.format(entry.dateTime)}"}}) { moodEntry { ${MoodEntryGqlEntity.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 data = queryResult.data!['createMoodEntry'] as Map<String, dynamic>;

    final moodGqlEntry = MoodEntryGqlEntity.fromJson(
        data['moodEntry'] as Map<String, dynamic>);

    if (moodGqlEntry == null) {
      return null;
    }

    final moodEntry = moodGqlEntry.toMoodEntry();

    if (!_lastUpdatedMoodStreamController.isClosed) {
      _lastUpdatedMoodStreamController
          .add([EntityCreated(moodEntry)].toBuiltList());
    }

    return moodEntry;
  } catch (e, stackTrace) {
    logger?.e('Could not upload mood data', e, stackTrace);
    return null;
  }
}