public Flux<AdminRole> queryAndCacheRolesByRoleIdsAndRankGreaterThan(
            @NotNull Collection<Long> roleIds,
            @NotNull Integer rankGreaterThan) {
        try {
            Validator.notNull(roleIds, "roleIds");
            Validator.notNull(rankGreaterThan, "rankGreaterThan");
        } catch (ResponseException e) {
            return Flux.error(e);
        }
        if (roleIds.isEmpty()) {
            return Flux.empty();
        }
        if (roleIds.contains(ADMIN_ROLE_ROOT_ID)) {
            AdminRole rootRole = getRootRole();
            if (roleIds.size() == 1) {
                return rootRole.getRank() > rankGreaterThan
                        ? Flux.just(rootRole)
                        : Flux.empty();
            }
            roleIds = new UnifiedSet<>(roleIds);
            roleIds.remove(ADMIN_ROLE_ROOT_ID);
            Flux<AdminRole> adminRoleFlux = adminRoleRepository
                    .findAdminRolesByIdsAndRankGreaterThan(roleIds, rankGreaterThan)
                    .doOnNext(role -> idToRole.put(role.getId(), role));
            return rootRole.getRank() > rankGreaterThan
                    ? adminRoleFlux.startWith(rootRole)
                    : adminRoleFlux;
        }
        return adminRoleRepository.findAdminRolesByIdsAndRankGreaterThan(roleIds, rankGreaterThan)
                .doOnNext(role -> idToRole.put(role.getId(), role));
    }
@param adminService is lazy because: AdminService -> AdminRoleService -> AdminService
turms-service/src/main/java/im/turms/service/domain/admin/service/AdminRoleService.java