getMoodEntries method Null safety

Future<BuiltList<MoodEntry>> getMoodEntries(
  1. {Instant? startDate,
  2. Instant? endDate,
  3. User? user,
  4. int limit = 1000}
)

Retrieves a list of MoodEntry records from the backend. startDate and endDate are optional. If only one is given, the method will retrieve at most 30 days from the given date. If user is specified, entries for that user will be returned. By default the backend will return data for the currently logged in user.

Implementation

Future<BuiltList<MoodEntry>> getMoodEntries(
    {Instant? startDate,
    Instant? endDate,
    User? user,
    int limit = 1000}) async {
  // set date window if unbounded
  if (startDate == null && endDate != null) {
    startDate = endDate - Time.oneDay * 30;
  } else if (startDate != null && endDate == null) {
    endDate = startDate + Time.oneDay * 30;
  }

  final userIdFilter = user != null ? 'user: "${user.userId}"' : '';
  final startDateFilter = startDate != null
      ? 'dateTime_gte: "${InstantPattern.general.format(startDate)}"'
      : '';
  final endDateFilter = endDate != null
      ? 'dateTime_lte: "${InstantPattern.general.format(endDate)}"'
      : '';

  // construct query
  final gqlQueryString = '''
    query FetchMoodEntries {
      moodEntries(
        sort: "dateTime:desc"
        limit: $limit
        where: {
          $userIdFilter
          $startDateFilter
          $endDateFilter
        }
      ) {
        ${MoodEntryGqlEntity.gqlQueryFragment}
      }
    }
  ''';

  try {
    final queryResult = await graphQLClient.query<void>(QueryOptions(
      document: gql(gqlQueryString),
      fetchPolicy: FetchPolicy.networkOnly,
    ));

    if (queryResult.hasException) {
      logger?.e(queryResult.exception.toString());
      return BuiltList<MoodEntry>();
    }

    final data = queryResult.data!['moodEntries'] as List<dynamic>;
    final l = data
        .map((dynamic e) =>
            MoodEntryGqlEntity.fromJson(e as Map<String, dynamic>))
        .where((element) => element != null)
        .map((e) => e!.toMoodEntry())
        .toBuiltList();

    if (!_lastUpdatedMoodStreamController.isClosed) {
      _lastUpdatedMoodStreamController
          .add(l.map((p0) => EntityCreated(p0)).toBuiltList());
    }

    return l;
  } catch (e, stackTrace) {
    logger?.e('Could not get list of mood entries', e.toString(), stackTrace);
    return BuiltList<MoodEntry>();
  }
}