Skip to content

Commit

Permalink
Merge branch 'master' into MODINV-1002
Browse files Browse the repository at this point in the history
  • Loading branch information
KaterynaSenchenko authored Sep 12, 2024
2 parents 7d22137 + 39ad7d1 commit 180737d
Show file tree
Hide file tree
Showing 20 changed files with 355 additions and 57 deletions.
2 changes: 2 additions & 0 deletions NEWS.md
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,8 @@
* Disallow updating holdings ownership with related boundwith [MODINV-1051](https://folio-org.atlassian.net/browse/MODINV-1051)
* Disallow updating ownership of boundwith item [MODINV-1052](https://folio-org.atlassian.net/browse/MODINV-1052)
* InstanceIngress update events consumption [MODINV-1008](https://folio-org.atlassian.net/browse/MODINV-1008)
* Apply new date type fields to instance schema [MODINV-1067](https://folio-org.atlassian.net/browse/MODINV-1067)
* Extend Authority with Additional fields [MODINV-1071](https://folio-org.atlassian.net/browse/MODINV-1071)

## 20.2.0 2023-03-20
* Inventory cannot process Holdings with virtual fields ([MODINV-941](https://issues.folio.org/browse/MODINV-941))
Expand Down
12 changes: 12 additions & 0 deletions README.MD
Original file line number Diff line number Diff line change
Expand Up @@ -129,6 +129,18 @@ After setup, it is good to check logs in all related modules for errors.
* DI_SRS_MARC_BIB_RECORD_MODIFIED_PARTITIONS
Default value for all partitions is 1

## Properties

`AUTHORITY_EXTENDED` environment variable enables extended mapping for Authority to support advanced references classification in 5xx fields:
* broader terms (`$wg` tag)
* narrower terms (`$wh` tag)
* earlier headings (`$wa` tag)
* later headings (`$wb` tag)

Default value for `AUTHORITY_EXTENDED` is `false`.
The mapping itself is implemented in [data-import-processing-core](https://github.com/folio-org/data-import-processing-core).


# Making Requests

These modules provide HTTP based APIs rather than any UI themselves.
Expand Down
10 changes: 6 additions & 4 deletions descriptors/ModuleDescriptor-template.json
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
"provides": [
{
"id": "inventory",
"version": "13.1",
"version": "13.3",
"handlers": [
{
"methods": ["GET"],
Expand Down Expand Up @@ -559,7 +559,8 @@
"inventory-storage.holdings.item.get",
"inventory-storage.holdings.collection.get",
"inventory-storage.instances.item.get",
"inventory-storage.bound-with-parts.collection.get"
"inventory-storage.bound-with-parts.collection.get",
"user-tenants.collection.get"
]
},
{
Expand All @@ -574,7 +575,8 @@
"inventory-storage.items.item.delete",
"inventory-storage.items.collection.get",
"inventory-storage.instances.item.get",
"inventory-storage.bound-with-parts.collection.get"
"inventory-storage.bound-with-parts.collection.get",
"user-tenants.collection.get"
]
}
]
Expand Down Expand Up @@ -602,7 +604,7 @@
},
{
"id": "instance-storage",
"version": "10.0"
"version": "10.3"
},
{
"id": "instance-storage-batch",
Expand Down
1 change: 1 addition & 0 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -451,6 +451,7 @@
<path>${basedir}/ramls/instance-ingress-event.json</path>
<path>${basedir}/ramls/tenantItemPair.json</path>
<path>${basedir}/ramls/tenantItemPairCollection.json</path>
<path>${basedir}/ramls/tenantItemResponse.json</path>
</sourcePaths>
<targetPackage>org.folio</targetPackage>
<generateBuilders>true</generateBuilders>
Expand Down
21 changes: 21 additions & 0 deletions ramls/instance.json
Original file line number Diff line number Diff line change
Expand Up @@ -335,6 +335,27 @@
]
}
},
"dates": {
"type": "object",
"description": "Instance Dates",
"properties": {
"dateTypeId": {
"type": "string",
"description": "Date type ID",
"$ref": "uuid.json"
},
"date1": {
"type": "string",
"description": "Date 1",
"maxLength": 4
},
"date2": {
"type": "string",
"description": "Date 2",
"maxLength": 4
}
}
},
"instanceTypeId": {
"type": "string",
"description": "The unique term for the resource type whether it's from the RDA content term list of locally defined"
Expand Down
20 changes: 20 additions & 0 deletions ramls/tenantItemResponse.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
{
"$schema": "http://json-schema.org/draft-04/schema#",
"description": "Collection of pairs of item and tenant IDs",
"type": "object",
"properties": {
"tenantItems": {
"type": "array",
"description": "Items with corresponding tenantIds",
"items": {
"type": "object",
"additionalProperties": true
}
},
"totalRecords": {
"type": "integer"
}
},
"additionalProperties": false,
"required": ["item", "totalRecords"]
}
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,8 @@ public class InventoryConfigurationImpl implements InventoryConfiguration {
Instance.INSTANCE_TYPE_ID_KEY,
Instance.MODE_OF_ISSUANCE_ID_KEY,
Instance.PRECEDING_TITLES_KEY,
Instance.SUCCEEDING_TITLES_KEY
Instance.SUCCEEDING_TITLES_KEY,
Instance.DATES_KEY
);

private static final Set<String> HOLDINGS_BLOCKED_FIELDS = Sets.newHashSet(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
import org.apache.logging.log4j.Logger;

import org.folio.ActionProfile;
import org.folio.ActionProfile.FolioRecord;
import org.folio.Authority;
import org.folio.DataImportEventPayload;
import org.folio.MappingMetadataDto;
Expand Down Expand Up @@ -54,10 +55,13 @@ public abstract class AbstractAuthorityEventHandler implements EventHandler {

private static final String RECORD_ID_HEADER = "recordId";
private static final String CHUNK_ID_HEADER = "chunkId";
public static final String AUTHORITY_EXTENDED = "AUTHORITY_EXTENDED";

private final Storage storage;
private final MappingMetadataCache mappingMetadataCache;

private static boolean isAuthorityExtended = isAuthorityExtendedMode();

protected AbstractAuthorityEventHandler(Storage storage, MappingMetadataCache mappingMetadataCache) {
this.storage = storage;
this.mappingMetadataCache = mappingMetadataCache;
Expand Down Expand Up @@ -161,7 +165,9 @@ private Future<Authority> mapAuthority(DataImportEventPayload payload, MappingMe
var mappingParameters = Json.decodeValue(mappingMetadata.getMappingParams(), MappingParameters.class);
var parsedRecord = new JsonObject((String) new JsonObject(payload.getContext().get(sourceRecordType().value()))
.mapTo(Record.class).getParsedRecord().getContent());
RecordMapper<Authority> recordMapper = RecordMapperBuilder.buildMapper(sourceRecordType().value());
RecordMapper<Authority> recordMapper = isAuthorityExtended
? RecordMapperBuilder.buildMapper(FolioRecord.MARC_AUTHORITY_EXTENDED.value())
: RecordMapperBuilder.buildMapper(sourceRecordType().value());
var authority = recordMapper.mapRecord(parsedRecord, mappingParameters, mappingRules);
authority.setSource(Authority.Source.MARC);
return Future.succeededFuture(authority);
Expand Down Expand Up @@ -215,4 +221,18 @@ private String constructMetaInfoMsg(DataImportEventPayload payload) {
getChunkIdHeader(payload)
);
}

private static boolean isAuthorityExtendedMode() {
return Boolean.parseBoolean(
System.getenv().getOrDefault(AUTHORITY_EXTENDED, "false"));
}

/**
* For test usage only.
*
* @param newIsAuthoritiesExtended New value for the env to set.
*/
public static void setAuthorityExtendedMode(boolean newIsAuthoritiesExtended) {
isAuthorityExtended = newIsAuthoritiesExtended;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,11 @@
import static org.apache.commons.lang3.StringUtils.EMPTY;
import static org.apache.commons.lang3.StringUtils.isNotEmpty;

import io.vertx.core.json.Json;
import io.vertx.core.json.JsonObject;
import java.util.List;
import java.util.concurrent.CompletableFuture;
import java.util.stream.Collectors;

import io.vertx.core.json.Json;
import io.vertx.core.json.JsonObject;

import org.folio.DataImportEventPayload;
import org.folio.HoldingsRecord;
import org.folio.inventory.common.Context;
Expand All @@ -26,6 +24,7 @@ public class HoldingLoader extends AbstractLoader<HoldingsRecord> {
private static final String HOLDINGS_FIELD = "holdings";
private static final String INSTANCE_ID_FIELD = "instanceId";
private static final String INSTANCES_IDS_KEY = "INSTANCES_IDS";
private static final String EMPTY_ARRAY = "[]";

private Storage storage;
private AbstractPreloader preloader;
Expand Down Expand Up @@ -59,7 +58,7 @@ protected String addCqlSubMatchCondition(DataImportEventPayload eventPayload) {
cqlSubMatch = getConditionByMultiMatchResult(eventPayload);
} else if (isNotEmpty(eventPayload.getContext().get(INSTANCES_IDS_KEY))) {
cqlSubMatch = getConditionByMultipleMarcBibMatchResult(eventPayload);
} else if (isNotEmpty(eventPayload.getContext().get(EntityType.HOLDINGS.value()))) {
} else if (isNotNullOrEmpty(eventPayload.getContext().get(EntityType.HOLDINGS.value()))) {
JsonObject holdingAsJson = new JsonObject(eventPayload.getContext().get(EntityType.HOLDINGS.value()));
if (holdingAsJson.getJsonObject(HOLDINGS_FIELD) != null) {
holdingAsJson = holdingAsJson.getJsonObject(HOLDINGS_FIELD);
Expand All @@ -73,6 +72,12 @@ protected String addCqlSubMatchCondition(DataImportEventPayload eventPayload) {
return cqlSubMatch;
}

private static boolean isNotNullOrEmpty(String value) {
if (value == null || value.equals(EMPTY_ARRAY))
return false;
return isNotEmpty(value);
}

private String getConditionByMultipleMarcBibMatchResult(DataImportEventPayload eventPayload) {
return getConditionByMultipleValues(INSTANCE_ID_FIELD, eventPayload, INSTANCES_IDS_KEY);
}
Expand Down
42 changes: 42 additions & 0 deletions src/main/java/org/folio/inventory/domain/instances/Dates.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
package org.folio.inventory.domain.instances;

import io.vertx.core.json.JsonObject;
import lombok.AllArgsConstructor;
import lombok.Getter;

import static org.apache.commons.lang3.ObjectUtils.anyNotNull;
import static org.folio.inventory.support.JsonHelper.includeIfPresent;

@Getter
@AllArgsConstructor
public class Dates {
// JSON property names
public static final String DATE_TYPE_ID_KEY = "dateTypeId";
public static final String DATE1_KEY = "date1";
public static final String DATE2_KEY = "date2";

public final String dateTypeId;
public final String date1;
public final String date2;

public static JsonObject datesToJson(Dates dates) {
if (dates == null || (dates.getDate1() == null && dates.getDate2() == null && dates.getDateTypeId() == null)) {
return null;
}
var json = new JsonObject();
includeIfPresent(json, DATE_TYPE_ID_KEY, dates.getDateTypeId());
includeIfPresent(json, DATE1_KEY, dates.getDate1());
includeIfPresent(json, DATE2_KEY, dates.getDate2());
return json;
}

public static Dates datesFromJson(JsonObject datesJson) {
if (datesJson == null) {
return null;
}
var dateTypeId = datesJson.getString(DATE_TYPE_ID_KEY);
var date1 = datesJson.getString(DATE1_KEY);
var date2 = datesJson.getString(DATE2_KEY);
return anyNotNull(dateTypeId, date1, date2) ? new Dates(dateTypeId, date1, date2) : null;
}
}
20 changes: 17 additions & 3 deletions src/main/java/org/folio/inventory/domain/instances/Instance.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package org.folio.inventory.domain.instances;

import static org.folio.inventory.domain.instances.Dates.datesFromJson;
import static org.folio.inventory.domain.instances.Dates.datesToJson;
import static org.folio.inventory.domain.instances.PublicationPeriod.publicationPeriodFromJson;
import static org.folio.inventory.domain.instances.PublicationPeriod.publicationPeriodToJson;
import static org.folio.inventory.support.JsonArrayHelper.toListOfStrings;
Expand Down Expand Up @@ -73,6 +75,7 @@ public class Instance {
public static final String TAG_LIST_KEY = "tagList";
public static final String NATURE_OF_CONTENT_TERM_IDS_KEY = "natureOfContentTermIds";
public static final String PUBLICATION_PERIOD_KEY = "publicationPeriod";
public static final String DATES_KEY = "dates";

private final String id;
@JsonProperty("_version")
Expand Down Expand Up @@ -117,6 +120,7 @@ public class Instance {
private List<String> tags;
private List<String> natureOfContentTermIds = new ArrayList<>();
private PublicationPeriod publicationPeriod;
private Dates dates;

protected static final String INVENTORY_PATH = "/inventory";
protected static final String INSTANCES_PATH = INVENTORY_PATH + "/instances";
Expand Down Expand Up @@ -188,7 +192,8 @@ public static Instance fromJson(JsonObject instanceJson) {
.setStatusUpdatedDate(instanceJson.getString(STATUS_UPDATED_DATE_KEY))
.setTags(getTags(instanceJson))
.setNatureOfContentTermIds(toListOfStrings(instanceJson.getJsonArray(NATURE_OF_CONTENT_TERM_IDS_KEY)))
.setPublicationPeriod(publicationPeriodFromJson(instanceJson.getJsonObject(PUBLICATION_PERIOD_KEY)));
.setPublicationPeriod(publicationPeriodFromJson(instanceJson.getJsonObject(PUBLICATION_PERIOD_KEY)))
.setDates(datesFromJson(instanceJson.getJsonObject(DATES_KEY)));
}

/**
Expand Down Expand Up @@ -237,6 +242,7 @@ public JsonObject getJsonForStorage() {
json.put(TAGS_KEY, new JsonObject().put(TAG_LIST_KEY, new JsonArray(getTags() == null ? Collections.emptyList() : getTags())));
json.put(NATURE_OF_CONTENT_TERM_IDS_KEY, natureOfContentTermIds);
putIfNotNull(json, PUBLICATION_PERIOD_KEY, publicationPeriodToJson(publicationPeriod));
putIfNotNull(json, DATES_KEY, datesToJson(dates));

return json;
}
Expand Down Expand Up @@ -290,6 +296,7 @@ public JsonObject getJsonForResponse(WebContext context) {
putIfNotNull(json, TAGS_KEY, new JsonObject().put(TAG_LIST_KEY, new JsonArray(getTags())));
putIfNotNull(json, NATURE_OF_CONTENT_TERM_IDS_KEY, getNatureOfContentTermIds());
putIfNotNull(json, PUBLICATION_PERIOD_KEY, publicationPeriodToJson(publicationPeriod));
putIfNotNull(json, DATES_KEY, datesToJson(dates));

if (precedingTitles != null) {
JsonArray precedingTitlesJsonArray = new JsonArray();
Expand Down Expand Up @@ -461,6 +468,11 @@ public Instance setElectronicAccess (JsonArray array) {
return this;
}

public Instance setDates(Dates dates) {
this.dates = dates;
return this;
}

public Instance setInstanceFormatIds(List<String> instanceFormatIds) {
this.instanceFormatIds = instanceFormatIds;
return this;
Expand Down Expand Up @@ -747,7 +759,8 @@ public Instance copyWithNewId(String newId) {
.setMetadata(metadata)
.setTags(tags)
.setNatureOfContentTermIds(natureOfContentTermIds)
.setPublicationPeriod(publicationPeriod);
.setPublicationPeriod(publicationPeriod)
.setDates(dates);
}

public Instance copyInstance() {
Expand Down Expand Up @@ -781,7 +794,8 @@ public Instance copyInstance() {
.setMetadata(metadata)
.setTags(tags)
.setNatureOfContentTermIds(natureOfContentTermIds)
.setPublicationPeriod(publicationPeriod);
.setPublicationPeriod(publicationPeriod)
.setDates(dates);
}

public Instance addIdentifier(Identifier identifier) {
Expand Down
Loading

0 comments on commit 180737d

Please sign in to comment.