Skip to content

Commit

Permalink
Merge branch 'master' of github.com:folio-org/mod-source-record-stora…
Browse files Browse the repository at this point in the history
…ge into MODSOURMAN-1109
  • Loading branch information
RuslanLavrov committed Jan 9, 2024
2 parents 426e0f0 + 11e0a3a commit 3111d4b
Show file tree
Hide file tree
Showing 14 changed files with 463 additions and 17 deletions.
2 changes: 2 additions & 0 deletions NEWS.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@
* [MODSOURCE-709](https://issues.folio.org/browse/MODSOURCE-709) MARC authority record is not created when use Job profile with match profile by absent subfield/field
* [MODSOURCE-677](https://issues.folio.org/browse/MODSOURCE-677) Import is completed with errors when control field that differs from 001 is used for marc-to-marc matching
* [MODSOURCE-722](https://issues.folio.org/browse/MODSOURCE-722) deleteMarcIndexersOldVersions: relation "marc_records_tracking" does not exist
* [MODSOURMAN-1106](https://issues.folio.org/browse/MODSOURMAN-1106) The status of Instance is '-' in the Import log after uploading file. The numbers of updated SRS and Instance are not displayed in the Summary table.
* [MODSOURCE-717](https://issues.folio.org/browse/MODSOURCE-717) MARC modifications not processed when placed after Holdings Update action in a job profile

## 2023-10-13 v5.7.0
* [MODSOURCE-648](https://issues.folio.org/browse/MODSOURCE-648) Upgrade mod-source-record-storage to Java 17
Expand Down
9 changes: 9 additions & 0 deletions descriptors/ModuleDescriptor-template.json
Original file line number Diff line number Diff line change
Expand Up @@ -92,6 +92,15 @@
"source-storage.records.put"
]
},
{
"methods": [
"PUT"
],
"pathPattern": "/source-storage/records/{id}/generation",
"permissionsRequired": [
"source-storage.records.put"
]
},
{
"methods": [
"DELETE"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -98,6 +98,21 @@ public void putSourceStorageRecordsById(String id, Record entity, Map<String, St
}
});
}
@Override
public void putSourceStorageRecordsGenerationById(String matchedId, Record entity, Map<String, String> okapiHeaders,
Handler<AsyncResult<Response>> asyncResultHandler, Context vertxContext) {
vertxContext.runOnContext(v -> {
try {
recordService.updateRecordGeneration(matchedId, entity, tenantId)
.map(updated -> PutSourceStorageRecordsGenerationByIdResponse.respond200WithApplicationJson(entity))
.map(Response.class::cast).otherwise(ExceptionHelper::mapExceptionToResponse)
.onComplete(asyncResultHandler);
} catch (Exception e) {
LOG.warn("putSourceStorageRecordsGenerationById:: Failed to update record generation by matchedId {}", matchedId, e);
asyncResultHandler.handle(Future.succeededFuture(ExceptionHelper.mapExceptionToResponse(e)));
}
});
}

@Override
public void deleteSourceStorageRecordsById(String id, Map<String, String> okapiHeaders,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -89,6 +89,16 @@ public interface RecordService {
*/
Future<Record> updateRecord(Record record, String tenantId);

/**
* Updates record generation with given matched id
*
* @param matchedId matched id
* @param record record to update
* @param tenantId tenant id
* @return future with updated Record generation
*/
Future<Record> updateRecordGeneration(String matchedId, Record record, String tenantId);

/**
* Searches for {@link SourceRecord} by {@link Condition} and ordered by order fields with offset and limit
*
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,9 @@ public class RecordServiceImpl implements RecordService {
private final RecordDao recordDao;
private static final String DUPLICATE_CONSTRAINT = "idx_records_matched_id_gen";
private static final String DUPLICATE_RECORD_MSG = "Incoming file may contain duplicates";
private static final String MATCHED_ID_NOT_EQUAL_TO_999_FIELD = "Matched id (%s) not equal to 999ff$s (%s) field";
private static final String RECORD_WITH_GIVEN_MATCHED_ID_NOT_FOUND = "Record with given matched id (%s) not found";
public static final String UPDATE_RECORD_DUPLICATE_EXCEPTION = "Incoming record could be a duplicate, incoming record generation should not be the same as matched record generation and the execution of job should be started after of creating the previous record generation";
public static final char SUBFIELD_S = 's';
public static final char INDICATOR = 'f';

Expand Down Expand Up @@ -152,6 +155,25 @@ public Future<Record> updateRecord(Record record, String tenantId) {
return recordDao.updateRecord(ensureRecordForeignKeys(record), tenantId);
}

@Override
public Future<Record> updateRecordGeneration(String matchedId, Record record, String tenantId) {
String marcField999s = getFieldFromMarcRecord(record, TAG_999, INDICATOR, INDICATOR, SUBFIELD_S);
if (!matchedId.equals(marcField999s)) {
return Future.failedFuture(new BadRequestException(format(MATCHED_ID_NOT_EQUAL_TO_999_FIELD, matchedId, marcField999s)));
}
record.setId(UUID.randomUUID().toString());

return recordDao.getRecordById(matchedId, tenantId)
.map(r -> r.orElseThrow(() -> new NotFoundException(format(RECORD_WITH_GIVEN_MATCHED_ID_NOT_FOUND, matchedId))))
.compose(v -> saveRecord(record, tenantId))
.recover(throwable -> {
if (throwable instanceof DuplicateRecordException) {
return Future.failedFuture(new BadRequestException(UPDATE_RECORD_DUPLICATE_EXCEPTION));
}
return Future.failedFuture(throwable);
});
}

@Override
public Future<SourceRecordCollection> getSourceRecords(Condition condition, RecordType recordType, Collection<OrderField<?>> orderFields,
int offset, int limit, String tenantId) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -123,10 +123,7 @@ public CompletableFuture<DataImportEventPayload> handle(DataImportEventPayload p
}
return recordService.saveRecord(changedRecord, payload.getTenant());
})
.onSuccess(savedRecord -> {
payload.setEventType(getNextEventType());
future.complete(payload);
})
.onSuccess(savedRecord -> submitSuccessfulEventType(payload, future, marcMappingOption))
.onFailure(throwable -> {
LOG.warn("handle:: Error while MARC record modifying", throwable);
future.completeExceptionally(throwable);
Expand All @@ -138,6 +135,11 @@ public CompletableFuture<DataImportEventPayload> handle(DataImportEventPayload p
return future;
}

protected void submitSuccessfulEventType(DataImportEventPayload payload, CompletableFuture<DataImportEventPayload> future, MappingDetail.MarcMappingOption marcMappingOption) {
payload.setEventType(getUpdateEventType());
future.complete(payload);
}

@Override
public boolean isEligible(DataImportEventPayload payload) {
if (payload.getCurrentNode() != null && ACTION_PROFILE == payload.getCurrentNode().getContentType()) {
Expand All @@ -149,11 +151,11 @@ public boolean isEligible(DataImportEventPayload payload) {

protected abstract boolean isHridFillingNeeded();

protected abstract String getNextEventType();
protected abstract String getUpdateEventType();

protected abstract EntityType modifiedEntityType();

private MappingDetail.MarcMappingOption getMarcMappingOption(MappingProfile mappingProfile) {
protected MappingDetail.MarcMappingOption getMarcMappingOption(MappingProfile mappingProfile) {
return mappingProfile.getMappingDetails().getMarcMappingOption();
}

Expand Down Expand Up @@ -209,7 +211,7 @@ private boolean isUpdateOption(MappingDetail.MarcMappingOption marcMappingOption
return marcMappingOption == MappingDetail.MarcMappingOption.UPDATE;
}

private MappingProfile retrieveMappingProfile(DataImportEventPayload dataImportEventPayload) {
protected MappingProfile retrieveMappingProfile(DataImportEventPayload dataImportEventPayload) {
ProfileSnapshotWrapper mappingProfileWrapper = dataImportEventPayload.getCurrentNode().getChildSnapshotWrappers().get(0);
return new JsonObject((Map) mappingProfileWrapper.getContent()).mapTo(MappingProfile.class);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ public String getPostProcessingInitializationEventType() {
}

@Override
protected String getNextEventType() {
protected String getUpdateEventType() {
return DI_SRS_MARC_AUTHORITY_RECORD_UPDATED.value();
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,23 +2,29 @@

import static java.util.Objects.isNull;
import static org.apache.commons.lang3.StringUtils.isBlank;
import static org.folio.ActionProfile.Action.MODIFY;
import static org.folio.ActionProfile.Action.UPDATE;
import static org.folio.dataimport.util.RestUtil.OKAPI_TENANT_HEADER;
import static org.folio.dataimport.util.RestUtil.OKAPI_TOKEN_HEADER;
import static org.folio.dataimport.util.RestUtil.OKAPI_URL_HEADER;
import static org.folio.rest.jaxrs.model.DataImportEventTypes.DI_SRS_MARC_BIB_RECORD_MODIFIED;
import static org.folio.rest.jaxrs.model.DataImportEventTypes.DI_SRS_MARC_BIB_RECORD_MODIFIED_READY_FOR_POST_PROCESSING;
import static org.folio.rest.jaxrs.model.DataImportEventTypes.DI_SRS_MARC_BIB_RECORD_UPDATED;
import static org.folio.rest.jaxrs.model.EntityType.MARC_BIBLIOGRAPHIC;
import static org.folio.services.handlers.match.AbstractMarcMatchEventHandler.CENTRAL_TENANT_ID;
import static org.folio.services.util.AdditionalFieldsUtil.isSubfieldExist;

import io.vertx.core.Future;
import io.vertx.core.Promise;
import io.vertx.core.Vertx;

import java.io.IOException;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.concurrent.CompletableFuture;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.folio.DataImportEventPayload;
Expand Down Expand Up @@ -79,7 +85,11 @@ protected boolean isHridFillingNeeded() {
}

@Override
protected String getNextEventType() {
protected String getUpdateEventType() {
return DI_SRS_MARC_BIB_RECORD_UPDATED.value();
}

protected String getModifyEventType() {
return DI_SRS_MARC_BIB_RECORD_MODIFIED.value();
}

Expand All @@ -88,6 +98,17 @@ protected EntityType modifiedEntityType() {
return MARC_BIBLIOGRAPHIC;
}

@Override
protected void submitSuccessfulEventType(DataImportEventPayload payload, CompletableFuture<DataImportEventPayload> future, MappingDetail.MarcMappingOption marcMappingOption) {
if (marcMappingOption.value().equals(MODIFY.value())) {
payload.setEventType(getModifyEventType());
}
if (marcMappingOption.value().equals(UPDATE.value())) {
payload.setEventType(getUpdateEventType());
}
future.complete(payload);
}

@Override
protected Future<Void> modifyRecord(DataImportEventPayload dataImportEventPayload, MappingProfile mappingProfile,
MappingParameters mappingParameters) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ public String getPostProcessingInitializationEventType() {
}

@Override
protected String getNextEventType() {
protected String getUpdateEventType() {
return DI_SRS_MARC_HOLDINGS_RECORD_UPDATED.value();
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
import static org.folio.rest.jaxrs.model.DataImportEventTypes.DI_INVENTORY_HOLDINGS_CREATED_READY_FOR_POST_PROCESSING;
import static org.folio.rest.jaxrs.model.DataImportEventTypes.DI_INVENTORY_HOLDING_CREATED;
import static org.folio.rest.jaxrs.model.DataImportEventTypes.DI_INVENTORY_HOLDING_MATCHED;
import static org.folio.rest.jaxrs.model.DataImportEventTypes.DI_INVENTORY_HOLDING_UPDATED;
import static org.folio.rest.jaxrs.model.DataImportEventTypes.DI_INVENTORY_INSTANCE_CREATED;
import static org.folio.rest.jaxrs.model.DataImportEventTypes.DI_INVENTORY_INSTANCE_CREATED_READY_FOR_POST_PROCESSING;
import static org.folio.rest.jaxrs.model.DataImportEventTypes.DI_INVENTORY_INSTANCE_MATCHED;
Expand Down Expand Up @@ -42,6 +43,7 @@ public class DataImportConsumersVerticle extends AbstractConsumerVerticle {
DI_INVENTORY_AUTHORITY_CREATED_READY_FOR_POST_PROCESSING.value(),
DI_INVENTORY_AUTHORITY_UPDATED_READY_FOR_POST_PROCESSING.value(),
DI_INVENTORY_HOLDING_CREATED.value(),
DI_INVENTORY_HOLDING_UPDATED.value(),
DI_INVENTORY_HOLDING_MATCHED.value(),
DI_INVENTORY_HOLDINGS_CREATED_READY_FOR_POST_PROCESSING.value(),
DI_INVENTORY_INSTANCE_CREATED.value(),
Expand Down
Loading

0 comments on commit 3111d4b

Please sign in to comment.