func()

in pkg/client/keycloak/adapter/gocloak_adapter.go [866:909]


func (a GoCloakAdapter) AddClientRoleToUser(realmName string, clientId string, user *dto.User, roleName string) error {
	log := a.log.WithValues(keycloakApiParamRole, roleName, logKeyRealm, realmName, "user", user.Username)
	log.Info("Start mapping realm role to user in Keycloak...")

	client, err := a.client.GetClients(context.Background(), a.token.AccessToken, realmName, gocloak.GetClientsParams{
		ClientID: &clientId,
	})
	if err != nil {
		return fmt.Errorf("failed to get client %s: %w", clientId, err)
	}

	if len(client) == 0 {
		return fmt.Errorf("no such client %v has been found", clientId)
	}

	role, err := a.client.GetClientRole(context.Background(), a.token.AccessToken, realmName, *client[0].ID, roleName)
	if err != nil {
		return errors.Wrap(err, "error during GetClientRole")
	}

	if role == nil {
		return errors.Errorf("no such client role %v has been found", roleName)
	}

	users, err := a.client.GetUsers(context.Background(), a.token.AccessToken, realmName, gocloak.GetUsersParams{
		Username: &user.Username,
	})
	if err != nil {
		return fmt.Errorf("failed to get user %s: %w", user.Username, err)
	}

	if len(users) == 0 {
		return fmt.Errorf("no such user %v has been found", user.Username)
	}

	err = a.addClientRoleToUser(realmName, *users[0].ID, []gocloak.Role{*role})
	if err != nil {
		return err
	}

	log.Info("Role to user has been added")

	return nil
}