public Mono<AdminRole> authAndAddAdminRole(
            @NotNull Long requesterId,
            @NotNull Long roleId,
            @NotNull @NoWhitespace @Size(
                    min = MIN_ROLE_NAME_LIMIT,
                    max = MAX_ROLE_NAME_LIMIT) String name,
            @NotEmpty Set<AdminPermission> permissions,
            @NotNull Integer rank) {
        try {
            Validator.notNull(roleId, "roleId");
            Validator.notNull(name, "name");
            Validator.noWhitespace(name, "name");
            Validator.length(name, "name", MIN_ROLE_NAME_LIMIT, MAX_ROLE_NAME_LIMIT);
            Validator.notEmpty(permissions, "permissions");
        } catch (ResponseException e) {
            return Mono.error(e);
        }
        if (roleId.equals(ADMIN_ROLE_ROOT_ID)) {
            return Mono.error(ResponseException.get(ResponseStatusCode.UNAUTHORIZED,
                    "The new role ID cannot be the root role ID"));
        }
        return isAdminRankHigherThanRank(requesterId, rank)
                .switchIfEmpty(adminService.errorRequesterNotExist())
                .flatMap(isHigher -> isHigher
                        ? queryPermissions(requesterId)
                                .switchIfEmpty(adminService.errorRequesterNotExist())
                        : MONO_ERROR_UPDATE_ROLE_WITH_HIGHER_RANK)
                .flatMap(requesterPermissions -> {
                    if (requesterPermissions.containsAll(permissions)) {
                        return addAdminRole(roleId, name, permissions, rank);
                    }
                    TreeSet<AdminPermission> missingPermissions = new TreeSet<>(permissions);
                    missingPermissions.removeAll(requesterPermissions);
                    return Mono.error(ResponseException.get(ResponseStatusCode.UNAUTHORIZED,
                            "The requester does not have the permissions: "
                                    + missingPermissions));
                });
    }
@param adminService is lazy because: AdminService -> AdminRoleService -> AdminService
turms-service/src/main/java/im/turms/service/domain/admin/service/AdminRoleService.java