Merge pull request #10972 from DSpace/backport-10961-to-dspace-9_x

[Port dspace-9_x] Fix patching metadata on unknown field clears all DSO metadata
This commit is contained in:
Tim Donohue
2025-06-27 13:02:18 -05:00
committed by GitHub
2 changed files with 34 additions and 2 deletions

View File

@@ -14,6 +14,7 @@ import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.apache.commons.lang3.StringUtils;
import org.dspace.app.rest.exception.DSpaceBadRequestException;
import org.dspace.app.rest.exception.UnprocessableEntityException;
import org.dspace.app.rest.model.MetadataValueRest;
import org.dspace.app.rest.model.patch.JsonValueEvaluator;
import org.dspace.app.rest.model.patch.Operation;
@@ -136,10 +137,20 @@ public final class DSpaceObjectMetadataPatchUtils {
* @param context Context the retrieve metadataField from service with string
* @param operation Operation of the patch
* @return The metadataField corresponding to the md element string of the operation
* Null if no metadata field is passed in the operation
* @throws UnprocessableEntityException if an invalid metadata field is passed in the operation
*/
protected MetadataField getMetadataField(Context context, Operation operation) throws SQLException {
protected MetadataField getMetadataField(Context context, Operation operation)
throws SQLException, UnprocessableEntityException {
String mdElement = this.extractMdFieldStringFromOperation(operation);
return metadataFieldService.findByString(context, mdElement, '.');
if (StringUtils.isBlank(mdElement)) {
return null;
}
MetadataField metadataField = metadataFieldService.findByString(context, mdElement, '.');
if (metadataField == null) {
throw new UnprocessableEntityException("Metadata field does not exist");
}
return metadataField;
}
/**

View File

@@ -1426,6 +1426,27 @@ public class PatchMetadataIT extends AbstractEntityIntegrationTest {
moveMetadataAuthorTest(moves, expectedOrder);
}
@Test
public void replaceInvalidMetadataShouldFailTest() throws Exception {
initSimplePublicationItem();
assertEquals(11, publicationItem.getMetadata().size());
String patchBody = getPatchContent(List.of(
new ReplaceOperation("/metadata/dc.contributor.invalid/0", "some value")
));
String token = getAuthToken(admin.getEmail(), password);
getClient(token).perform(patch("/api/core/items/" + publicationItem.getID())
.content(patchBody)
.contentType(MediaType.APPLICATION_JSON))
.andExpect(status().isUnprocessableEntity());
publicationItem = context.reloadEntity(publicationItem);
assertEquals(11, publicationItem.getMetadata().size());
assertEquals(0,
itemService.getMetadata(publicationItem, "dc", "contributor", "invalid", Item.ANY, false).size());
}
/**
* This method moves an author (dc.contributor.author) within a workspace publication's "traditionalpageone"
* section from position "from" to "path" using a PATCH request and verifies the order of the authors within the