func()

in pkg/client/keycloak/adapter/gocloak_adapter.go [1076:1119]


func (a GoCloakAdapter) processAssociatedClientRoles(ctx context.Context, realmName string, role *dto.PrimaryRealmRole, associatedRoles map[string]gocloak.Role) ([]gocloak.Role, error) {
	rolesToAdd := make([]gocloak.Role, 0)
	group := errgroup.Group{}
	m := sync.Mutex{}

	for cl, composite := range role.CompositesClientRoles {
		roles := composite

		client, err := a.GetClient(ctx, realmName, cl)
		if err != nil {
			return nil, fmt.Errorf("unable to get client %s: %w", cl, err)
		}

		for _, r := range roles {
			roleName := r
			clientID := *client.ID
			mapKey := fmt.Sprintf("%s-%s", clientID, roleName)

			if _, ok := associatedRoles[mapKey]; ok {
				delete(associatedRoles, mapKey)
				continue
			}

			group.Go(func() error {
				compositeRole, err := a.client.GetClientRole(ctx, a.token.AccessToken, realmName, clientID, roleName)
				if err != nil {
					return fmt.Errorf("unable to get client role %s: %w", roleName, err)
				}

				m.Lock()
				rolesToAdd = append(rolesToAdd, *compositeRole)
				m.Unlock()

				return nil
			})
		}
	}

	if err := group.Wait(); err != nil {
		return nil, fmt.Errorf("unable to get realm roles: %w", err)
	}

	return rolesToAdd, nil
}