public Mono<AdminRole> addAdminRole(
            @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");
            Validator.notNull(rank, "rank");
        } 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"));
        }
        AdminRole adminRole = new AdminRole(roleId, name, permissions, rank, new Date());
        return adminRoleRepository.insert(adminRole)
                .then(Mono.fromCallable(() -> {
                    idToRole.put(adminRole.getId(), adminRole);
                    return adminRole;
                }));
    }
@param adminService is lazy because: AdminService -> AdminRoleService -> AdminService
turms-service/src/main/java/im/turms/service/domain/admin/service/AdminRoleService.java