in pkg/client/keycloak/adapter/gocloak_adapter_user.go [130:176]
func (a GoCloakAdapter) syncUserGroups(ctx context.Context, realmName string, userID string, groups []string, addOnly bool) error {
userGroups, err := a.GetUserGroupMappings(ctx, realmName, userID)
if err != nil {
return err
}
groupsToAdd := make([]string, 0, len(groups))
for _, gn := range groups {
if !slices.ContainsFunc(userGroups, func(mapping UserGroupMapping) bool {
return mapping.Name == gn
}) {
groupsToAdd = append(groupsToAdd, gn)
}
}
if len(groupsToAdd) > 0 {
var kcGroups map[string]gocloak.Group
kcGroups, err = a.getGroupsByNames(
ctx,
realmName,
groupsToAdd,
)
if err != nil {
return fmt.Errorf("unable to get groups: %w", err)
}
for _, gr := range kcGroups {
if err = a.AddUserToGroup(ctx, realmName, userID, *gr.ID); err != nil {
return fmt.Errorf("failed to add user to group %v: %w", gr.Name, err)
}
}
}
if !addOnly {
for _, gr := range userGroups {
if !slices.Contains(groups, gr.Name) {
if err = a.RemoveUserFromGroup(ctx, realmName, userID, gr.ID); err != nil {
return fmt.Errorf("unable to remove user from group: %w", err)
}
}
}
}
return nil
}