func()

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
}