func()

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
}