createCalendarEntry method Null safety

Future<CalendarEntry?> createCalendarEntry(
  1. {required String? placeToMeet,
  2. required Instant date,
  3. required String? message,
  4. required ContentElement activity,
  5. required User receiver}
)

Creates a new calendar entry to a given activity. Returns the CalendarEntry that was sent to the receiver on success, null on error. Note that the returned CalendarEntry has the invitation status for each participant of the event.

Implementation

Future<CalendarEntry?> createCalendarEntry({
  required final String? placeToMeet,
  required final Instant date,
  required final String? message,
  required final ContentElement activity,
  required final User receiver,
}) async {
  //
  // 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 CreateCalendarInvitation(\$meetingLocation: String, \$message: String) {
      createCalendarInvitation(
            dateTime: "${InstantPattern.general.format(date)}"
            activity: "${activity.id}"
            participants: ["${receiver.userId}"]
            meetingLocation: \$meetingLocation
            message: \$message
      ) {
        ${InvitationGqlEntity.gqlQueryFragment}
      }
    }
  ''';

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

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

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

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

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

    final newCalendarEntry = calendarEntryEntity.toCalendarEntry();
    if (!_calendarStreamController.isClosed) {
      _calendarStreamController
          .add([EntityCreated(newCalendarEntry)].toBuiltList());
    }
    return newCalendarEntry;
  } catch (e, stackTrace) {
    logger?.e('Could not create calendar entry', e.toString(), stackTrace);
    return null;
  }
}