Skip to content

Commit 3e21ba2

Browse files
authored
MODLD-940: Allow Import of Authority Records Without LCCN (#403)
* MODLD-940: Allow Import of Authority Records Without LCCN * MODLD-940: Update AuthorityAssignmentControllerIT to validate assignment of FAST authorities
1 parent b693efb commit 3e21ba2

File tree

8 files changed

+31
-54
lines changed

8 files changed

+31
-54
lines changed

NEWS.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,7 @@
7979
- New endpoints for workspace profile settings [MODLD-936](https://folio-org.atlassian.net/browse/MODLD-936)
8080
- MOCKED_RESOURCE type handling and validation [MODLD-789](https://folio-org.atlassian.net/browse/MODLD-789)
8181
- Preserve ACCESSIBILITY_NOTE (MARC 532) when an Instance is saved [MODLD-728](https://folio-org.atlassian.net/browse/MODLD-728)
82+
- Allow Import of Authority Records Without LCCN [MODLD-940](https://folio-org.atlassian.net/browse/MODLD-940)
8283

8384
## 1.0.4 (04-24-2025)
8485
- Work Edit form - Instance read-only section: "Notes about the instance" data is not shown [MODLD-716](https://folio-org.atlassian.net/browse/MODLD-716)

src/main/java/org/folio/linked/data/integration/kafka/listener/handler/srs/SourceRecordDomainEventHandlerImpl.java

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88
import static org.folio.linked.data.domain.dto.SourceRecordType.MARC_BIB;
99
import static org.folio.linked.data.util.Constants.STANDALONE_PROFILE;
1010
import static org.folio.linked.data.util.JsonUtils.hasElementByJsonPath;
11-
import static org.folio.linked.data.util.LccnUtils.hasLccn;
1211

1312
import java.util.Set;
1413
import lombok.RequiredArgsConstructor;
@@ -48,7 +47,7 @@ public void handle(SourceRecordDomainEvent event, SourceRecordType recordType) {
4847
if (notProcessableEvent(event, recordType)) {
4948
return;
5049
}
51-
if (isAuthorityEventWithLccn(event, recordType)) {
50+
if (recordType == MARC_AUTHORITY) {
5251
saveAuthorities(event);
5352
} else if (isLinkedDataBibCreateEvent(event, recordType)) {
5453
saveAdminMetadata(event);
@@ -89,11 +88,6 @@ private void saveAuthority(Resource resource, SourceRecordDomainEvent event) {
8988
}
9089
}
9190

92-
private boolean isAuthorityEventWithLccn(SourceRecordDomainEvent event, SourceRecordType recordType) {
93-
return recordType == MARC_AUTHORITY
94-
&& hasLccn(event.getEventPayload().getParsedRecord().getContent());
95-
}
96-
9791
private boolean isLinkedDataBibCreateEvent(SourceRecordDomainEvent event, SourceRecordType recordType) {
9892
return recordType == MARC_BIB
9993
&& event.getEventType() == SOURCE_RECORD_CREATED

src/main/java/org/folio/linked/data/service/resource/marc/ResourceMarcAuthorityServiceImpl.java

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,9 @@
44
import static java.util.Optional.ofNullable;
55
import static org.folio.ld.dictionary.PredicateDictionary.REPLACED_BY;
66
import static org.folio.linked.data.domain.dto.AssignmentCheckResponseDto.InvalidAssignmentReasonEnum.NOT_VALID_FOR_TARGET;
7-
import static org.folio.linked.data.domain.dto.AssignmentCheckResponseDto.InvalidAssignmentReasonEnum.NO_LCCN;
87
import static org.folio.linked.data.domain.dto.AssignmentCheckResponseDto.InvalidAssignmentReasonEnum.UNSUPPORTED_MARC;
98
import static org.folio.linked.data.util.Constants.MSG_NOT_FOUND_IN;
109
import static org.folio.linked.data.util.JsonUtils.writeValueAsString;
11-
import static org.folio.linked.data.util.LccnUtils.hasLccn;
1210
import static org.folio.linked.data.util.ResourceUtils.setPreferred;
1311

1412
import com.fasterxml.jackson.databind.ObjectMapper;
@@ -79,10 +77,6 @@ public Optional<Resource> fetchAuthorityOrCreateByInventoryId(String inventoryId
7977

8078
@Override
8179
public AssignmentCheckResponseDto validateAuthorityAssignment(String marc, AssignAuthorityTarget target) {
82-
if (!hasLccn(marc)) {
83-
return new AssignmentCheckResponseDto(false).invalidAssignmentReason(NO_LCCN);
84-
}
85-
8680
return marcAuthority2ldMapper.fromMarcJson(marc)
8781
.stream()
8882
.findFirst()
Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,16 @@
11
package org.folio.linked.data.util;
22

33
import static org.apache.commons.collections4.CollectionUtils.isEmpty;
4-
import static org.folio.linked.data.util.JsonUtils.hasElementByJsonPath;
54

65
import lombok.experimental.UtilityClass;
76
import org.folio.linked.data.domain.dto.IdentifierRequest;
87

98
@UtilityClass
109
public class LccnUtils {
11-
12-
private static final String LCCN_JSON_PATH = "$.fields[*].010.subfields[*].a";
13-
1410
public static boolean isCurrent(IdentifierRequest lccnRequest) {
1511
return isEmpty(lccnRequest.getStatus()) || lccnRequest.getStatus()
1612
.stream()
1713
.flatMap(status -> status.getLink().stream())
1814
.anyMatch(link -> link.endsWith("current"));
1915
}
20-
21-
public static boolean hasLccn(String marcJson) {
22-
return hasElementByJsonPath(marcJson, LCCN_JSON_PATH);
23-
}
2416
}

src/main/resources/swagger.api/schema/assignmentCheckResponseDto.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
},
1010
"invalidAssignmentReason": {
1111
"type": "string",
12-
"enum": ["UNSUPPORTED_MARC", "NO_LCCN", "NOT_VALID_FOR_TARGET"],
12+
"enum": ["UNSUPPORTED_MARC", "NOT_VALID_FOR_TARGET"],
1313
"description": "Indicates the reason why the assignment is not valid. Only present if 'validAssignment' is false."
1414
}
1515
},

src/test/java/org/folio/linked/data/e2e/AuthorityAssignmentControllerIT.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ class AuthorityAssignmentControllerIT {
3939
"samples/marc/authority_jurisdiction.json, true",
4040
"samples/marc/authority_concept_meeting.json, false",
4141
"samples/marc/non_authority.json, false",
42+
"samples/marc/authority_person_fast.json, true",
4243
})
4344
void authorityAssignmentCheck(String marcFile, String expectedResponse) throws Exception {
4445
// given

src/test/java/org/folio/linked/data/service/resource/marc/ResourceMarcAuthorityServiceAuthorityAsssignmentTest.java

Lines changed: 0 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
import static org.folio.ld.dictionary.ResourceTypeDictionary.FORM;
66
import static org.folio.ld.dictionary.ResourceTypeDictionary.PERSON;
77
import static org.folio.linked.data.domain.dto.AssignmentCheckResponseDto.InvalidAssignmentReasonEnum.NOT_VALID_FOR_TARGET;
8-
import static org.folio.linked.data.domain.dto.AssignmentCheckResponseDto.InvalidAssignmentReasonEnum.NO_LCCN;
98
import static org.folio.linked.data.domain.dto.AssignmentCheckResponseDto.InvalidAssignmentReasonEnum.UNSUPPORTED_MARC;
109
import static org.folio.linked.data.service.resource.marc.AssignAuthorityTarget.CREATOR_OF_WORK;
1110
import static org.folio.linked.data.service.resource.marc.AssignAuthorityTarget.SUBJECT_OF_WORK;
@@ -92,17 +91,6 @@ void validateAuthorityAssignment_shouldReturnFalse_ifAuthorityIsEmpty() {
9291
assertThat(result.getInvalidAssignmentReason()).isEqualTo(UNSUPPORTED_MARC);
9392
}
9493

95-
@ParameterizedTest
96-
@MethodSource("noLccnMarcRecords")
97-
void validateAuthorityAssignment_shouldReturnFalse_ifNoLccn(String marc) {
98-
// when
99-
var result = resourceMarcAuthorityService.validateAuthorityAssignment(marc, CREATOR_OF_WORK);
100-
101-
// then
102-
assertThat(result.getValidAssignment()).isFalse();
103-
assertThat(result.getInvalidAssignmentReason()).isEqualTo(NO_LCCN);
104-
}
105-
10694
private static Stream<Arguments> authorityAssignmentArguments_validTargets() {
10795
return Stream.of(
10896
Arguments.of(Set.of(PERSON), CREATOR_OF_WORK),
@@ -118,24 +106,4 @@ private static Stream<Arguments> authorityAssignmentArguments_invalidTargets() {
118106
Arguments.of(Set.of(CONCEPT, FORM, PERSON), SUBJECT_OF_WORK)
119107
);
120108
}
121-
122-
private static Stream<Arguments> noLccnMarcRecords() {
123-
return Stream.of(
124-
Arguments.of("""
125-
{
126-
"fields":[
127-
{ "100":{ "subfields":[ { "a":"Person with no LCCN" } ] } }
128-
]
129-
}
130-
"""),
131-
Arguments.of("""
132-
{
133-
"fields":[
134-
{ "010":{ "subfields":[ { "z":"no2023016747" } ] } },
135-
{ "100":{ "subfields":[ { "a":"Person with cancelled LCCN" } ] } }
136-
]
137-
}
138-
""")
139-
);
140-
}
141109
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
{
2+
"fields" : [ {
3+
"001":"fst1234567890"
4+
}, {
5+
"100" : {
6+
"subfields" : [ {
7+
"a" : "aValue"
8+
}, {
9+
"b" : "bValue"
10+
}, {
11+
"c" : "cValue1"
12+
}, {
13+
"c" : "cValue2"
14+
}, {
15+
"d" : "dValue"
16+
}, {
17+
"j" : "jValue1"
18+
}, {
19+
"j" : "jValue2"
20+
}, {
21+
"q" : "qValue"
22+
} ],
23+
"ind1" : " ",
24+
"ind2" : " "
25+
}
26+
} ]
27+
}

0 commit comments

Comments
 (0)