From c765fd39dc73354ae9d9d0885fc3699ad2cd8e8b Mon Sep 17 00:00:00 2001 From: Matthew Ezra Labre Date: Wed, 28 Jan 2026 21:05:01 +0800 Subject: [PATCH 1/2] add field hard deletion and update test for field deletion --- src/services/instance/fields/fields.test.js | 11 +++++++--- src/services/instance/fields/index.js | 23 ++++++++++++++++++++- 2 files changed, 30 insertions(+), 4 deletions(-) diff --git a/src/services/instance/fields/fields.test.js b/src/services/instance/fields/fields.test.js index d6691ae..09a2a6c 100644 --- a/src/services/instance/fields/fields.test.js +++ b/src/services/instance/fields/fields.test.js @@ -73,8 +73,8 @@ test.serial("patchField:200", async(t) => { t.truthy(res.data.ZUID); }); -// Field deletion is only a soft-delete so need to skip this test to stop overpopulating the database by adding more columns without actually deleting them -test.skip("deleteField:200", async(t) => { +// Field deletion is only a soft-delete so need to also run field hard deletion to stop overpopulating the database by adding more columns without actually deleting them +test("deleteField:200", async(t) => { const name = `node-sdk_createItem_${moment().valueOf()}`; let res = await t.context.sdk.instance.createField( process.env.TEST_MODEL_ZUID, @@ -87,15 +87,20 @@ test.skip("deleteField:200", async(t) => { } } ) + t.is(res.statusCode, 201); t.truthy(res.data.ZUID); - const newFieldZUID = res.data.ZUID; res = await t.context.sdk.instance.deleteModelField( process.env.TEST_MODEL_ZUID, newFieldZUID ); + t.is(res.statusCode, 200); + res = await t.context.sdk.instance.hardDeleteModelField( + process.env.TEST_MODEL_ZUID, + newFieldZUID + ); t.is(res.statusCode, 200); }); \ No newline at end of file diff --git a/src/services/instance/fields/index.js b/src/services/instance/fields/index.js index 2328c35..554f94c 100644 --- a/src/services/instance/fields/index.js +++ b/src/services/instance/fields/index.js @@ -7,7 +7,8 @@ module.exports = { createFieldPath: "/content/models/MODEL_ZUID/fields", updateModelField: "/content/models/MODEL_ZUID/fields/FIELD_ZUID", patchModelField: "/content/models/MODEL_ZUID/fields/FIELD_ZUID", - deleteModelField: "/content/models/MODEL_ZUID/fields/FIELD_ZUID" + deleteModelField: "/content/models/MODEL_ZUID/fields/FIELD_ZUID", + hardDeleteModelField: "/content/models/MODEL_ZUID/fields/FIELD_ZUID?hardDelete=true" }, mixin: superclass => class Field extends superclass { @@ -136,5 +137,25 @@ module.exports = { }) ); } + + async hardDeleteModelField(modelZUID, fieldZUID) { + if (!modelZUID) { + throw new Error( + "SDK:Instance:deleteModelField() missing required `modelZUID` argument" + ); + } + if (!fieldZUID) { + throw new Error( + "SDK:Instance:deleteModelField() missing required `fieldZUID` argument" + ); + } + + return await this.deleteRequest( + this.interpolate(this.API.hardDeleteModelField, { + MODEL_ZUID: modelZUID, + FIELD_ZUID: fieldZUID + }) + ); + } } }; From 1c6fdfd00729fecc9e32480ef51252512b68fcff Mon Sep 17 00:00:00 2001 From: Matthew Ezra Labre Date: Wed, 28 Jan 2026 21:23:44 +0800 Subject: [PATCH 2/2] merge soft and hard deletion logic --- src/services/instance/fields/fields.test.js | 20 +++++++------- src/services/instance/fields/index.js | 30 ++++----------------- 2 files changed, 16 insertions(+), 34 deletions(-) diff --git a/src/services/instance/fields/fields.test.js b/src/services/instance/fields/fields.test.js index 09a2a6c..b3367f1 100644 --- a/src/services/instance/fields/fields.test.js +++ b/src/services/instance/fields/fields.test.js @@ -76,7 +76,7 @@ test.serial("patchField:200", async(t) => { // Field deletion is only a soft-delete so need to also run field hard deletion to stop overpopulating the database by adding more columns without actually deleting them test("deleteField:200", async(t) => { const name = `node-sdk_createItem_${moment().valueOf()}`; - let res = await t.context.sdk.instance.createField( + const createRes = await t.context.sdk.instance.createField( process.env.TEST_MODEL_ZUID, { datatype : "text", @@ -88,19 +88,21 @@ test("deleteField:200", async(t) => { } ) - t.is(res.statusCode, 201); - t.truthy(res.data.ZUID); - const newFieldZUID = res.data.ZUID; + t.is(createRes.statusCode, 201); + t.truthy(createRes.data.ZUID); + const newFieldZUID = createRes.data.ZUID; - res = await t.context.sdk.instance.deleteModelField( + const deleteRes = await t.context.sdk.instance.deleteModelField( process.env.TEST_MODEL_ZUID, newFieldZUID ); - t.is(res.statusCode, 200); + t.is(deleteRes.statusCode, 200); - res = await t.context.sdk.instance.hardDeleteModelField( + // hard delete + const hardDeleteRes = await t.context.sdk.instance.deleteModelField( process.env.TEST_MODEL_ZUID, - newFieldZUID + newFieldZUID, + true ); - t.is(res.statusCode, 200); + t.is(hardDeleteRes.statusCode, 200); }); \ No newline at end of file diff --git a/src/services/instance/fields/index.js b/src/services/instance/fields/index.js index 554f94c..41c09fa 100644 --- a/src/services/instance/fields/index.js +++ b/src/services/instance/fields/index.js @@ -7,8 +7,7 @@ module.exports = { createFieldPath: "/content/models/MODEL_ZUID/fields", updateModelField: "/content/models/MODEL_ZUID/fields/FIELD_ZUID", patchModelField: "/content/models/MODEL_ZUID/fields/FIELD_ZUID", - deleteModelField: "/content/models/MODEL_ZUID/fields/FIELD_ZUID", - hardDeleteModelField: "/content/models/MODEL_ZUID/fields/FIELD_ZUID?hardDelete=true" + deleteModelField: "/content/models/MODEL_ZUID/fields/FIELD_ZUID?hardDelete=HARD_DELETE" }, mixin: superclass => class Field extends superclass { @@ -118,7 +117,7 @@ module.exports = { ); } - async deleteModelField(modelZUID, fieldZUID) { + async deleteModelField(modelZUID, fieldZUID, hardDelete = "false") { if (!modelZUID) { throw new Error( "SDK:Instance:deleteModelField() missing required `modelZUID` argument" @@ -129,31 +128,12 @@ module.exports = { "SDK:Instance:deleteModelField() missing required `fieldZUID` argument" ); } - + return await this.deleteRequest( this.interpolate(this.API.deleteModelField, { MODEL_ZUID: modelZUID, - FIELD_ZUID: fieldZUID - }) - ); - } - - async hardDeleteModelField(modelZUID, fieldZUID) { - if (!modelZUID) { - throw new Error( - "SDK:Instance:deleteModelField() missing required `modelZUID` argument" - ); - } - if (!fieldZUID) { - throw new Error( - "SDK:Instance:deleteModelField() missing required `fieldZUID` argument" - ); - } - - return await this.deleteRequest( - this.interpolate(this.API.hardDeleteModelField, { - MODEL_ZUID: modelZUID, - FIELD_ZUID: fieldZUID + FIELD_ZUID: fieldZUID, + HARD_DELETE: hardDelete }) ); }