From 970fe1c971a3cbf632a854c96b6ac97e643fcf53 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Kalle=20W=C3=A5hlin?=
 <72360110+kwahlin@users.noreply.github.com>
Date: Thu, 17 Oct 2024 17:09:51 +0200
Subject: [PATCH] Support changes in Record (#1499)

---
 .../groovy/whelk/rest/api/BulkChangePreviewAPI.java | 13 ++++++++++---
 whelk-core/src/main/groovy/whelk/Document.groovy    |  2 ++
 .../src/main/groovy/whelk/datatool/WhelkTool.groovy |  7 ++++++-
 3 files changed, 18 insertions(+), 4 deletions(-)

diff --git a/rest/src/main/groovy/whelk/rest/api/BulkChangePreviewAPI.java b/rest/src/main/groovy/whelk/rest/api/BulkChangePreviewAPI.java
index 11204e1460..398043a6fd 100644
--- a/rest/src/main/groovy/whelk/rest/api/BulkChangePreviewAPI.java
+++ b/rest/src/main/groovy/whelk/rest/api/BulkChangePreviewAPI.java
@@ -16,10 +16,13 @@
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import java.io.IOException;
+import java.util.HashMap;
 import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
 
+import static whelk.JsonLd.ID_KEY;
+import static whelk.JsonLd.RECORD_KEY;
 import static whelk.util.Unicode.stripPrefix;
 
 public class BulkChangePreviewAPI extends HttpServlet {
@@ -118,7 +121,12 @@ private static Map<String, String> makeLink(String id, int offset, int limit) {
     // FIXME mangle the data in a more ergonomic way
     @SuppressWarnings("unchecked")
     private Map<?,?> makePreviewChangeSet(Document doc, Transform transform) {
-        var modified = new ModifiedThing(doc.getThing(), transform, whelk.getJsonld().repeatableTerms);
+        var thing = new LinkedHashMap<String, Object>(doc.getThing());
+        var record = new LinkedHashMap<String, Object>(doc.getRecord());
+        // Remove @id from record to prevent from being shown as a link in the diff view
+        record.remove(ID_KEY);
+        thing.put(RECORD_KEY, record);
+        var modified = new ModifiedThing(thing, transform, whelk.getJsonld().repeatableTerms);
         var beforeDoc = doc.clone();
         var afterDoc = doc.clone();
         ((List<Map<?,?>>) beforeDoc.data.get(JsonLd.GRAPH_KEY)).set(1, modified.getBefore());
@@ -127,9 +135,8 @@ private Map<?,?> makePreviewChangeSet(Document doc, Transform transform) {
                 new DocumentVersion(beforeDoc, "", ""),
                 new DocumentVersion(afterDoc, "", "")
         ), whelk.getJsonld());
-
         var result = history.m_changeSetsMap;
-        result.put(JsonLd.ID_KEY, beforeDoc.getCompleteId());
+        result.put(ID_KEY, beforeDoc.getCompleteId());
         ((Map<String,Object>) DocumentUtil.getAtPath(result, List.of("changeSets", 0))).put("version", modified.getBefore());
         ((Map<String,Object>) DocumentUtil.getAtPath(result, List.of("changeSets", 1))).put("version", modified.getAfter());
 
diff --git a/whelk-core/src/main/groovy/whelk/Document.groovy b/whelk-core/src/main/groovy/whelk/Document.groovy
index 26a4fd39b0..4baada9b31 100644
--- a/whelk-core/src/main/groovy/whelk/Document.groovy
+++ b/whelk-core/src/main/groovy/whelk/Document.groovy
@@ -193,6 +193,8 @@ class Document {
 
     Map getThing() { get(thingPath) as Map }
 
+    Map getRecord() { get(recordPath) as Map }
+
     void setDescriptionCreator(creator) { set(descriptionCreatorPath, creator) }
 
     String getDescriptionCreator() { get(descriptionCreatorPath) }
diff --git a/whelktool/src/main/groovy/whelk/datatool/WhelkTool.groovy b/whelktool/src/main/groovy/whelk/datatool/WhelkTool.groovy
index ebc2e5410d..e21524f625 100644
--- a/whelktool/src/main/groovy/whelk/datatool/WhelkTool.groovy
+++ b/whelktool/src/main/groovy/whelk/datatool/WhelkTool.groovy
@@ -37,6 +37,7 @@ import java.util.concurrent.TimeUnit
 import java.util.concurrent.atomic.AtomicInteger
 
 import static java.util.concurrent.TimeUnit.SECONDS
+import static whelk.JsonLd.RECORD_KEY
 import static whelk.util.Jackson.mapper
 
 class WhelkTool {
@@ -924,12 +925,16 @@ class DocumentItem {
     }
     
     boolean modify(Map matchForm, Map targetForm) {
+        Map thing = (Map) this.graph[1]
+        thing[RECORD_KEY] = (Map) this.graph[0]
+
         var m = new ModifiedThing(
-                (Map) this.graph[1],
+                thing,
                 new Transform(matchForm, targetForm),
                 whelk.jsonld.repeatableTerms)
 
         this.graph[1] = m.after
+        this.graph[0] = m.after.remove(RECORD_KEY)
 
         return m.isModified()
     }