private <T> Mono<T> checkIfAllowedToManageRoles(
            @NotNull Long requesterId,
            @NotEmpty Set<Long> roleIds,
            @NotNull Mono<T> noOpResult,
            @NotNull Supplier<Mono<T>> task) {
        return Mono.zip(
                queryHighestRankByAdminId(requesterId)
                        .switchIfEmpty(adminService.errorRequesterNotExist()),
                queryAndCacheRolesByRoleIds(roleIds).collect(CollectorUtil.toList(roleIds.size())))
                .flatMap(tuple -> {
                    List<AdminRole> targetRoles = tuple.getT2();
                    if (targetRoles.isEmpty()) {
                        return noOpResult;
                    }
                    Integer requesterAdminRank = tuple.getT1();
                    TreeSet<Long> higherOrEqualRankTargetRoleIds = null;
                    for (AdminRole targetRole : targetRoles) {
                        if (targetRole.getRank() >= requesterAdminRank) {
                            if (higherOrEqualRankTargetRoleIds == null) {
                                higherOrEqualRankTargetRoleIds = new TreeSet<>();
                            }
                            higherOrEqualRankTargetRoleIds.add(targetRole.getId());
                        }
                    }
                    if (higherOrEqualRankTargetRoleIds == null) {
                        return task.get();
                    }
                    return Mono.error(ResponseException.get(ResponseStatusCode.UNAUTHORIZED,
                            "Only lower-rank roles can be created, updated, or deleted. "
                                    + "The following roles have an equal or higher rank than the requester: "
                                    + higherOrEqualRankTargetRoleIds));
                });
    }
@param adminService is lazy because: AdminService -> AdminRoleService -> AdminService
turms-service/src/main/java/im/turms/service/domain/admin/service/AdminRoleService.java