Skip to content

Commit

Permalink
[MODINV-987] Allow to retrieve ITEM universally during HOLDINGS update (
Browse files Browse the repository at this point in the history
#701)

(cherry picked from commit f380b4b)
  • Loading branch information
RomanChernetskyi authored and KaterynaSenchenko committed Mar 27, 2024
1 parent 5807e16 commit b67e758
Show file tree
Hide file tree
Showing 4 changed files with 32 additions and 17 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -383,7 +383,7 @@ private Future<Item> addItem(Item item, ItemCollection itemCollection) {
return promise.future();
}

private JsonObject getItemFromJson(JsonObject itemAsJson) {
public static JsonObject getItemFromJson(JsonObject itemAsJson) {
if (itemAsJson.getJsonObject(ITEM_PATH_FIELD) != null) {
return itemAsJson.getJsonObject(ITEM_PATH_FIELD);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@
import static org.folio.ActionProfile.FolioRecord.HOLDINGS;
import static org.folio.ActionProfile.FolioRecord.MARC_BIBLIOGRAPHIC;
import static org.folio.DataImportEventTypes.DI_INVENTORY_HOLDING_UPDATED;
import static org.folio.inventory.dataimport.handlers.actions.CreateItemEventHandler.getItemFromJson;
import static org.folio.inventory.dataimport.handlers.matching.util.EventHandlingUtil.constructContext;
import static org.folio.inventory.dataimport.util.LoggerUtil.logParametersEventHandler;
import static org.folio.rest.jaxrs.model.EntityType.ITEM;
Expand All @@ -56,7 +57,6 @@ public class UpdateHoldingEventHandler implements EventHandler {

private static final Logger LOGGER = LogManager.getLogger(UpdateHoldingEventHandler.class);

private static final String UPDATE_HOLDING_ERROR_MESSAGE = "Can`t update holding by jobExecutionId: '%s' and recordId: '%s' and chunkId: '%s'";
private static final String CONTEXT_EMPTY_ERROR_MESSAGE = "Can`t update Holding entity: context or Holding-entity are empty or doesn`t exist!";
private static final String EMPTY_REQUIRED_FIELDS_ERROR_MESSAGE = "Can`t update Holding entity: one of required fields(hrid, permanentLocationId, instanceId) are empty!";
private static final String MAPPING_METADATA_NOT_FOUND_MESSAGE = "MappingMetadata snapshot was not found by jobExecutionId '%s'. Record: '%s', chunkId: '%s' ";
Expand Down Expand Up @@ -139,9 +139,14 @@ public CompletableFuture<DataImportEventPayload> handle(DataImportEventPayload d
updatedHoldingsRecordFutures.add(updatePromise.future());
holdingsRecordCollection.update(holding,
success -> {
LOGGER.info(format("handle:: Successfully updated holdings with id: %s", holding.getId()));
updatedHoldingsRecord.add(holding);
constructDataImportEventPayload(updatePromise, dataImportEventPayload, list, context, errors);
try {
LOGGER.info(format("handle:: Successfully updated holdings with id: %s", holding.getId()));
updatedHoldingsRecord.add(holding);
constructDataImportEventPayload(updatePromise, dataImportEventPayload, list, context, errors);
} catch (Exception e) {
LOGGER.warn("handle:: Error updating inventory Holdings by jobExecutionId: '{}'", jobExecutionId, e);
future.completeExceptionally(e);
}
},
failure -> {
if (failure.getStatusCode() == HttpStatus.SC_CONFLICT) {
Expand Down Expand Up @@ -308,29 +313,36 @@ private void constructDataImportEventPayload(Promise<Void> promise, DataImportEv
}
}

private void updateDataImportEventPayloadItem(Promise<Void> future, DataImportEventPayload dataImportEventPayload, ItemCollection itemCollection, List<PartialError> errors) {
private void updateDataImportEventPayloadItem(Promise<Void> promise, DataImportEventPayload dataImportEventPayload, ItemCollection itemCollection, List<PartialError> errors) {
JsonArray oldItemsAsJson = new JsonArray(dataImportEventPayload.getContext().get(ITEM.value()));
JsonArray resultedItemsList = new JsonArray();
List<Future> updateItemsFutures = new ArrayList<>();

for (int i = 0; i < oldItemsAsJson.size(); i++) {
JsonObject singleItemAsJson = oldItemsAsJson.getJsonObject(i);
String itemId = singleItemAsJson.getJsonObject("item").getString(ITEM_ID_HEADER);
Promise<Void> updateItemPromise = Promise.promise();
updateItemsFutures.add(updateItemPromise.future());

JsonObject singleItemAsJson = getItemFromJson(oldItemsAsJson.getJsonObject(i));
String itemId = singleItemAsJson.getString(ITEM_ID_HEADER);
itemCollection.findById(itemId, findResult -> {
if (Objects.nonNull(findResult)) {
JsonObject itemAsJson = new JsonObject(ItemUtil.mapToMappingResultRepresentation(findResult.getResult()));
resultedItemsList.add(itemAsJson);
dataImportEventPayload.getContext().put(ITEM.value(), Json.encode(itemAsJson));
}
future.complete();
updateItemPromise.complete();
}, failure -> {
errors.add(new PartialError(itemId != null ? itemId : BLANK, failure.getReason()));
EventProcessingException processingException =
new EventProcessingException(format(CANNOT_GET_ACTUAL_ITEM_MESSAGE, itemId, failure.getReason(), failure.getStatusCode()));
LOGGER.warn("updateDataImportEventPayloadItem:: " + processingException);
future.complete();
updateItemPromise.complete();
});
}
dataImportEventPayload.getContext().put(ITEM.value(), resultedItemsList.encode());
CompositeFuture.all(updateItemsFutures)
.onComplete(ar -> {
dataImportEventPayload.getContext().put(ITEM.value(), resultedItemsList.encode());
promise.complete();
});
}

private Future<List<HoldingsRecord>> getActualHoldingsList(List<HoldingsRecord> holdingsRecords, HoldingsRecordCollection holdingsRecordCollection) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,7 @@
import static org.apache.commons.lang3.StringUtils.isEmpty;
import static org.folio.ActionProfile.Action.UPDATE;
import static org.folio.DataImportEventTypes.DI_INVENTORY_ITEM_UPDATED;
import static org.folio.inventory.dataimport.handlers.actions.CreateItemEventHandler.getItemFromJson;
import static org.folio.inventory.dataimport.util.LoggerUtil.logParametersEventHandler;
import static org.folio.inventory.domain.items.Item.STATUS_KEY;
import static org.folio.inventory.support.ItemUtil.ID;
Expand Down Expand Up @@ -281,8 +282,7 @@ private Map<String, String> preparePayloadAndGetStatus(DataImportEventPayload da

JsonArray itemsJsonArray = new JsonArray(dataImportEventPayload.getContext().get(ITEM.value()));
for (int i = 0; i < itemsJsonArray.size(); i++) {
JsonObject itemAsJson = itemsJsonArray.getJsonObject(i);
itemAsJson = itemAsJson.getJsonObject(ITEM_PATH_FIELD) != null ? itemAsJson.getJsonObject(ITEM_PATH_FIELD) : itemAsJson;
JsonObject itemAsJson = getItemFromJson(itemsJsonArray.getJsonObject(i));
itemOldStatuses.put(itemAsJson.getString(ID_PATH_FIELD), itemAsJson.getJsonObject(STATUS_KEY).getString("name"));
}
dataImportEventPayload.getContext().put(ITEM.value(), itemsJsonArray.encode());
Expand Down Expand Up @@ -323,8 +323,7 @@ private void preparePayloadForMappingManager(DataImportEventPayload dataImportEv

JsonArray itemsJsonArray = new JsonArray(dataImportEventPayload.getContext().get(ITEM.value()));
for (int i = 0; i < itemsJsonArray.size(); i++) {
JsonObject itemAsJson = itemsJsonArray.getJsonObject(i);
itemAsJson = itemAsJson.getJsonObject(ITEM_PATH_FIELD) != null ? itemAsJson.getJsonObject(ITEM_PATH_FIELD) : itemAsJson;
JsonObject itemAsJson = getItemFromJson(itemsJsonArray.getJsonObject(i));
itemsJsonArray.set(i, new JsonObject().put(ITEM_PATH_FIELD, getItemAsJsonWithProperFields(itemAsJson)));
}
dataImportEventPayload.getContext().put(ITEM.value(), itemsJsonArray.encode());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -834,8 +834,12 @@ public void shouldProcessHoldingAndInstanceEvent() throws InterruptedException,

Assert.assertEquals(DI_INVENTORY_HOLDING_UPDATED.value(), actualDataImportEventPayload.getEventType());
Assert.assertNotNull(actualDataImportEventPayload.getContext().get(HOLDINGS.value()));
Assert.assertNotNull(actualDataImportEventPayload.getContext().get(ITEM.value()));
JsonArray resultedHoldingsList = new JsonArray(actualDataImportEventPayload.getContext().get(HOLDINGS.value()));
JsonObject resultedHoldings = resultedHoldingsList.getJsonObject(0);
JsonArray resultedItemsList = new JsonArray(actualDataImportEventPayload.getContext().get(ITEM.value()));
JsonObject resultedItem = resultedItemsList.getJsonObject(0);
Assert.assertEquals(existingItemJson.getString("id"), resultedItem.getString("id"));
Assert.assertNotNull(resultedHoldings.getString("id"));
Assert.assertEquals(instanceId, resultedHoldings.getString("instanceId"));
Assert.assertEquals(permanentLocationId, resultedHoldings.getString("permanentLocationId"));
Expand Down Expand Up @@ -1104,7 +1108,7 @@ public void shouldProcessHoldingAndItemEventButWithPartialErrorIfItemUpdateFaile
Record record = new Record().withParsedRecord(new ParsedRecord().withContent(PARSED_CONTENT_WITH_INSTANCE_ID));
HashMap<String, String> context = new HashMap<>();
context.put(HOLDINGS.value(), Json.encode(holdingsList));
context.put(ITEM.value(), Json.encode(Lists.newArrayList(new JsonObject().put("item", existingItemJson))));
context.put(ITEM.value(), Json.encode(JsonArray.of(existingItemJson)));
context.put(MARC_BIBLIOGRAPHIC.value(), Json.encode(record));

DataImportEventPayload dataImportEventPayload = new DataImportEventPayload()
Expand Down

0 comments on commit b67e758

Please sign in to comment.