public Mono<LongsWithVersion> queryRelatedUserIdsWithVersion(
            @NotNull Long ownerId,
            @Nullable Set<Integer> groupIndexes,
            @Nullable Boolean isBlocked,
            @Nullable Date lastUpdatedDate) {
        return userVersionService.queryRelationshipsLastUpdatedDate(ownerId)
                .flatMap(date -> {
                    if (DateTimeUtil.isAfterOrSame(lastUpdatedDate, date)) {
                        return ResponseExceptionPublisherPool.alreadyUpToUpdate();
                    }
                    Recyclable<Set<Long>> recyclableSet = SetRecycler.obtain();
                    return queryRelatedUserIds(Set.of(ownerId), groupIndexes, isBlocked)
                            .collect(Collectors.toCollection(recyclableSet::getValue))
                            .map(relatedUserIds -> {
                                if (relatedUserIds.isEmpty()) {
                                    throw ResponseException.get(ResponseStatusCode.NO_CONTENT);
                                }
                                if (isBlocked != null) {
                                    Pair<Long, Long> cacheKey;
                                    for (Long relatedUserId : relatedUserIds) {
                                        cacheKey = Pair.of(ownerId, relatedUserId);
                                        ownerIdAndRelatedUserIdToHasRelationshipAndNotBlockedCache
                                                .put(cacheKey, !isBlocked);
                                        ownerIdAndRelatedUserIdToIsBlockedCache.put(cacheKey,
                                                isBlocked);
                                    }
                                }
                                return ClientMessagePool.getLongsWithVersionBuilder()
                                        .setLastUpdatedDate(date.getTime())
                                        .addAllLongs(relatedUserIds)
                                        .build();
                            })
                            .doFinally(signalType -> recyclableSet.recycle());
                })
                .switchIfEmpty(ResponseExceptionPublisherPool.alreadyUpToUpdate());
    }
@return true if the relationship existed and has been deleted;
        <p>
        false if the relationship does not exist, or still exists and has been deleted from a
        relationship group.
turms-service/src/main/java/im/turms/service/domain/user/service/UserRelationshipService.java