Skip to content

Commit

Permalink
MODBULKOPS-255 - MARC Instance - Content Update request for MARC inst…
Browse files Browse the repository at this point in the history
…ances
  • Loading branch information
siarhei-charniak committed Jun 21, 2024
1 parent d84ad34 commit f54bf1b
Show file tree
Hide file tree
Showing 31 changed files with 661 additions and 39 deletions.
13 changes: 13 additions & 0 deletions descriptors/ModuleDescriptor-template.json
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,13 @@
"modulePermissions": [
]
},
{
"methods": [ "POST" ],
"pathPattern": "/bulk-operations/{operationId}/marc-content-update",
"permissionsRequired": [ "bulk-operations.item.marc-content-update.post" ],
"modulePermissions": [
]
},
{
"methods": [ "GET" ],
"pathPattern": "/bulk-operations/{operationId}/preview",
Expand Down Expand Up @@ -274,6 +281,11 @@
"displayName" : "upload content updates for bulk operation",
"description" : "Upload content updates for bulk operation"
},
{
"permissionName" : "bulk-operations.item.marc-content-update.post",
"displayName" : "upload MARC content updates for bulk operation",
"description" : "Upload MARC content updates for bulk operation"
},
{
"permissionName" : "bulk-operations.item.preview.get",
"displayName" : "get bulk operation preview",
Expand Down Expand Up @@ -336,6 +348,7 @@
"subPermissions" : [
"bulk-operations.item.upload.post",
"bulk-operations.item.content-update.post",
"bulk-operations.item.marc-content-update.post",
"bulk-operations.item.preview.get",
"bulk-operations.item.preview.download.get",
"bulk-operations.item.start.post",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
import org.folio.bulkops.domain.dto.BulkOperationCollection;
import org.folio.bulkops.domain.dto.BulkOperationDto;
import org.folio.bulkops.domain.dto.BulkOperationRuleCollection;
import org.folio.bulkops.domain.dto.BulkOperationMarcRuleCollection;
import org.folio.bulkops.domain.dto.BulkOperationStart;
import org.folio.bulkops.domain.dto.BulkOperationStep;
import org.folio.bulkops.domain.dto.EntityType;
Expand Down Expand Up @@ -81,9 +82,9 @@ public ResponseEntity<Errors> getErrorsPreviewByOperationId(UUID operationId, In
}

@Override
public ResponseEntity<UnifiedTable> getPreviewByOperationId(UUID operationId, BulkOperationStep step, Integer limit, Integer offset, String source) {
public ResponseEntity<UnifiedTable> getPreviewByOperationId(UUID operationId, BulkOperationStep step, Integer limit, Integer offset) {
var bulkOperation = bulkOperationService.getBulkOperationOrThrow(operationId);
return new ResponseEntity<>(previewService.getPreview(bulkOperation, step, Objects.isNull(offset) ? 0 : offset, limit, source), HttpStatus.OK);
return new ResponseEntity<>(previewService.getPreview(bulkOperation, step, Objects.isNull(offset) ? 0 : offset, limit), HttpStatus.OK);
}

@Override
Expand All @@ -96,6 +97,17 @@ public ResponseEntity<BulkOperationRuleCollection> postContentUpdates(UUID opera
return ResponseEntity.ok(rules);
}

@Override
public ResponseEntity<BulkOperationMarcRuleCollection> postMarcContentUpdates(UUID operationId, BulkOperationMarcRuleCollection bulkOperationMarcRuleCollection) {
var operation = bulkOperationService.getBulkOperationOrThrow(operationId);

var rules = ruleService.saveMarcRules(bulkOperationMarcRuleCollection);

bulkOperationService.clearOperationProcessing(operation);

return ResponseEntity.ok(rules);
}

@Override
public ResponseEntity<BulkOperationDto> startBulkOperation(UUID operationId, BulkOperationStart bulkOperationStart, UUID xOkapiUserId) {
return new ResponseEntity<>(bulkOperationMapper.mapToDto(bulkOperationService.startBulkOperation(operationId, xOkapiUserId, bulkOperationStart)), HttpStatus.OK);
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
package org.folio.bulkops.domain.entity;

import io.hypersistence.utils.hibernate.type.json.JsonBinaryType;
import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import jakarta.persistence.Table;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.With;
import org.folio.bulkops.domain.dto.MarcAction;
import org.folio.bulkops.domain.dto.MarcParameter;
import org.folio.bulkops.domain.dto.MarcSubfieldAction;
import org.hibernate.annotations.Type;

import java.util.List;
import java.util.UUID;

@Data
@Builder
@With
@AllArgsConstructor
@NoArgsConstructor
@Entity
@Table(name = "bulk_operation_marc_rule")
public class BulkOperationMarcRule {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private UUID id;

private UUID bulkOperationId;
private UUID userId;
private String tag;
private String ind1;
private String ind2;
private String subfield;

@Type(JsonBinaryType.class)
@Column(columnDefinition = "jsonb")
private List<MarcAction> actions;

@Type(JsonBinaryType.class)
@Column(columnDefinition = "jsonb")
private List<MarcParameter> parameters;

@Type(JsonBinaryType.class)
@Column(columnDefinition = "jsonb")
private List<MarcSubfieldAction> subfields;
}
10 changes: 10 additions & 0 deletions src/main/java/org/folio/bulkops/mapper/MarcRulesMapper.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package org.folio.bulkops.mapper;

import org.folio.bulkops.domain.entity.BulkOperationMarcRule;
import org.mapstruct.Mapper;

@Mapper(componentModel = "spring")
public interface MarcRulesMapper {
org.folio.bulkops.domain.dto.BulkOperationMarcRule mapToDto(BulkOperationMarcRule rule);
BulkOperationMarcRule mapToEntity(org.folio.bulkops.domain.dto.BulkOperationMarcRule rule);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package org.folio.bulkops.repository;

import org.folio.bulkops.domain.entity.BulkOperationMarcRule;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

import java.util.List;
import java.util.UUID;

@Repository
public interface BulkOperationMarcRuleRepository extends JpaRepository<BulkOperationMarcRule, UUID> {
List<BulkOperationMarcRule> findAllByBulkOperationId(UUID bulkOperationId);

void deleteAllByBulkOperationId(UUID bulkOperationId);
}
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ public EntityType getEntityTypeById(UUID entityTypeId) {
case "Items" -> EntityType.ITEM;
case "Users" -> EntityType.USER;
case "Holdings" -> EntityType.HOLDINGS_RECORD;
case "Instances" -> EntityType.INSTANCE;
case "Instances" -> EntityType.INSTANCE_FOLIO;
default -> throw new IllegalArgumentException(String.format("Entity type %s is not supported", alias));
};
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,6 @@

import java.util.Collections;
import java.util.List;
import java.util.Objects;

@Service
@Log4j2
Expand Down
9 changes: 5 additions & 4 deletions src/main/java/org/folio/bulkops/service/PreviewService.java
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
import static org.apache.commons.lang3.StringUtils.EMPTY;
import static org.apache.commons.lang3.StringUtils.isEmpty;
import static org.folio.bulkops.domain.dto.ApproachType.MANUAL;
import static org.folio.bulkops.domain.dto.EntityType.INSTANCE_MARC;
import static org.folio.bulkops.domain.dto.UpdateOptionType.HOLDINGS_NOTE;
import static org.folio.bulkops.domain.dto.UpdateOptionType.INSTANCE_NOTE;
import static org.folio.bulkops.domain.dto.UpdateOptionType.ITEM_NOTE;
Expand Down Expand Up @@ -73,7 +74,7 @@ public class PreviewService {
private static final Pattern UUID_REGEX =
Pattern.compile("^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$");

public UnifiedTable getPreview(BulkOperation operation, BulkOperationStep step, int offset, int limit, String source) {
public UnifiedTable getPreview(BulkOperation operation, BulkOperationStep step, int offset, int limit) {
var entityType = operation.getEntityType();
var clazz = resolveEntityClass(operation.getEntityType());
return switch (step) {
Expand All @@ -82,7 +83,7 @@ public UnifiedTable getPreview(BulkOperation operation, BulkOperationStep step,
var bulkOperationId = operation.getId();
var rules = ruleService.getRules(bulkOperationId);
var options = getChangedOptionsSet(bulkOperationId, entityType, rules, clazz);
yield "MARC".equals(source) ?
yield INSTANCE_MARC.equals(operation.getEntityType()) ?
buildPreviewFromMarcFile(operation.getLinkToModifiedRecordsMarcFile(), clazz, offset, limit, options) :
buildPreviewFromCsvFile(operation.getLinkToModifiedRecordsCsvFile(), clazz, offset, limit, options);
}
Expand All @@ -93,7 +94,7 @@ public UnifiedTable getPreview(BulkOperation operation, BulkOperationStep step,
var bulkOperationId = operation.getId();
var rules = ruleService.getRules(bulkOperationId);
var options = getChangedOptionsSet(bulkOperationId, entityType, rules, clazz);
yield "MARC".equals(source) ?
yield INSTANCE_MARC.equals(operation.getEntityType()) ?
buildPreviewFromMarcFile(operation.getLinkToCommittedRecordsMarcFile(), clazz, offset, limit, options) :
buildPreviewFromCsvFile(operation.getLinkToCommittedRecordsCsvFile(), clazz, offset, limit, options);
}
Expand All @@ -120,7 +121,7 @@ private Set<String> getChangedOptionsSet(UUID bulkOperationId, EntityType entity
.filter(p -> HOLDINGS_NOTE_TYPE_ID_KEY.equals(p.getKey())).map(Parameter::getValue).findFirst() : Optional.empty();
}

if (EntityType.INSTANCE == entityType) {
if (EntityType.INSTANCE_FOLIO == entityType) {
initial = CollectionUtils.isNotEmpty(action.getParameters()) ? action.getParameters().stream()
.filter(p -> INSTANCE_NOTE_TYPE_ID_KEY.equals(p.getKey())).map(Parameter::getValue).findFirst() : Optional.empty();
}
Expand Down
31 changes: 31 additions & 0 deletions src/main/java/org/folio/bulkops/service/RuleService.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,14 @@

import org.folio.bulkops.domain.dto.Action;
import org.folio.bulkops.domain.dto.BulkOperationRule;
import org.folio.bulkops.domain.dto.BulkOperationMarcRule;
import org.folio.bulkops.domain.dto.BulkOperationRuleCollection;
import org.folio.bulkops.domain.dto.BulkOperationRuleRuleDetails;
import org.folio.bulkops.domain.dto.BulkOperationMarcRuleCollection;
import org.folio.bulkops.exception.NotFoundException;
import org.folio.bulkops.mapper.MarcRulesMapper;
import org.folio.bulkops.repository.BulkOperationMarcRuleRepository;
import org.folio.bulkops.repository.BulkOperationRepository;
import org.folio.bulkops.repository.BulkOperationRuleDetailsRepository;
import org.folio.bulkops.repository.BulkOperationRuleRepository;
import org.springframework.stereotype.Service;
Expand All @@ -19,6 +24,9 @@
public class RuleService {
private final BulkOperationRuleRepository ruleRepository;
private final BulkOperationRuleDetailsRepository ruleDetailsRepository;
private final BulkOperationRepository bulkOperationRepository;
private final BulkOperationMarcRuleRepository marcRuleRepository;
private final MarcRulesMapper marcRulesMapper;

@Transactional
public BulkOperationRuleCollection saveRules(BulkOperationRuleCollection ruleCollection) {
Expand Down Expand Up @@ -67,4 +75,27 @@ private BulkOperationRule mapBulkOperationRuleToDto(org.folio.bulkops.domain.ent
.parameters(details.getParameters()))
.toList()));
}

@Transactional
public BulkOperationMarcRuleCollection saveMarcRules(BulkOperationMarcRuleCollection ruleCollection) {
ruleCollection.getBulkOperationMarcRules().stream()
.map(BulkOperationMarcRule::getBulkOperationId)
.distinct()
.forEach(marcRuleRepository::deleteAllByBulkOperationId);

ruleCollection.getBulkOperationMarcRules()
.forEach(marcRule -> marcRuleRepository.save(marcRulesMapper.mapToEntity(marcRule)));

return ruleCollection;
}

public BulkOperationMarcRuleCollection getMarcRules(UUID bulkOperationId) {
var rules = marcRuleRepository.findAllByBulkOperationId(bulkOperationId).stream()
.map(marcRulesMapper::mapToDto)
.toList();
if (rules.isEmpty()) {
throw new NotFoundException("Bulk operation MARC rules were not found by bulk operation id=" + bulkOperationId);
}
return new BulkOperationMarcRuleCollection().bulkOperationMarcRules(rules).totalRecords(rules.size());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ public String resolve(EntityType type, BulkOperationsEntity entity) {
var user = (User) entity;
return format("/users/%s", user.getId());
}
case INSTANCE -> {
case INSTANCE_FOLIO -> {
var instance = (Instance) entity;
return format("/inventory/view/%s", instance.getId());
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package org.folio.bulkops.util;

import static org.folio.bulkops.domain.dto.EntityType.HOLDINGS_RECORD;
import static org.folio.bulkops.domain.dto.EntityType.INSTANCE;
import static org.folio.bulkops.domain.dto.EntityType.INSTANCE_FOLIO;
import static org.folio.bulkops.domain.dto.EntityType.ITEM;
import static org.folio.bulkops.domain.dto.UpdateOptionType.ADMINISTRATIVE_NOTE;
import static org.folio.bulkops.domain.dto.UpdateOptionType.CHECK_IN_NOTE;
Expand Down Expand Up @@ -66,13 +66,13 @@ public static String getFieldByUpdateOptionType(UpdateOptionType type, EntityTyp
return "Temporary Loan Type";
} else if (STATUS == type) {
return "Status";
} else if (SUPPRESS_FROM_DISCOVERY == type && INSTANCE == entity) {
} else if (SUPPRESS_FROM_DISCOVERY == type && INSTANCE_FOLIO == entity) {
return "Suppress from discovery";
} else if (SUPPRESS_FROM_DISCOVERY == type && ITEM == entity) {
return "Discovery Suppress";
} else if (SUPPRESS_FROM_DISCOVERY == type && HOLDINGS_RECORD == entity) {
return "Suppress from discovery";
} else if (STAFF_SUPPRESS == type && INSTANCE == entity) {
} else if (STAFF_SUPPRESS == type && INSTANCE_FOLIO == entity) {
return "Staff suppress";
} else if (ITEM_NOTE == type) {
return "Notes";
Expand Down
2 changes: 1 addition & 1 deletion src/main/java/org/folio/bulkops/util/Utils.java
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@ public static String encode(CharSequence s) {
public static Class<? extends BulkOperationsEntity> resolveEntityClass(EntityType clazz) {
return switch (clazz) {
case USER -> User.class;
case INSTANCE -> Instance.class;
case INSTANCE_FOLIO, INSTANCE_MARC -> Instance.class;
case ITEM -> Item.class;
case HOLDINGS_RECORD -> HoldingsRecord.class;
};
Expand Down
1 change: 1 addition & 0 deletions src/main/resources/db/changelog/changelog-master.xml
Original file line number Diff line number Diff line change
Expand Up @@ -28,4 +28,5 @@
<include file="changes/24-05-2024_drop_id_column_bulk_operation_data_processing.xml" relativeToChangelogFile="true"/>
<include file="changes/01-06-2024_add_new_error_columns.xml" relativeToChangelogFile="true"/>
<include file="changes/14-06-2024_add_marc_links_to_bulk_operation_table.xml" relativeToChangelogFile="true"/>
<include file="changes/18-06-2024_updates_for_editing_marc.xml" relativeToChangelogFile="true"/>
</databaseChangeLog>
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
CREATE TABLE IF NOT EXISTS bulk_operation_marc_rule (
id UUID PRIMARY KEY,
bulk_operation_id UUID,
user_id UUID,
tag TEXT,
ind1 TEXT,
ind2 TEXT,
subfield TEXT,
actions jsonb,
parameters jsonb,
subfields jsonb,
constraint fk_marc_rule_to_operation foreign key (bulk_operation_id)
references bulk_operation(id) ON DELETE CASCADE);

ALTER TYPE EntityType RENAME VALUE 'INSTANCE' TO 'INSTANCE_FOLIO';
ALTER TYPE EntityType ADD VALUE 'INSTANCE_MARC';

ALTER TYPE UpdateActionType ADD VALUE 'APPEND';
ALTER TYPE UpdateActionType ADD VALUE 'ADDITIONAL_SUBFIELD';
ALTER TYPE UpdateActionType ADD VALUE 'REMOVE_FIELD';
ALTER TYPE UpdateActionType ADD VALUE 'REMOVE_SUBFIELD';
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
<?xml version="1.0" encoding="UTF-8"?>
<databaseChangeLog
xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog
http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.8.xsd">


<changeSet id="18-06-2024_updates_for_editing_marc" author="firebird">
<sqlFile path="18-06-2024_updates_for_editing_marc.sql" relativeToChangelogFile="true" />
</changeSet>

</databaseChangeLog>
Loading

0 comments on commit f54bf1b

Please sign in to comment.