public Mono<CancelMeetingResult> authAndCancelMeeting(
            @NotNull Long requesterId,
            @NotNull Long meetingId) {
        try {
            Validator.notNull(requesterId, "requesterId");
            Validator.notNull(meetingId, "meetingId");
        } catch (Exception e) {
            return Mono.error(e);
        }
        if (!allowCancel) {
            return Mono
                    .error(ResponseException.get(ResponseStatusCode.CANCELING_MEETING_IS_DISABLED));
        }
        if (!hasConferenceServiceProvider()) {
            return CONFERENCE_NOT_IMPLEMENTED;
        }
        return meetingRepository.findById(meetingId)
                .flatMap(meeting -> {
                    if (!requesterId.equals(meeting.getCreatorId())) {
                        return isAllowedToViewMeetingInfo(requesterId, meeting)
                                .flatMap(allowed -> allowed
                                        ? EXCEPTION_NOT_CREATOR_TO_CANCEL_MEETING
                                        : EXCEPTION_CANCEL_NONEXISTENT_MEETING);
                    }
                    return meetingRepository.inTransaction(clientSession -> meetingRepository
                            .updateCancelDateIfNotCanceled(meetingId, new Date())
                            .flatMap(updateResult -> {
                                if (updateResult.getModifiedCount() == 0) {
                                    return Mono.just(CancelMeetingResult.FAILED);
                                }
                                return pluginManager
                                        .invokeFirstExtensionPoint(ConferenceServiceProvider.class,
                                                CANCEL_MEETING_METHOD,
                                                CANCEL_MEETING_NOT_IMPLEMENTED,
                                                extensionPoint -> extensionPoint
                                                        .cancelMeeting(requesterId, meetingId))
                                        .thenReturn(new CancelMeetingResult(true, meeting));
                            }));
                })
                .switchIfEmpty(EXCEPTION_CANCEL_NONEXISTENT_MEETING);
    }
Use {@link SecureRandom} because users usually input meeting IDs to join meetings, so we
should make sure they are unpredictable.
turms-service/src/main/java/im/turms/service/domain/conference/service/ConferenceService.java