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
}