public Flux<Meeting> authAndQueryMeetings(
            @NotNull Long requesterId,
            @Nullable Set<Long> ids,
            @Nullable Set<Long> creatorIds,
            @Nullable Set<Long> userIds,
            @Nullable Set<Long> groupIds,
            @Nullable Date creationDateStart,
            @Nullable Date creationDateEnd,
            @Nullable Integer skip,
            @Nullable Integer limit) {
        try {
            Validator.notNull(requesterId, "requesterId");
        } catch (Exception e) {
            return Flux.error(e);
        }
        int creatorIdCount = CollectionUtil.getSize(creatorIds);
        int userIdCount = CollectionUtil.getSize(userIds);
        int groupIdCount = CollectionUtil.getSize(groupIds);
        if (userIdCount > 0) {
            if (groupIdCount > 0) {
                return Flux.empty();
            }
            if (userIdCount == 1 && userIds.contains(requesterId)) {
                return meetingRepository.find(ids,
                        creatorIds,
                        userIds,
                        null,
                        creationDateStart,
                        creationDateEnd,
                        skip,
                        limit);
            }
            return switch (creatorIdCount) {
                case 0 -> meetingRepository.find(ids,
                        Set.of(requesterId),
                        userIds,
                        null,
                        creationDateStart,
                        creationDateEnd,
                        skip,
                        limit);
                case 1 -> {
                    if (creatorIds.contains(requesterId)) {
                        yield meetingRepository.find(ids,
                                creatorIds,
                                userIds,
                                null,
                                creationDateStart,
                                creationDateEnd,
                                skip,
                                limit);
                    } else {
                        yield Flux.empty();
                    }
                }
                default -> Flux.empty();
            };
        }
        if (groupIdCount == 0) {
            if (creatorIdCount == 0) {
                return meetingRepository.find(ids,
                        requesterId,
                        requesterId,
                        creationDateStart,
                        creationDateEnd,
                        skip,
                        limit);
            } else if (creatorIdCount == 1 && creatorIds.contains(requesterId)) {
                return meetingRepository.find(ids,
                        creatorIds,
                        null,
                        null,
                        creationDateStart,
                        creationDateEnd,
                        skip,
                        limit);
            } else {
                return Flux.empty();
            }
        }
        Recyclable<List<Long>> recyclableList = ListRecycler.obtain();
        return groupMemberService.queryUserJoinedGroupIds(requesterId)
                .collect(Collectors.toCollection(recyclableList::getValue))
                .flatMapMany(joinedGroupIds -> {
                    if (joinedGroupIds.isEmpty()) {
                        return Flux.empty();
                    }
                    joinedGroupIds.clear();
                    return meetingRepository.find(ids,
                            creatorIds,
                            null,
                            joinedGroupIds,
                            creationDateStart,
                            creationDateEnd,
                            skip,
                            limit);
                })
                .doFinally(signalType -> recyclableList.recycle());
    }
TODO: Allow developers to configuring whether a meeting invitation can only be updated once.
turms-service/src/main/java/im/turms/service/domain/conference/service/ConferenceService.java