Skip to content

Commit 7c7bdfe

Browse files
ryanjdewMarkLogic Builder
authored andcommitted
DHFPROD-7956: Clear model info from HC config when deletes are published
1 parent ee8a8c1 commit 7c7bdfe

File tree

5 files changed

+121
-7
lines changed

5 files changed

+121
-7
lines changed

marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/5/impl/entity-lib.sjs

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -237,6 +237,26 @@ function deleteDraftModel(entityName) {
237237
writeDraftModel(entityName, model)
238238
}
239239

240+
function cleanupModelsFromHubCentralConfig(retainEntityNames) {
241+
const hubCentralConfigURI = "/config/hubCentral.json";
242+
const hubCentralConfig = fn.head(hubUtils.invokeFunction(() => cts.doc(hubCentralConfigURI), config.FINALDATABASE));
243+
if (hubCentralConfig) {
244+
const hubCentralConfigObj = hubCentralConfig.toObject();
245+
if (hubCentralConfigObj.modeling && hubCentralConfigObj.modeling.entities) {
246+
let changesMade = false;
247+
for (let entityName of Object.keys(hubCentralConfigObj.modeling.entities)) {
248+
if (!retainEntityNames.includes(entityName)) {
249+
changesMade = true;
250+
delete hubCentralConfigObj.modeling.entities[entityName];
251+
}
252+
}
253+
if (changesMade) {
254+
hubUtils.writeDocument(hubCentralConfigURI, hubCentralConfigObj, xdmp.nodePermissions(hubCentralConfig), xdmp.nodeCollections(hubCentralConfig), config.FINALDATABASE);
255+
}
256+
}
257+
}
258+
}
259+
240260
function deleteModel(entityName) {
241261
const uri = getModelUri(entityName);
242262
[...new Set([config.STAGINGDATABASE, config.FINALDATABASE])].forEach(db => {
@@ -448,6 +468,12 @@ function writeModelToDatabases(entityName, model, databases, isDraft = false) {
448468
});
449469
}
450470

471+
function getEntityNames() {
472+
return hubUtils.invokeFunction(() => cts.search(cts.collectionQuery(consts.ENTITY_MODEL_COLLECTION)), config.FINALDATABASE)
473+
.toArray()
474+
.map(entityNode => entityNode.toObject().info.title);
475+
}
476+
451477
function publishDraftModels() {
452478
hubUtils.hubTrace(consts.TRACE_ENTITY,`publishing in database: ${xdmp.databaseName(xdmp.database())}`);
453479
const draftModels = hubUtils.invokeFunction(() => cts.search(cts.collectionQuery(consts.DRAFT_ENTITY_MODEL_COLLECTION)), xdmp.databaseName(xdmp.database()));
@@ -505,6 +531,7 @@ function publishDraftModels() {
505531
xdmp.invokeFunction(deleteDraftsOperation, {database, update: "true", commit: "auto"});
506532
}
507533
});
534+
cleanupModelsFromHubCentralConfig(getEntityNames());
508535
}
509536

510537
function getModelPermissions() {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
declareUpdate();
2+
3+
const config = require("/com.marklogic.hub/config.sjs");
4+
const entityLib = require("/data-hub/5/impl/entity-lib.sjs");
5+
const hubUtils = require("/data-hub/5/impl/hub-utils.sjs");
6+
const test = require("/test/test-helper.xqy");
7+
8+
const hubCentralConfig = {
9+
"modeling": {
10+
"entities": {
11+
"Customer": { x: 10, y: 15 },
12+
"Test": { x: 10, y: 15 }
13+
}
14+
}
15+
};
16+
17+
const model = {
18+
"info": {
19+
"title": "Customer",
20+
"version": "0.0.1",
21+
"baseUri": "http://example.org/"
22+
},
23+
"definitions": {
24+
"Customer": {
25+
"properties": {
26+
"customerId": {"datatype": "integer"},
27+
"age": {"datatype": "integer"}
28+
}
29+
}
30+
}
31+
};
32+
33+
const modelUri = "Customer";
34+
35+
const assertions = [];
36+
37+
xdmp.invokeFunction(function() {
38+
declareUpdate();
39+
entityLib.writeDraftModel(modelUri, model);
40+
hubUtils.writeDocument("/config/hubCentral.json", hubCentralConfig, [xdmp.permission("data-hub-common", "read"),xdmp.permission("data-hub-common-writer", "update")], [], config.FINALDATABASE);
41+
});
42+
43+
xdmp.invokeFunction(function() {
44+
const hubCentralConfig = cts.doc("/config/hubCentral.json")
45+
const draftModel = entityLib.findDraftModelByEntityName(modelUri)
46+
assertions.push(test.assertTrue(fn.exists(hubCentralConfig.xpath("/modeling/entities/Customer"))))
47+
assertions.push(test.assertEqual(draftModel.info.title, modelUri))
48+
assertions.push(test.assertTrue(draftModel.info.isDraft))
49+
assertions.push(test.assertFalse(draftModel.info.isDraftDeleted))
50+
assertions.push(test.assertEqual("integer", draftModel.definitions[modelUri].properties["age"].datatype))
51+
});
52+
53+
xdmp.invokeFunction(function() {
54+
declareUpdate();
55+
entityLib.deleteDraftModel(modelUri)
56+
57+
const deletedModel = entityLib.findDraftModelByEntityName(modelUri)
58+
assertions.push(test.assertEqual(deletedModel.info.title, modelUri))
59+
assertions.push(test.assertTrue(deletedModel.info.isDraft))
60+
assertions.push(test.assertTrue(deletedModel.info.isDraftDeleted))
61+
});
62+
63+
xdmp.invokeFunction(function() {
64+
declareUpdate();
65+
entityLib.publishDraftModels()
66+
});
67+
68+
xdmp.invokeFunction(function() {
69+
const hubCentralConfig = cts.doc("/config/hubCentral.json")
70+
assertions.push(test.assertTrue(fn.empty(hubCentralConfig.xpath("/modeling/entities/Customer"))))
71+
assertions.push(test.assertTrue(fn.exists(hubCentralConfig.xpath("/modeling/entities/Test"))))
72+
});
73+
74+
assertions;

marklogic-data-hub/src/test/ml-modules/root/test/suites/data-hub/5/data-services/models/drafts/setup.sjs

Lines changed: 0 additions & 7 deletions
This file was deleted.
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
xquery version "1.0-ml";
2+
import module namespace hub-test = "http://marklogic.com/data-hub/test" at "/test/data-hub-test-helper.xqy";
3+
hub-test:reset-hub();
4+
5+
xquery version "1.0-ml";
6+
import module namespace hub-test = "http://marklogic.com/data-hub/test" at "/test/data-hub-test-helper.xqy";
7+
import module namespace test = "http://marklogic.com/test" at "/test/test-helper.xqy";
8+
hub-test:load-artifacts($test:__CALLER_FILE__)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
{
2+
"info": {
3+
"title": "Test",
4+
"version": "0.0.1",
5+
"baseUri": "http://example.org/"
6+
},
7+
"definitions": {
8+
"Test": {
9+
"properties": {}
10+
}
11+
}
12+
}

0 commit comments

Comments
 (0)