rescheduleCalendarEntry method Null safety

Future<CalendarEntry?> rescheduleCalendarEntry(
  1. {required CalendarEntry calendarEntry,
  2. required String? placeToMeet,
  3. required String? message,
  4. required Instant date,
  5. required String userId}
)

Reschedules a calendar entry.

Implementation

Future<CalendarEntry?> rescheduleCalendarEntry({
  required final CalendarEntry calendarEntry,
  required final String? placeToMeet,
  required final String? message,
  required final Instant date,
  required final String userId,
}) async {
  final ownInvitation = calendarEntry.invitations
      .firstWhereOrNull((element) => element.participant.userId == userId);

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

  //
  // Note: we only pass the string parameters as variables below because
  // flutter_graphql chokes on the ID and Date types. Trying to supply these
  // as variables will always make the query fail.
  //
  final gqlQueryString = '''
    mutation RescheduleInvitation(\$meetingLocation: String, \$message: String) {
      rescheduleInvitation(
        invitation: "${ownInvitation.id}",
        newDateTime: "${InstantPattern.extendedIso.format(date)}",
        message: \$message,
        meetingLocation: \$meetingLocation,
      ) {
        ${InvitationGqlEntity.gqlQueryFragment}
      }
    }
  ''';

  try {
    final queryResult = await graphQLClient.mutate<void>(MutationOptions(
      document: gql(gqlQueryString),
      variables: <String, dynamic>{
        "message": message,
        "meetingLocation": placeToMeet,
      },
    ));

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

    final data =
        queryResult.data!['rescheduleInvitation'] as Map<String, dynamic>;
    final updatedCalendarEntryEntity = CalendarEntryGqlEntity.fromJson(
        data['calendarEntry'] as Map<String, dynamic>);

    if (updatedCalendarEntryEntity == null) {
      return null;
    }
    final updatedCalendarEntry = updatedCalendarEntryEntity.toCalendarEntry();
    if (!_calendarStreamController.isClosed) {
      _calendarStreamController.add([
        EntityUpdated(updatedCalendarEntry, calendarEntry),
      ].toBuiltList());
    }
    return updatedCalendarEntry;
  } catch (e, stackTrace) {
    logger?.e('Could not reschedule invitation', e.toString(), stackTrace);
    return null;
  }
}