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
}