use of org.folio.ActionProfile.FolioRecord.ITEM in project mod-inventory by folio-org.
the class CreateItemEventHandler method handle.
@Override
public CompletableFuture<DataImportEventPayload> handle(DataImportEventPayload dataImportEventPayload) {
CompletableFuture<DataImportEventPayload> future = new CompletableFuture<>();
try {
dataImportEventPayload.setEventType(DI_INVENTORY_ITEM_CREATED.value());
HashMap<String, String> payloadContext = dataImportEventPayload.getContext();
if (payloadContext == null || isBlank(payloadContext.get(EntityType.MARC_BIBLIOGRAPHIC.value()))) {
LOG.error(PAYLOAD_HAS_NO_DATA_MSG);
return CompletableFuture.failedFuture(new EventProcessingException(PAYLOAD_HAS_NO_DATA_MSG));
}
if (dataImportEventPayload.getCurrentNode().getChildSnapshotWrappers().isEmpty()) {
LOG.error(ACTION_HAS_NO_MAPPING_MSG);
return CompletableFuture.failedFuture(new EventProcessingException(ACTION_HAS_NO_MAPPING_MSG));
}
dataImportEventPayload.getEventsChain().add(dataImportEventPayload.getEventType());
dataImportEventPayload.setCurrentNode(dataImportEventPayload.getCurrentNode().getChildSnapshotWrappers().get(0));
dataImportEventPayload.getContext().put(ITEM.value(), new JsonObject().encode());
String jobExecutionId = dataImportEventPayload.getJobExecutionId();
String recordId = dataImportEventPayload.getContext().get(RECORD_ID_HEADER);
String chunkId = dataImportEventPayload.getContext().get(CHUNK_ID_HEADER);
Future<RecordToEntity> recordToItemFuture = idStorageService.store(recordId, UUID.randomUUID().toString(), dataImportEventPayload.getTenant());
recordToItemFuture.onSuccess(res -> {
String itemId = res.getEntityId();
Context context = EventHandlingUtil.constructContext(dataImportEventPayload.getTenant(), dataImportEventPayload.getToken(), dataImportEventPayload.getOkapiUrl());
ItemCollection itemCollection = storage.getItemCollection(context);
mappingMetadataCache.get(jobExecutionId, context).map(parametersOptional -> parametersOptional.orElseThrow(() -> new EventProcessingException(format(MAPPING_METADATA_NOT_FOUND_MSG, jobExecutionId, recordId, chunkId)))).map(mappingMetadataDto -> {
MappingParameters mappingParameters = Json.decodeValue(mappingMetadataDto.getMappingParams(), MappingParameters.class);
MappingManager.map(dataImportEventPayload, new MappingContext().withMappingParameters(mappingParameters));
return processMappingResult(dataImportEventPayload, itemId);
}).compose(mappedItemJson -> {
List<String> errors = validateItem(mappedItemJson, requiredFields);
if (!errors.isEmpty()) {
String msg = format("Mapped Item is invalid: %s, by jobExecutionId: '%s' and recordId: '%s' and chunkId: '%s' ", errors, jobExecutionId, recordId, chunkId);
LOG.error(msg);
return Future.failedFuture(msg);
}
Item mappedItem = ItemUtil.jsonToItem(mappedItemJson);
return isItemBarcodeUnique(mappedItemJson.getString("barcode"), itemCollection).compose(isUnique -> isUnique ? addItem(mappedItem, itemCollection) : Future.failedFuture(format("Barcode must be unique, %s is already assigned to another item", mappedItemJson.getString("barcode"))));
}).onComplete(ar -> {
if (ar.succeeded()) {
dataImportEventPayload.getContext().put(ITEM.value(), Json.encode(ar.result()));
future.complete(dataImportEventPayload);
} else {
if (!(ar.cause() instanceof DuplicateEventException)) {
LOG.error("Error creating inventory Item by jobExecutionId: '{}' and recordId: '{}' and chunkId: '{}' ", jobExecutionId, recordId, chunkId, ar.cause());
}
future.completeExceptionally(ar.cause());
}
});
}).onFailure(failure -> {
LOG.error("Error creating inventory recordId and itemId relationship by jobExecutionId: '{}' and recordId: '{}' and chunkId: '{}' ", jobExecutionId, recordId, chunkId, failure);
future.completeExceptionally(failure);
});
} catch (Exception e) {
LOG.error("Error creating inventory Item", e);
future.completeExceptionally(e);
}
return future;
}
use of org.folio.ActionProfile.FolioRecord.ITEM in project mod-inventory by folio-org.
the class CreateItemEventHandler method addItem.
private Future<Item> addItem(Item item, ItemCollection itemCollection) {
Promise<Item> promise = Promise.promise();
List<CirculationNote> notes = item.getCirculationNotes().stream().map(note -> note.withId(UUID.randomUUID().toString())).map(note -> note.withSource(null)).map(note -> note.withDate(dateTimeFormatter.format(ZonedDateTime.now()))).collect(Collectors.toList());
itemCollection.add(item.withCirculationNotes(notes), success -> promise.complete(success.getResult()), failure -> {
// This is temporary solution (verify by error message). It will be improved via another solution by https://issues.folio.org/browse/RMB-899.
if (isNotBlank(failure.getReason()) && failure.getReason().contains(UNIQUE_ID_ERROR_MESSAGE)) {
LOG.info("Duplicated event received by ItemId: {}. Ignoring...", item.getId());
promise.fail(new DuplicateEventException(format("Duplicated event by Item id: %s", item.getId())));
} else {
LOG.error(format("Error posting Item cause %s, status code %s", failure.getReason(), failure.getStatusCode()));
promise.fail(failure.getReason());
}
});
return promise.future();
}
Aggregations