diff --git a/src/main/java/org/folio/bulkops/domain/entity/BulkOperationRuleDetails.java b/src/main/java/org/folio/bulkops/domain/entity/BulkOperationRuleDetails.java index 88905ec36..888f2fea3 100644 --- a/src/main/java/org/folio/bulkops/domain/entity/BulkOperationRuleDetails.java +++ b/src/main/java/org/folio/bulkops/domain/entity/BulkOperationRuleDetails.java @@ -48,4 +48,5 @@ public class BulkOperationRuleDetails { private List actionTenants; private List ruleTenants; + private List updatedTenants; } diff --git a/src/main/java/org/folio/bulkops/processor/AbstractDataProcessor.java b/src/main/java/org/folio/bulkops/processor/AbstractDataProcessor.java index fc7d0c353..503c9529f 100644 --- a/src/main/java/org/folio/bulkops/processor/AbstractDataProcessor.java +++ b/src/main/java/org/folio/bulkops/processor/AbstractDataProcessor.java @@ -104,7 +104,7 @@ public UpdatedEntityHolder process(String identifier, T entity, BulkOperationRul public String getRecordPropertyName(UpdateOptionType optionType) { return switch (optionType) { - case HOLDINGS_NOTE, ITEM_NOTE -> "note type"; + case HOLDINGS_NOTE, ITEM_NOTE, ADMINISTRATIVE_NOTE, CHECK_IN_NOTE, CHECK_OUT_NOTE -> "note type"; case PERMANENT_LOAN_TYPE -> "permanent loan type"; case TEMPORARY_LOAN_TYPE -> "temporary loan type"; case PERMANENT_LOCATION -> "permanent location"; @@ -113,12 +113,4 @@ public String getRecordPropertyName(UpdateOptionType optionType) { default -> optionType.getValue(); }; } - - public String getTenantFromAction(Action action) { - var actionTenants = action.getTenants(); - if (isNull(actionTenants) || actionTenants.isEmpty()) { - return folioExecutionContext.getTenantId(); - } - return actionTenants.get(0); - } } diff --git a/src/main/java/org/folio/bulkops/processor/ElectronicAccessUpdaterFactory.java b/src/main/java/org/folio/bulkops/processor/ElectronicAccessUpdaterFactory.java index cca8b98a4..ef20d18cb 100644 --- a/src/main/java/org/folio/bulkops/processor/ElectronicAccessUpdaterFactory.java +++ b/src/main/java/org/folio/bulkops/processor/ElectronicAccessUpdaterFactory.java @@ -5,21 +5,30 @@ import static java.util.Optional.ofNullable; import static org.apache.commons.lang3.StringUtils.EMPTY; import static org.apache.commons.lang3.StringUtils.equalsIgnoreCase; +import static org.folio.bulkops.util.Constants.ARRAY_DELIMITER; -import org.folio.bulkops.domain.bean.ElectronicAccessEntity; +import lombok.AllArgsConstructor; +import lombok.extern.log4j.Log4j2; +import org.folio.bulkops.domain.bean.ExtendedHoldingsRecord; import org.folio.bulkops.domain.dto.Action; import org.folio.bulkops.domain.dto.UpdateOptionType; import org.folio.bulkops.exception.BulkOperationException; +import org.folio.bulkops.util.RuleUtils; +import org.folio.spring.FolioExecutionContext; import org.springframework.stereotype.Component; import java.util.Objects; @Component +@Log4j2 +@AllArgsConstructor public class ElectronicAccessUpdaterFactory { - public Updater updater(UpdateOptionType option, Action action) { + private final FolioExecutionContext folioExecutionContext; + + public Updater updater(UpdateOptionType option, Action action, boolean forPreview) { return switch (option) { - case ELECTRONIC_ACCESS_URL_RELATIONSHIP -> updateUrlRelationship(option, action); + case ELECTRONIC_ACCESS_URL_RELATIONSHIP -> updateUrlRelationship(option, action, forPreview); case ELECTRONIC_ACCESS_URI -> updateUri(option, action); case ELECTRONIC_ACCESS_LINK_TEXT -> updateLinkText(option, action); case ELECTRONIC_ACCESS_MATERIALS_SPECIFIED -> updateMaterialsSpecified(option, action); @@ -28,7 +37,7 @@ public Updater updater(UpdateOptionType option }; } - private Updater updateUrlRelationship(UpdateOptionType option, Action action) { + private Updater updateUrlRelationship(UpdateOptionType option, Action action, boolean forPreview) { return switch (action.getType()) { case CLEAR_FIELD -> electronicAccessEntity -> ofNullable(electronicAccessEntity.getElectronicAccess()) .ifPresent(list -> list.forEach(electronicAccess -> electronicAccess.setRelationshipId(null))); @@ -39,14 +48,22 @@ private Updater updateUrlRelationship(UpdateOp case FIND_AND_REPLACE -> electronicAccessEntity -> ofNullable(electronicAccessEntity.getElectronicAccess()) .ifPresent(list -> list.stream() .filter(electronicAccess -> equalsIgnoreCase(electronicAccess.getRelationshipId(), action.getInitial())) - .forEach(electronicAccess -> electronicAccess.setRelationshipId(action.getUpdated()))); + .forEach(electronicAccess -> electronicAccess.setRelationshipId(getRelationshipId(action, forPreview)))); case REPLACE_WITH -> electronicAccessEntity -> ofNullable(electronicAccessEntity.getElectronicAccess()) - .ifPresent(list -> list.forEach(electronicAccess -> electronicAccess.setRelationshipId(action.getUpdated()))); + .ifPresent(list -> list.forEach(electronicAccess -> electronicAccess.setRelationshipId(getRelationshipId(action, forPreview)))); default -> notSupported(option, action); }; } - private Updater updateUri(UpdateOptionType option, Action action) { + private String getRelationshipId(Action action, boolean forPreview) { + var id = action.getUpdated(); + if (forPreview) { + id += ARRAY_DELIMITER + RuleUtils.getTenantFromAction(action, folioExecutionContext); + } + return id; + } + + private Updater updateUri(UpdateOptionType option, Action action) { return switch (action.getType()) { case CLEAR_FIELD -> electronicAccessEntity -> ofNullable(electronicAccessEntity.getElectronicAccess()) .ifPresent(list -> list.forEach(electronicAccess -> electronicAccess.setUri(EMPTY))); @@ -64,7 +81,7 @@ private Updater updateUri(UpdateOptionType opt }; } - private Updater updateLinkText(UpdateOptionType option, Action action) { + private Updater updateLinkText(UpdateOptionType option, Action action) { return switch (action.getType()) { case CLEAR_FIELD -> electronicAccessEntity -> ofNullable(electronicAccessEntity.getElectronicAccess()) .ifPresent(list -> list.forEach(electronicAccess -> electronicAccess.setLinkText(null))); @@ -82,7 +99,7 @@ private Updater updateLinkText(UpdateOptionTyp }; } - private Updater updateMaterialsSpecified(UpdateOptionType option, Action action) { + private Updater updateMaterialsSpecified(UpdateOptionType option, Action action) { return switch (action.getType()) { case CLEAR_FIELD -> electronicAccessEntity -> ofNullable(electronicAccessEntity.getElectronicAccess()) .ifPresent(list -> list.forEach(electronicAccess -> electronicAccess.setMaterialsSpecification(null))); @@ -100,7 +117,7 @@ private Updater updateMaterialsSpecified(Updat }; } - private Updater updatePublicNote(UpdateOptionType option, Action action) { + private Updater updatePublicNote(UpdateOptionType option, Action action) { return switch (action.getType()) { case CLEAR_FIELD -> electronicAccessEntity -> ofNullable(electronicAccessEntity.getElectronicAccess()) .ifPresent(list -> list.forEach(electronicAccess -> electronicAccess.setPublicNote(null))); @@ -118,7 +135,7 @@ private Updater updatePublicNote(UpdateOptionT }; } - private Updater notSupported(UpdateOptionType option, Action action) { + private Updater notSupported(UpdateOptionType option, Action action) { return electronicAccessEntity -> { throw new BulkOperationException(format("Combination %s and %s isn't supported yet", option, action.getType())); }; diff --git a/src/main/java/org/folio/bulkops/processor/HoldingsDataProcessor.java b/src/main/java/org/folio/bulkops/processor/HoldingsDataProcessor.java index c5ac95f8a..950ce8bd7 100644 --- a/src/main/java/org/folio/bulkops/processor/HoldingsDataProcessor.java +++ b/src/main/java/org/folio/bulkops/processor/HoldingsDataProcessor.java @@ -1,6 +1,7 @@ package org.folio.bulkops.processor; import static java.lang.String.format; +import static java.util.Objects.isNull; import static java.util.Objects.nonNull; import static org.apache.commons.lang3.ObjectUtils.isEmpty; import static org.folio.bulkops.domain.dto.UpdateActionType.CLEAR_FIELD; @@ -41,6 +42,7 @@ import org.folio.bulkops.service.HoldingsReferenceService; import org.folio.bulkops.service.ItemReferenceService; import org.folio.bulkops.service.ElectronicAccessReferenceService; +import org.folio.bulkops.util.RuleUtils; import org.folio.spring.scope.FolioExecutionContextSetter; import org.springframework.stereotype.Component; @@ -88,15 +90,12 @@ public Validator validator(Extended public Updater updater(UpdateOptionType option, Action action, ExtendedHoldingsRecord entity, boolean forPreview) throws RuleValidationTenantsException { if (isElectronicAccessUpdate(option)) { - if (nonNull(entity.getEntity().getElectronicAccess())) { - entity.getEntity().getElectronicAccess().forEach(el -> el.setTenantId(getTenantFromAction(action))); - } - return (Updater) electronicAccessUpdaterFactory.updater(option, action); + return electronicAccessUpdaterFactory.updater(option, action, forPreview); } else if (REPLACE_WITH == action.getType()) { return extendedHoldingsRecord -> { var locationId = action.getUpdated(); if (forPreview) { - var tenant = getTenantFromAction(action); + var tenant = RuleUtils.getTenantFromAction(action, folioExecutionContext); locationId += ARRAY_DELIMITER + tenant; } if (PERMANENT_LOCATION == option) { @@ -118,10 +117,9 @@ public Updater updater(UpdateOptionType option, Action a return extendedHoldingsRecord -> extendedHoldingsRecord.getEntity().setDiscoverySuppress(false); } var notesUpdaterOptional = holdingsNotesUpdater.updateNotes(action, option); - if (notesUpdaterOptional.isPresent()) return notesUpdaterOptional.get(); - return holding -> { + return notesUpdaterOptional.orElseGet(() -> holding -> { throw new BulkOperationException(format("Combination %s and %s isn't supported yet", option, action.getType())); - }; + }); } private void validateReplacement(UpdateOptionType option, Action action) throws RuleValidationException { @@ -134,7 +132,7 @@ private void validateReplacement(UpdateOptionType option, Action action) throws throw new RuleValidationException("UUID has invalid format: %s" + newId); } - var tenant = getTenantFromAction(action); + var tenant = RuleUtils.getTenantFromAction(action, folioExecutionContext); if (Set.of(PERMANENT_LOCATION, TEMPORARY_LOCATION).contains(option)) { try (var ignored = new FolioExecutionContextSetter(prepareContextForTenant(tenant, folioModuleMetadata, folioExecutionContext))) { itemReferenceService.getLocationById(newId, tenant); @@ -143,9 +141,10 @@ private void validateReplacement(UpdateOptionType option, Action action) throws } } else if (ELECTRONIC_ACCESS_URL_RELATIONSHIP.equals(option)) { try (var ignored = new FolioExecutionContextSetter(prepareContextForTenant(tenant, folioModuleMetadata, folioExecutionContext))) { + log.info("ELECTRONIC_ACCESS_URL_RELATIONSHIP.equals(option), tenant: {}", tenant); electronicAccessReferenceService.getRelationshipNameById(newId, tenant); } catch (Exception e) { - throw new RuleValidationException(format("URL relationship %s doesn't exist", newId)); + throw new RuleValidationException(format("URL relationship %s doesn't exist in tenant %s", newId, tenant)); } } } @@ -185,6 +184,10 @@ public ExtendedHoldingsRecord clone(ExtendedHoldingsRecord extendedEntity) { var holdingsNotes = entity.getNotes().stream().map(note -> note.toBuilder().build()).toList(); clone.setNotes(new ArrayList<>(holdingsNotes)); } + if (entity.getElectronicAccess() != null) { + var elAcc = entity.getElectronicAccess().stream().map(el -> el.toBuilder().build()).toList(); + clone.setElectronicAccess(new ArrayList<>(elAcc)); + } return ExtendedHoldingsRecord.builder().tenantId(extendedEntity.getTenantId()).entity(clone).build(); } @@ -210,7 +213,8 @@ private boolean ruleTenantsAreNotValid(BulkOperationRule rule, Action action, Up } if (nonNull(ruleTenants) && nonNull(actionTenants) && ruleTenants.isEmpty() && actionTenants.isEmpty() && option == ELECTRONIC_ACCESS_URL_RELATIONSHIP && action.getType() == UpdateActionType.FIND_AND_REPLACE) { - return true; + return isNull(extendedHolding.getElectronicAccess()) || + extendedHolding.getElectronicAccess().stream().noneMatch(el -> el.getRelationshipId().equals(action.getUpdated())); } return nonNull(ruleTenants) && !ruleTenants.isEmpty() && !ruleTenants.contains(extendedHolding.getTenant()) || nonNull(actionTenants) && !actionTenants.isEmpty() && !actionTenants.contains(extendedHolding.getTenant()); diff --git a/src/main/java/org/folio/bulkops/processor/ItemDataProcessor.java b/src/main/java/org/folio/bulkops/processor/ItemDataProcessor.java index 90ecc2536..859e5a5a3 100644 --- a/src/main/java/org/folio/bulkops/processor/ItemDataProcessor.java +++ b/src/main/java/org/folio/bulkops/processor/ItemDataProcessor.java @@ -32,6 +32,7 @@ import org.folio.bulkops.exception.RuleValidationTenantsException; import org.folio.bulkops.service.HoldingsReferenceService; import org.folio.bulkops.service.ItemReferenceService; +import org.folio.bulkops.util.RuleUtils; import org.folio.spring.scope.FolioExecutionContextSetter; import org.springframework.stereotype.Component; @@ -100,11 +101,11 @@ public Updater updater(UpdateOptionType option, Action action, Ext return switch (option) { case PERMANENT_LOCATION -> extendedItem -> { extendedItem.getEntity().setPermanentLocation(null); - extendedItem.getEntity().setEffectiveLocation(getEffectiveLocation(extendedItem.getEntity(), getTenantFromAction(action))); + extendedItem.getEntity().setEffectiveLocation(getEffectiveLocation(extendedItem.getEntity(), RuleUtils.getTenantFromAction(action, folioExecutionContext))); }; case TEMPORARY_LOCATION -> extendedItem -> { extendedItem.getEntity().setTemporaryLocation(null); - extendedItem.getEntity().setEffectiveLocation(getEffectiveLocation(extendedItem.getEntity(), getTenantFromAction(action))); + extendedItem.getEntity().setEffectiveLocation(getEffectiveLocation(extendedItem.getEntity(), RuleUtils.getTenantFromAction(action, folioExecutionContext))); }; case TEMPORARY_LOAN_TYPE -> extendedItem -> extendedItem.getEntity().setTemporaryLoanType(null); default -> item -> { @@ -179,21 +180,21 @@ private boolean ruleTenantsAreNotValid(BulkOperationRule rule, Action action, Up } private void replacePermanentLoanType(Action action, ExtendedItem extendedItem) { - var tenant = getTenantFromAction(action); + var tenant = RuleUtils.getTenantFromAction(action, folioExecutionContext); try (var ignored = new FolioExecutionContextSetter(prepareContextForTenant(tenant, folioModuleMetadata, folioExecutionContext))) { extendedItem.getEntity().setPermanentLoanType(itemReferenceService.getLoanTypeById(action.getUpdated(), tenant)); } } private void replaceTemporaryLoanType(Action action, ExtendedItem extendedItem) { - var tenant = getTenantFromAction(action); + var tenant = RuleUtils.getTenantFromAction(action, folioExecutionContext); try (var ignored = new FolioExecutionContextSetter(prepareContextForTenant(tenant, folioModuleMetadata, folioExecutionContext))) { extendedItem.getEntity().setTemporaryLoanType(itemReferenceService.getLoanTypeById(action.getUpdated(), tenant)); } } private void replacePermanentLocation(Action action, ExtendedItem extendedItem) { - var tenant = getTenantFromAction(action); + var tenant = RuleUtils.getTenantFromAction(action, folioExecutionContext); try (var ignored = new FolioExecutionContextSetter(prepareContextForTenant(tenant, folioModuleMetadata, folioExecutionContext))) { extendedItem.getEntity().setPermanentLocation(itemReferenceService.getLocationById(action.getUpdated(), tenant)); extendedItem.getEntity().setEffectiveLocation(getEffectiveLocation(extendedItem.getEntity(), tenant)); @@ -201,7 +202,7 @@ private void replacePermanentLocation(Action action, ExtendedItem extendedItem) } private void replaceTemporaryLocation(Action action, ExtendedItem extendedItem) { - var tenant = getTenantFromAction(action); + var tenant = RuleUtils.getTenantFromAction(action, folioExecutionContext); try (var ignored = new FolioExecutionContextSetter(prepareContextForTenant(tenant, folioModuleMetadata, folioExecutionContext))) { extendedItem.getEntity().setTemporaryLocation(itemReferenceService.getLocationById(action.getUpdated(), tenant)); extendedItem.getEntity().setEffectiveLocation(getEffectiveLocation(extendedItem.getEntity(), tenant)); diff --git a/src/main/java/org/folio/bulkops/service/ElectronicAccessReferenceService.java b/src/main/java/org/folio/bulkops/service/ElectronicAccessReferenceService.java index 7592efbb5..f0a405c9a 100644 --- a/src/main/java/org/folio/bulkops/service/ElectronicAccessReferenceService.java +++ b/src/main/java/org/folio/bulkops/service/ElectronicAccessReferenceService.java @@ -24,7 +24,11 @@ public class ElectronicAccessReferenceService { @Cacheable(cacheNames = "electronicAccessRelationshipNames") public String getRelationshipNameById(String id, String tenantId) { - try { + log.info("getRelationshipNameById: {}, {}", id, tenantId); + if (isNull(tenantId)) { + tenantId = folioExecutionContext.getTenantId(); + } + try (var ignored = new FolioExecutionContextSetter(prepareContextForTenant(tenantId, folioModuleMetadata, folioExecutionContext))) { return relationshipClient.getById(id).getName(); } catch (NotFoundException e) { log.error("Electronic access relationship was not found by id={}", id); diff --git a/src/main/java/org/folio/bulkops/service/ElectronicAccessService.java b/src/main/java/org/folio/bulkops/service/ElectronicAccessService.java index 615c6e499..335fdfb85 100644 --- a/src/main/java/org/folio/bulkops/service/ElectronicAccessService.java +++ b/src/main/java/org/folio/bulkops/service/ElectronicAccessService.java @@ -48,9 +48,9 @@ public ElectronicAccess restoreItemElectronicAccessItem(String access) { } private String electronicAccessToString(ElectronicAccess access, String delimiter) { - var tenantId = isNull(access.getTenantId()) ? folioExecutionContext.getTenantId() : access.getTenantId(); + log.debug("electronicAccessToString: {}, {}", access.getRelationshipId(), folioExecutionContext.getTenantId()); return String.join(delimiter, - isEmpty(access.getRelationshipId()) ? EMPTY : electronicAccessReferenceService.getRelationshipNameById(access.getRelationshipId(), tenantId), + isEmpty(access.getRelationshipId()) ? EMPTY : getRelationshipName(access), isNull(access.getUri()) ? EMPTY : access.getUri(), isEmpty(access.getLinkText()) ? EMPTY : access.getLinkText(), isEmpty(access.getMaterialsSpecification()) ? EMPTY : access.getMaterialsSpecification(), @@ -74,4 +74,10 @@ private ElectronicAccess restoreElectronicAccessItem(String access, String delim } return null; } + + private String getRelationshipName(ElectronicAccess access) { + log.debug("getRelationshipName {}, {}, {}", access.getRelationshipId(), access.getTenantId(), folioExecutionContext.getTenantId()); + var idTenant = access.getRelationshipId().split(ARRAY_DELIMITER); + return electronicAccessReferenceService.getRelationshipNameById(idTenant[0], idTenant.length > 1 ? idTenant[1] : null); + } } diff --git a/src/main/java/org/folio/bulkops/service/RuleService.java b/src/main/java/org/folio/bulkops/service/RuleService.java index 94455851b..d46989475 100644 --- a/src/main/java/org/folio/bulkops/service/RuleService.java +++ b/src/main/java/org/folio/bulkops/service/RuleService.java @@ -49,6 +49,7 @@ public BulkOperationRuleCollection saveRules(BulkOperationRuleCollection ruleCol .parameters(action.getParameters()) .ruleTenants(bulkOperationRule.getRuleDetails().getTenants()) .actionTenants(action.getTenants()) + .updatedTenants(action.getUpdatedTenants()) .build())); }); return ruleCollection; @@ -75,7 +76,8 @@ private BulkOperationRule mapBulkOperationRuleToDto(org.folio.bulkops.domain.ent .initial(details.getInitialValue()) .updated(details.getUpdatedValue()) .parameters(details.getParameters()) - .tenants(details.getActionTenants())) + .tenants(details.getActionTenants()) + .updatedTenants(details.getUpdatedTenants())) .toList()) .tenants(entity.getRuleDetails().get(0).getRuleTenants())); } diff --git a/src/main/java/org/folio/bulkops/util/RuleUtils.java b/src/main/java/org/folio/bulkops/util/RuleUtils.java index 8ae696e1b..b94ee38a2 100644 --- a/src/main/java/org/folio/bulkops/util/RuleUtils.java +++ b/src/main/java/org/folio/bulkops/util/RuleUtils.java @@ -1,11 +1,15 @@ package org.folio.bulkops.util; +import static java.util.Objects.isNull; +import static java.util.Objects.nonNull; + import lombok.experimental.UtilityClass; import org.folio.bulkops.domain.dto.Action; import org.folio.bulkops.domain.dto.BulkOperationRule; import org.folio.bulkops.domain.dto.BulkOperationRuleCollection; import org.folio.bulkops.domain.dto.Parameter; import org.folio.bulkops.domain.dto.UpdateOptionType; +import org.folio.spring.FolioExecutionContext; import java.util.List; import java.util.Map; @@ -28,4 +32,13 @@ public static Map fetchParameters(BulkOperationRule rule) { .flatMap(List::stream) .collect(Collectors.toMap(Parameter::getKey, Parameter::getValue, (existing, replacement) -> existing)); } + + public static String getTenantFromAction(Action action, FolioExecutionContext folioExecutionContext) { + var actionTenants = action.getTenants(); + var updatedTenants = action.getUpdatedTenants(); + if ((isNull(actionTenants) || actionTenants.isEmpty()) && (isNull(updatedTenants) || updatedTenants.isEmpty())) { + return folioExecutionContext.getTenantId(); + } + return nonNull(actionTenants) && !actionTenants.isEmpty() ? actionTenants.get(0) : updatedTenants.get(0); + } } diff --git a/src/main/resources/db/changelog/changelog-master.xml b/src/main/resources/db/changelog/changelog-master.xml index 8f9a63ea4..344dcccbe 100644 --- a/src/main/resources/db/changelog/changelog-master.xml +++ b/src/main/resources/db/changelog/changelog-master.xml @@ -34,4 +34,5 @@ + diff --git a/src/main/resources/db/changelog/changes/24_10_2024_add_updated_tenants_to_rules.sql b/src/main/resources/db/changelog/changes/24_10_2024_add_updated_tenants_to_rules.sql new file mode 100644 index 000000000..81b5dd37e --- /dev/null +++ b/src/main/resources/db/changelog/changes/24_10_2024_add_updated_tenants_to_rules.sql @@ -0,0 +1,2 @@ +ALTER TABLE bulk_operation_rule_details +ADD COLUMN IF NOT EXISTS updated_tenants TEXT[]; diff --git a/src/main/resources/db/changelog/changes/24_10_2024_add_updated_tenants_to_rules.xml b/src/main/resources/db/changelog/changes/24_10_2024_add_updated_tenants_to_rules.xml new file mode 100644 index 000000000..462eecb09 --- /dev/null +++ b/src/main/resources/db/changelog/changes/24_10_2024_add_updated_tenants_to_rules.xml @@ -0,0 +1,13 @@ + + + + + + + + + diff --git a/src/main/resources/swagger.api/schemas/action.json b/src/main/resources/swagger.api/schemas/action.json index 8db7332f6..03e616153 100644 --- a/src/main/resources/swagger.api/schemas/action.json +++ b/src/main/resources/swagger.api/schemas/action.json @@ -27,6 +27,12 @@ "items": { "type": "string" } + }, + "updated_tenants": { + "type": "array", + "items": { + "type": "string" + } } }, "required": [ diff --git a/src/test/java/org/folio/bulkops/processor/HoldingsDataProcessorTest.java b/src/test/java/org/folio/bulkops/processor/HoldingsDataProcessorTest.java index be491e04d..67c5be89b 100644 --- a/src/test/java/org/folio/bulkops/processor/HoldingsDataProcessorTest.java +++ b/src/test/java/org/folio/bulkops/processor/HoldingsDataProcessorTest.java @@ -601,7 +601,7 @@ void testClone() { void shouldClearElectronicAccessFields(UpdateOptionType option) { var holdingsRecord = buildHoldingsWithElectronicAccess(); - var processor = new HoldingsDataProcessor(null, null, null, new ElectronicAccessUpdaterFactory(), null); + var processor = new HoldingsDataProcessor(null, null, null, new ElectronicAccessUpdaterFactory(folioExecutionContext), null); processor.folioExecutionContext = folioExecutionContext; var action = new Action().type(CLEAR_FIELD); var extendedHoldingsRecord = ExtendedHoldingsRecord.builder().entity(holdingsRecord).tenantId("tenant").build(); @@ -630,7 +630,7 @@ void shouldClearElectronicAccessFields(UpdateOptionType option) { void shouldFindAndClearExactlyMatchedElectronicAccessFields(UpdateOptionType option, String value) { var holdingsRecord = buildHoldingsWithElectronicAccess(); var extendedHoldingsRecord = ExtendedHoldingsRecord.builder().entity(holdingsRecord).tenantId("tenant").build(); - var processor = new HoldingsDataProcessor(null, null, null, new ElectronicAccessUpdaterFactory(), null); + var processor = new HoldingsDataProcessor(null, null, null, new ElectronicAccessUpdaterFactory(folioExecutionContext), null); processor.folioExecutionContext = folioExecutionContext; var action = new Action().type(FIND_AND_REMOVE_THESE).initial(value); @@ -676,7 +676,7 @@ void shouldFindAndClearExactlyMatchedElectronicAccessFields(UpdateOptionType opt void shouldReplaceElectronicAccessFields(UpdateOptionType option, String newValue) { var holdingsRecord = buildHoldingsWithElectronicAccess(); var extendedHoldingsRecord = ExtendedHoldingsRecord.builder().entity(holdingsRecord).tenantId("tenant").build(); - var processor = new HoldingsDataProcessor(null, null, null, new ElectronicAccessUpdaterFactory(), null); + var processor = new HoldingsDataProcessor(null, null, null, new ElectronicAccessUpdaterFactory(folioExecutionContext), null); processor.folioExecutionContext = folioExecutionContext; var action = new Action().type(REPLACE_WITH).updated(newValue); @@ -704,7 +704,7 @@ void shouldReplaceElectronicAccessFields(UpdateOptionType option, String newValu void shouldFindAndReplaceExactlyMatchedElectronicAccessFields(UpdateOptionType option, String initial, String updated) { var holdingsRecord = buildHoldingsWithElectronicAccess(); var extendedHoldingsRecord = ExtendedHoldingsRecord.builder().entity(holdingsRecord).tenantId("tenant").build(); - var processor = new HoldingsDataProcessor(null, null, null, new ElectronicAccessUpdaterFactory(), null); + var processor = new HoldingsDataProcessor(null, null, null, new ElectronicAccessUpdaterFactory(folioExecutionContext), null); processor.folioExecutionContext = folioExecutionContext; var action = new Action().type(FIND_AND_REPLACE).initial(initial).updated(updated); diff --git a/src/test/java/org/folio/bulkops/service/ElectronicAccessReferenceServiceTest.java b/src/test/java/org/folio/bulkops/service/ElectronicAccessReferenceServiceTest.java index ef60d34ef..16d7145b3 100644 --- a/src/test/java/org/folio/bulkops/service/ElectronicAccessReferenceServiceTest.java +++ b/src/test/java/org/folio/bulkops/service/ElectronicAccessReferenceServiceTest.java @@ -9,13 +9,17 @@ import org.folio.bulkops.domain.bean.ElectronicAccessRelationshipCollection; import org.folio.bulkops.exception.NotFoundException; import org.folio.spring.FolioExecutionContext; +import org.folio.spring.integration.XOkapiHeaders; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; +import java.util.Collection; import java.util.Collections; +import java.util.HashMap; +import java.util.List; @ExtendWith(MockitoExtension.class) class ElectronicAccessReferenceServiceTest { @@ -28,8 +32,11 @@ class ElectronicAccessReferenceServiceTest { @Test void shouldReturnRelationshipNameById() { - var id = "id"; + var id = "id;diku"; var expectedName = "name"; + HashMap> headers = new HashMap<>(); + headers.put(XOkapiHeaders.TENANT, List.of("tenant")); + when(folioExecutionContext.getOkapiHeaders()).thenReturn(headers); when(electronicAccessRelationshipClient.getById(id)).thenReturn(new ElectronicAccessRelationship().withName(expectedName)); var actualName = electronicAccessReferenceService.getRelationshipNameById(id, "diku"); @@ -39,10 +46,13 @@ void shouldReturnRelationshipNameById() { @Test void shouldReturnIdIfRelationshipNotFound() { - var id = "id"; + var id = "id;tenant"; var expectedName = id; + HashMap> headers = new HashMap<>(); + headers.put(XOkapiHeaders.TENANT, List.of("tenant")); when(electronicAccessRelationshipClient.getById(id)).thenThrow(new NotFoundException("Not found")); + when(folioExecutionContext.getOkapiHeaders()).thenReturn(headers); var actualName = electronicAccessReferenceService.getRelationshipNameById(id, "tenant"); diff --git a/src/test/java/org/folio/bulkops/service/ElectronicAccessServiceTest.java b/src/test/java/org/folio/bulkops/service/ElectronicAccessServiceTest.java index 970fe1835..7b1227be7 100644 --- a/src/test/java/org/folio/bulkops/service/ElectronicAccessServiceTest.java +++ b/src/test/java/org/folio/bulkops/service/ElectronicAccessServiceTest.java @@ -33,7 +33,7 @@ class ElectronicAccessServiceTest extends BaseTest { private FolioModuleMetadata folioModuleMetadata; @ParameterizedTest - @CsvSource(value = { ",,,,", "id,uri,text,specification,note" }, delimiter = ',') + @CsvSource(value = { ",,,,", "id;tenant,uri,text,specification,note" }, delimiter = ',') void testElectronicAccessToString(String relationshipId, String uri, String linkText, String materialsSpecification, String publicNote) { when(electronicAccessReferenceService.getRelationshipNameById("id", "tenant")).thenReturn("name"); when(folioExecutionContext.getTenantId()).thenReturn("tenant"); diff --git a/src/test/java/org/folio/bulkops/util/RuleUtilsTest.java b/src/test/java/org/folio/bulkops/util/RuleUtilsTest.java new file mode 100644 index 000000000..24181d4f4 --- /dev/null +++ b/src/test/java/org/folio/bulkops/util/RuleUtilsTest.java @@ -0,0 +1,41 @@ +package org.folio.bulkops.util; + +import org.folio.bulkops.domain.dto.Action; +import org.folio.spring.FolioExecutionContext; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; + +import java.util.List; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.mockito.Mockito.when; + +@ExtendWith(MockitoExtension.class) +class RuleUtilsTest { + + private static final String CURRENT_TENANT = "current_tenant"; + private static final String TENANT_FROM_UI = "tenant_from_ui"; + + @Mock + private FolioExecutionContext folioExecutionContext; + + @Test + void getTenantFromAction_whenNeedToUseCurrentTenantTest() { + when(folioExecutionContext.getTenantId()).thenReturn(CURRENT_TENANT); + assertEquals(CURRENT_TENANT, RuleUtils.getTenantFromAction(new Action(), folioExecutionContext)); + assertEquals(CURRENT_TENANT, RuleUtils.getTenantFromAction(new Action().updatedTenants(List.of()), folioExecutionContext)); + assertEquals(CURRENT_TENANT, RuleUtils.getTenantFromAction(new Action().updatedTenants(List.of()).tenants(List.of()), folioExecutionContext)); + assertEquals(CURRENT_TENANT, RuleUtils.getTenantFromAction(new Action().tenants(List.of()), folioExecutionContext)); + } + + @Test + void getTenantFromAction_whenNeedToUseTenantFromUITest() { + assertEquals(TENANT_FROM_UI, RuleUtils.getTenantFromAction(new Action().updatedTenants(List.of()).tenants(List.of(TENANT_FROM_UI)), folioExecutionContext)); + assertEquals(TENANT_FROM_UI, RuleUtils.getTenantFromAction(new Action().updatedTenants(List.of(TENANT_FROM_UI)).tenants(List.of(TENANT_FROM_UI)), folioExecutionContext)); + assertEquals(TENANT_FROM_UI, RuleUtils.getTenantFromAction(new Action().updatedTenants(List.of(TENANT_FROM_UI)).tenants(List.of()), folioExecutionContext)); + assertEquals(TENANT_FROM_UI, RuleUtils.getTenantFromAction(new Action().tenants(List.of(TENANT_FROM_UI)), folioExecutionContext)); + assertEquals(TENANT_FROM_UI, RuleUtils.getTenantFromAction(new Action().updatedTenants(List.of(TENANT_FROM_UI)), folioExecutionContext)); + } +}