use of org.folio.rest.jaxrs.model.ExternalIdsHolder in project mod-inventory by folio-org.
the class MarcBibModifiedPostProcessingEventHandler method handle.
@Override
public CompletableFuture<DataImportEventPayload> handle(DataImportEventPayload dataImportEventPayload) {
CompletableFuture<DataImportEventPayload> future = new CompletableFuture<>();
try {
HashMap<String, String> payloadContext = dataImportEventPayload.getContext();
if (isNull(payloadContext) || isBlank(payloadContext.get(MARC_BIBLIOGRAPHIC.value()))) {
LOGGER.error(PAYLOAD_HAS_NO_DATA_MSG);
return CompletableFuture.failedFuture(new EventProcessingException(PAYLOAD_HAS_NO_DATA_MSG));
}
LOGGER.info("Processing ReplaceInstanceEventHandler starting with jobExecutionId: {}.", dataImportEventPayload.getJobExecutionId());
Record record = new JsonObject(payloadContext.get(MARC_BIBLIOGRAPHIC.value())).mapTo(Record.class);
String instanceId = ParsedRecordUtil.getAdditionalSubfieldValue(record.getParsedRecord(), ParsedRecordUtil.AdditionalSubfields.I);
if (isBlank(instanceId)) {
return CompletableFuture.completedFuture(dataImportEventPayload);
}
record.setExternalIdsHolder(new ExternalIdsHolder().withInstanceId(instanceId));
Context context = EventHandlingUtil.constructContext(dataImportEventPayload.getTenant(), dataImportEventPayload.getToken(), dataImportEventPayload.getOkapiUrl());
Promise<Instance> instanceUpdatePromise = Promise.promise();
mappingMetadataCache.get(dataImportEventPayload.getJobExecutionId(), context).map(parametersOptional -> parametersOptional.orElseThrow(() -> new EventProcessingException(format(MAPPING_METADATA_NOT_FOUND_MSG, dataImportEventPayload.getJobExecutionId())))).map(mappingMetadataDto -> buildPayloadForInstanceUpdate(dataImportEventPayload, mappingMetadataDto)).compose(payloadForUpdate -> instanceUpdateDelegate.handle(payloadForUpdate, record, context)).onSuccess(instanceUpdatePromise::complete).compose(updatedInstance -> precedingSucceedingTitlesHelper.getExistingPrecedingSucceedingTitles(updatedInstance, context)).map(precedingSucceedingTitles -> precedingSucceedingTitles.stream().map(titleJson -> titleJson.getString("id")).collect(Collectors.toSet())).compose(precedingSucceedingTitles -> precedingSucceedingTitlesHelper.deletePrecedingSucceedingTitles(precedingSucceedingTitles, context)).compose(ar -> precedingSucceedingTitlesHelper.createPrecedingSucceedingTitles(instanceUpdatePromise.future().result(), context)).onComplete(updateAr -> {
if (updateAr.succeeded()) {
dataImportEventPayload.getContext().remove(CURRENT_RETRY_NUMBER);
Instance resultedInstance = instanceUpdatePromise.future().result();
if (resultedInstance.getVersion() != null) {
int currentVersion = Integer.parseInt(resultedInstance.getVersion());
int incrementedVersion = currentVersion + 1;
resultedInstance.setVersion(String.valueOf(incrementedVersion));
}
dataImportEventPayload.getContext().put(INSTANCE.value(), Json.encode(resultedInstance));
future.complete(dataImportEventPayload);
} else {
if (updateAr.cause() instanceof OptimisticLockingException) {
processOLError(dataImportEventPayload, future, updateAr);
} else {
dataImportEventPayload.getContext().remove(CURRENT_RETRY_NUMBER);
LOGGER.error("Error updating inventory instance by id: '{}' by jobExecutionId: '{}'", instanceId, dataImportEventPayload.getJobExecutionId(), updateAr.cause());
future.completeExceptionally(updateAr.cause());
}
}
});
} catch (Exception e) {
dataImportEventPayload.getContext().remove(CURRENT_RETRY_NUMBER);
LOGGER.error("Error updating inventory instance", e);
future.completeExceptionally(e);
}
return future;
}
use of org.folio.rest.jaxrs.model.ExternalIdsHolder in project mod-source-record-storage by folio-org.
the class DataImportConsumersVerticleTest method setUp.
@Before
public void setUp(TestContext context) throws IOException {
WireMock.stubFor(get(new UrlPathPattern(new RegexPattern(MAPPING_METADATA_URL + "/.*"), true)).willReturn(WireMock.ok().withBody(Json.encode(new MappingMetadataDto().withMappingParams(Json.encode(new MappingParameters()))))));
RawRecord rawRecord = new RawRecord().withId(recordId).withContent(new ObjectMapper().readValue(TestUtil.readFileFromPath(RAW_MARC_RECORD_CONTENT_SAMPLE_PATH), String.class));
ParsedRecord parsedRecord = new ParsedRecord().withId(recordId).withContent(PARSED_CONTENT);
Snapshot snapshot = new Snapshot().withJobExecutionId(snapshotId).withProcessingStartedDate(new Date()).withStatus(Snapshot.Status.COMMITTED);
record = new Record().withId(recordId).withSnapshotId(snapshot.getJobExecutionId()).withGeneration(0).withMatchedId(recordId).withRecordType(MARC_BIB).withRawRecord(rawRecord).withParsedRecord(parsedRecord).withExternalIdsHolder(new ExternalIdsHolder().withAuthorityId(UUID.randomUUID().toString()));
ReactiveClassicGenericQueryExecutor queryExecutor = postgresClientFactory.getQueryExecutor(TENANT_ID);
RecordDaoImpl recordDao = new RecordDaoImpl(postgresClientFactory);
SnapshotDaoUtil.save(queryExecutor, snapshot).compose(v -> recordDao.saveRecord(record, TENANT_ID)).onComplete(context.asyncAssertSuccess());
}
use of org.folio.rest.jaxrs.model.ExternalIdsHolder in project mod-source-record-storage by folio-org.
the class AuthorityPostProcessingEventHandlerTest method shouldSetAuthorityIdToParsedRecordWhenContentHasField999.
@Test
public void shouldSetAuthorityIdToParsedRecordWhenContentHasField999(TestContext context) {
Async async = context.async();
String expectedAuthorityId = UUID.randomUUID().toString();
record.withParsedRecord(new ParsedRecord().withId(recordId).withContent(PARSED_CONTENT_WITH_999_FIELD)).withExternalIdsHolder(new ExternalIdsHolder().withAuthorityId(expectedAuthorityId));
HashMap<String, String> payloadContext = new HashMap<>();
payloadContext.put(AUTHORITY.value(), new JsonObject().put("id", expectedAuthorityId).encode());
payloadContext.put(MARC_AUTHORITY.value(), Json.encode(record));
DataImportEventPayload dataImportEventPayload = createDataImportEventPayload(payloadContext, DI_INVENTORY_AUTHORITY_CREATED_READY_FOR_POST_PROCESSING);
CompletableFuture<DataImportEventPayload> future = new CompletableFuture<>();
recordDao.saveRecord(record, TENANT_ID).onFailure(future::completeExceptionally).onSuccess(rec -> handler.handle(dataImportEventPayload).thenApply(future::complete).exceptionally(future::completeExceptionally));
future.whenComplete((payload, throwable) -> {
if (throwable != null) {
context.fail(throwable);
}
recordDao.getRecordById(record.getId(), TENANT_ID).onComplete(getAr -> {
if (getAr.failed()) {
context.fail(getAr.cause());
}
context.assertTrue(getAr.result().isPresent());
Record updatedRecord = getAr.result().get();
context.assertNotNull(updatedRecord.getExternalIdsHolder());
context.assertTrue(expectedAuthorityId.equals(updatedRecord.getExternalIdsHolder().getAuthorityId()));
context.assertNotNull(updatedRecord.getParsedRecord().getContent());
JsonObject parsedContent = JsonObject.mapFrom(updatedRecord.getParsedRecord().getContent());
JsonArray fields = parsedContent.getJsonArray("fields");
context.assertTrue(!fields.isEmpty());
String actualAuthorityId = getInventoryId(fields);
context.assertEquals(expectedAuthorityId, actualAuthorityId);
async.complete();
});
});
}
use of org.folio.rest.jaxrs.model.ExternalIdsHolder in project mod-source-record-storage by folio-org.
the class MarcBibliographicMatchEventHandlerTest method setUp.
@Before
public void setUp(TestContext context) {
MockitoAnnotations.initMocks(this);
recordDao = new RecordDaoImpl(postgresClientFactory);
handler = new MarcBibliographicMatchEventHandler(recordDao);
Async async = context.async();
Snapshot existingRecordSnapshot = new Snapshot().withJobExecutionId(UUID.randomUUID().toString()).withProcessingStartedDate(new Date()).withStatus(Snapshot.Status.COMMITTED);
Snapshot incomingRecordSnapshot = new Snapshot().withJobExecutionId(UUID.randomUUID().toString()).withProcessingStartedDate(new Date()).withStatus(Snapshot.Status.COMMITTED);
List<Snapshot> snapshots = new ArrayList<>();
snapshots.add(existingRecordSnapshot);
snapshots.add(incomingRecordSnapshot);
String existingRecordId = "acf4f6e2-115c-4509-9d4c-536c758ef917";
this.existingRecord = new Record().withId(existingRecordId).withMatchedId(existingRecordId).withSnapshotId(existingRecordSnapshot.getJobExecutionId()).withGeneration(0).withRecordType(MARC_BIB).withRawRecord(new RawRecord().withId(existingRecordId).withContent(rawRecordContent)).withParsedRecord(new ParsedRecord().withId(existingRecordId).withContent(PARSED_CONTENT_WITH_ADDITIONAL_FIELDS)).withExternalIdsHolder(new ExternalIdsHolder().withInstanceId("681394b4-10d8-4cb1-a618-0f9bd6152119").withInstanceHrid("12345"));
String incomingRecordId = UUID.randomUUID().toString();
this.incomingRecord = new Record().withId(incomingRecordId).withMatchedId(existingRecordId).withSnapshotId(incomingRecordSnapshot.getJobExecutionId()).withGeneration(1).withRecordType(MARC_BIB).withRawRecord(new RawRecord().withId(incomingRecordId).withContent(rawRecordContent)).withParsedRecord(new ParsedRecord().withId(incomingRecordId).withContent(PARSED_CONTENT_WITH_ADDITIONAL_FIELDS)).withExternalIdsHolder(new ExternalIdsHolder());
SnapshotDaoUtil.save(postgresClientFactory.getQueryExecutor(TENANT_ID), snapshots).onComplete(save -> {
if (save.failed()) {
context.fail(save.cause());
}
async.complete();
});
}
use of org.folio.rest.jaxrs.model.ExternalIdsHolder in project mod-source-record-storage by folio-org.
the class RecordApiTest method suppressFromDiscoveryByInstanceIdSuccess.
@Test
public void suppressFromDiscoveryByInstanceIdSuccess(TestContext testContext) {
postSnapshots(testContext, snapshot_1);
Async async = testContext.async();
String srsId = UUID.randomUUID().toString();
String instanceId = UUID.randomUUID().toString();
ParsedRecord parsedRecord = new ParsedRecord().withId(srsId).withContent(new JsonObject().put("leader", "01542ccm a2200361 4500").put("fields", new JsonArray().add(new JsonObject().put("999", new JsonObject().put("subfields", new JsonArray().add(new JsonObject().put("s", srsId)).add(new JsonObject().put("i", instanceId)))))));
Record newRecord = new Record().withId(srsId).withSnapshotId(snapshot_1.getJobExecutionId()).withRecordType(Record.RecordType.MARC_BIB).withRawRecord(rawMarcRecord).withParsedRecord(parsedRecord).withExternalIdsHolder(new ExternalIdsHolder().withInstanceId(instanceId)).withMatchedId(UUID.randomUUID().toString());
RestAssured.given().spec(spec).body(JsonObject.mapFrom(newRecord).toString()).when().post(SOURCE_STORAGE_RECORDS_PATH).then().statusCode(HttpStatus.SC_CREATED).body("id", is(srsId));
async.complete();
async = testContext.async();
RestAssured.given().spec(spec).when().put(SOURCE_STORAGE_RECORDS_PATH + "/" + instanceId + "/suppress-from-discovery?idType=INSTANCE&suppress=true").then().statusCode(HttpStatus.SC_OK);
async.complete();
}
Aggregations