func()

in pkg/client/keycloak/adapter/gocloak_adapter.go [1233:1272]


func (a GoCloakAdapter) SyncClientProtocolMapper(
	client *dto.Client, claimedMappers []gocloak.ProtocolMapperRepresentation, addOnly bool) error {
	log := a.log.WithValues("clientId", client.ClientId)
	log.Info("Start put Client protocol mappers...")

	clientID, err := a.GetClientID(client.ClientId, client.RealmName)
	if err != nil {
		return errors.Wrap(err, "unable to get client id")
	}
	// prepare mapper entity maps for simplifying comparison procedure
	currentMappersMap, claimedMappersMap, err := a.prepareProtocolMapperMaps(client, clientID, claimedMappers)
	if err != nil {
		return errors.Wrap(err, "unable to prepare protocol mapper maps")
	}
	// compare actual client protocol mappers from keycloak to desired mappers, and sync them
	for _, claimed := range claimedMappers {
		if err := a.mapperNeedsToBeCreated(&claimed, currentMappersMap, client.RealmName, clientID); err != nil {
			return errors.Wrap(err, "error during mapperNeedsToBeCreated")
		}

		if err := a.mapperNeedsToBeUpdated(&claimed, currentMappersMap, client.RealmName, clientID); err != nil {
			return errors.Wrap(err, "error during mapperNeedsToBeUpdated")
		}
	}

	if !addOnly {
		for _, kc := range currentMappersMap {
			if _, ok := claimedMappersMap[*kc.Name]; !ok { // current mapper not exists in claimed, must be deleted
				if err := a.client.DeleteClientProtocolMapper(context.Background(), a.token.AccessToken, client.RealmName,
					clientID, *kc.ID); err != nil {
					return errors.Wrap(err, "unable to delete client protocol mapper")
				}
			}
		}
	}

	log.Info("Client protocol mapper was successfully configured!")

	return nil
}