Skip to content

Commit

Permalink
MODEXPW-452: Initial ISSN/ISBN
Browse files Browse the repository at this point in the history
  • Loading branch information
DmytroBykov1 committed Jan 9, 2024
1 parent 8d7a0cf commit cd1405a
Show file tree
Hide file tree
Showing 8 changed files with 72 additions and 13 deletions.
7 changes: 6 additions & 1 deletion descriptors/ModuleDescriptor-template.json
Original file line number Diff line number Diff line change
Expand Up @@ -184,7 +184,12 @@
"usergroups.collection.get",
"usergroups.item.get",
"users.collection.get",
"users.item.get"
"users.item.get",
"inventory-storage.instance-statuses.item.get",
"inventory-storage.modes-of-issuance.item.get",
"inventory-storage.instance-types.item.get",
"inventory-storage.nature-of-content-terms.item.get",
"inventory-storage.instance-formats.item.get"
]
},
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
import org.folio.dew.domain.dto.FormatOfInstance;
import org.folio.dew.domain.dto.Instance;
import org.folio.dew.domain.dto.InstanceContributorsInner;
import org.folio.dew.domain.dto.InstanceIdentifiersInner;
import org.folio.dew.domain.dto.InstanceSeriesInner;
import org.folio.dew.service.InstanceReferenceService;
import org.folio.dew.service.SpecialCharacterEscaper;
Expand All @@ -24,8 +25,9 @@
import java.util.stream.Collectors;

import static org.apache.commons.lang3.StringUtils.EMPTY;
import static org.folio.dew.utils.Constants.ARRAY_DELIMITER_SPACED;
import static org.folio.dew.utils.Constants.ITEM_DELIMITER;
import static org.folio.dew.domain.dto.eholdings.Identifier.TypeEnum.ISBN;
import static org.folio.dew.domain.dto.eholdings.Identifier.TypeEnum.ISSN;
import static org.folio.dew.utils.Constants.*;

@Component
@StepScope
Expand Down Expand Up @@ -81,37 +83,50 @@ private String fetchInstanceFormats(List<FormatOfInstance> instanceFormats, Erro
return isEmpty(instanceFormats) ? EMPTY :
instanceFormats.stream()
.map(iFormat -> instanceReferenceService.getFormatOfInstanceNameById(iFormat.getId(), errorServiceArgs))
.map(iFormatName -> String.join(ITEM_DELIMITER, escaper.escape(iFormatName)))
.collect(Collectors.joining(ITEM_DELIMITER));
.map(escaper::escape)
.collect(Collectors.joining(ITEM_DELIMITER_SPACED));
}

private String fetchNatureOfContentTerms(Set<String> natureOfContentTermIds, ErrorServiceArgs errorServiceArgs) {
return isEmpty(natureOfContentTermIds) ? EMPTY :
natureOfContentTermIds.stream()
.map(natId -> instanceReferenceService.getNatureOfContentTermNameById(natId, errorServiceArgs))
.map(natName -> String.join(ITEM_DELIMITER, escaper.escape(natName)))
.collect(Collectors.joining(ITEM_DELIMITER));
.map(escaper::escape)
.collect(Collectors.joining(ITEM_DELIMITER_SPACED));
}

private String fetchContributorNames(List<InstanceContributorsInner> contributors) {
return isEmpty(contributors) ? EMPTY :
contributors.stream()
.map(c -> String.join(ARRAY_DELIMITER_SPACED, escaper.escape(c.getName())))
.map(InstanceContributorsInner::getName)
.map(escaper::escape)
.collect(Collectors.joining(ARRAY_DELIMITER_SPACED));
}

private String fetchSeries(Set<InstanceSeriesInner> series) {
return isEmpty(series) ? EMPTY :
series.stream()
.map(instanceSeriesInner -> String.join(ITEM_DELIMITER, escaper.escape(instanceSeriesInner.getValue())))
.collect(Collectors.joining(ITEM_DELIMITER));
.map(InstanceSeriesInner::getValue)
.map(escaper::escape)
.collect(Collectors.joining(ITEM_DELIMITER_SPACED));
}


private String getIdentifier(Instance instance, String identifierType) {
try {
return switch (org.folio.dew.domain.dto.IdentifierType.fromValue(identifierType)) {
case HRID -> instance.getHrid();
case ISSN -> instance.getIdentifiers().stream()
.filter(identifier -> instanceReferenceService.getTypeOfIdentifiersIdByName(ISSN.getValue()).equals(identifier.getIdentifierTypeId()))
.findFirst()
.map(InstanceIdentifiersInner::getValue)
.orElse(instance.getId());
case ISBN -> instance.getIdentifiers().stream()
.filter(identifier -> instanceReferenceService.getTypeOfIdentifiersIdByName(ISBN.getValue()).equals(identifier.getIdentifierTypeId()))
.findFirst()
.map(InstanceIdentifiersInner::getValue)
.orElse(instance.getId());

default -> instance.getId();
};
} catch (IllegalArgumentException e) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
import org.folio.dew.domain.dto.InstanceCollection;
import org.folio.dew.domain.dto.ItemIdentifier;
import org.folio.dew.error.BulkEditException;
import org.folio.dew.service.InstanceReferenceService;
import org.folio.dew.utils.ExceptionHelper;
import org.jetbrains.annotations.NotNull;
import org.springframework.batch.core.configuration.annotation.StepScope;
Expand All @@ -28,6 +29,7 @@
@Log4j2
public class InstanceFetcher implements ItemProcessor<ItemIdentifier, InstanceCollection> {
private final InventoryInstancesClient inventoryInstancesClient;
private final InstanceReferenceService instanceReferenceService;

@Value("#{jobParameters['identifierType']}")
private String identifierType;
Expand All @@ -42,6 +44,11 @@ public InstanceCollection process(@NotNull ItemIdentifier itemIdentifier) throws
identifiersToCheckDuplication.add(itemIdentifier);
var limit = HOLDINGS_RECORD_ID == IdentifierType.fromValue(identifierType) ? Integer.MAX_VALUE : 1;
var idType = resolveIdentifier(identifierType);
if ("ISSN".equals(idType) || "ISBN".equals(idType)){
String typeOfIdentifiersId = instanceReferenceService.getTypeOfIdentifiersIdByName(idType);

return inventoryInstancesClient.getInstanceByQuery(String.format("(identifiers=/@identifierTypeId=%s %s)", typeOfIdentifiersId, itemIdentifier.getItemId()));
}
try {
return inventoryInstancesClient.getInstanceByQuery(String.format(getMatchPattern(identifierType), idType, itemIdentifier.getItemId()), limit);
} catch (DecodeException e) {
Expand Down
5 changes: 5 additions & 0 deletions src/main/java/org/folio/dew/client/IdentifierTypeClient.java
Original file line number Diff line number Diff line change
@@ -1,15 +1,20 @@
package org.folio.dew.client;

import org.folio.dew.domain.dto.HoldingsTypeCollection;
import org.folio.dew.domain.dto.TypeOfIdentifiersCollection;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;

import com.fasterxml.jackson.databind.JsonNode;
import org.springframework.web.bind.annotation.RequestParam;


@FeignClient(name = "identifier-types")
public interface IdentifierTypeClient {
@GetMapping(value = "/{identifierTypeId}", produces = MediaType.APPLICATION_JSON_VALUE) JsonNode getIdentifierType(@PathVariable String identifierTypeId);

@GetMapping(produces = MediaType.APPLICATION_JSON_VALUE)
TypeOfIdentifiersCollection getByQuery(@RequestParam String query);
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,15 @@

import lombok.RequiredArgsConstructor;
import lombok.extern.log4j.Log4j2;
import org.folio.dew.client.*;
import org.apache.commons.lang3.StringUtils;
import org.folio.dew.client.InstanceStatusesClient;
import org.folio.dew.client.InstanceModeOfIssuanceClient;
import org.folio.dew.client.InstanceTypesClient;
import org.folio.dew.client.NatureOfContentTermsClient;
import org.folio.dew.client.InstanceFormatsClient;
import org.folio.dew.client.IdentifierTypeClient;
import org.folio.dew.domain.dto.ErrorServiceArgs;
import org.folio.dew.domain.dto.TypeOfIdentifiersCollection;
import org.folio.dew.error.BulkEditException;
import org.folio.dew.error.NotFoundException;
import org.springframework.cache.annotation.Cacheable;
Expand All @@ -18,12 +25,15 @@
@RequiredArgsConstructor
public class InstanceReferenceService {

private static final String QUERY_PATTERN_NAME = "name==\"%s\"";

private final BulkEditProcessingErrorsService errorsService;
private final InstanceStatusesClient instanceStatusesClient;
private final InstanceModeOfIssuanceClient instanceModeOfIssuanceClient;
private final InstanceTypesClient instanceTypesClient;
private final NatureOfContentTermsClient natureOfContentTermsClient;
private final InstanceFormatsClient instanceFormatsClient;
private final IdentifierTypeClient identifierTypeClient;


@Cacheable(cacheNames = "instanceStatusNames")
Expand Down Expand Up @@ -72,4 +82,17 @@ public String getFormatOfInstanceNameById(String instanceFormatId, ErrorServiceA
}
}

@Cacheable(cacheNames = "typeOfIdentifiersIds")
public String getTypeOfIdentifiersIdByName(String identifierName) {
if (StringUtils.isEmpty(identifierName)) {
return null;
}
TypeOfIdentifiersCollection typeOfIdentifiers = identifierTypeClient.getByQuery(String.format(QUERY_PATTERN_NAME, identifierName));
if (typeOfIdentifiers.getTypesOfIdentifier().isEmpty()) {
log.error("Identifier type not found by identifierName={}", identifierName);
return identifierName;
}
return typeOfIdentifiers.getTypesOfIdentifier().get(0).getId();
}

}
2 changes: 1 addition & 1 deletion src/main/java/org/folio/dew/utils/Constants.java
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ public class Constants {
public static final String CSV_EXTENSION = ".csv";

public static final String ARRAY_DELIMITER = ";";
public static final String ARRAY_DELIMITER_SPACED = " ; ";
public static final String ARRAY_DELIMITER_SPACED = "; ";
public static final String ELECTRONIC_RELATIONSHIP_NAME_ID_DELIMITER = ARRAY_DELIMITER;
public static final String ITEM_DELIMITER = "|";
public static final String ITEM_DELIMITER_SPACED = " | ";
Expand Down
4 changes: 4 additions & 0 deletions src/main/resources/swagger.api/bulk-edit.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -677,6 +677,10 @@ components:
$ref: '../../../../folio-export-common/schemas/inventory/instanceType.json#/InstanceType'
natureOfContentTerm:
$ref: '../../../../folio-export-common/schemas/inventory/natureOfContentTerm.json#/NatureOfContentTerm'
typeOfIdentifier:
$ref: '../../../../folio-export-common/schemas/inventory/typeOfIdentifier.json#/TypeOfIdentifier'
typeOfIdentifiersCollection:
$ref: '../../../../folio-export-common/schemas/inventory/typeOfIdentifiersCollection.json#/TypeOfIdentifiersCollection'
examples:
errors:
value:
Expand Down

0 comments on commit cd1405a

Please sign in to comment.