in pkg/client/keycloak/adapter/gocloak_adapter_groups.go [217:253]
func (a GoCloakAdapter) syncSubGroups(ctx context.Context, realm string, group *gocloak.Group, subGroups []string) error {
currentGroups, err := a.makeCurrentGroups(ctx, realm, group)
if err != nil {
return err
}
claimedGroups := make(map[string]struct{}, len(subGroups))
for _, g := range subGroups {
claimedGroups[g] = struct{}{}
}
for _, claimed := range subGroups {
if _, ok := currentGroups[claimed]; !ok {
gr, err := a.getGroup(ctx, realm, claimed)
if err != nil {
return errors.Wrapf(err, "unable to get group, realm: %s, group: %s", realm, claimed)
}
if _, err := a.client.CreateChildGroup(ctx, a.token.AccessToken, realm, *group.ID, *gr); err != nil {
return errors.Wrapf(err, "unable to create child group, realm: %s, group: %s", realm, claimed)
}
}
}
for name, current := range currentGroups {
if _, ok := claimedGroups[name]; !ok {
// this is strange but if we call create group on subgroup it will be detached from parent group %)
if _, err := a.client.CreateGroup(ctx, a.token.AccessToken, realm, current); err != nil {
return errors.Wrapf(err, "unable to detach subgroup from group, realm: %s, subgroup: %s, group: %+v",
realm, name, group)
}
}
}
return nil
}