From 19def70d1a6bd2403448f16ba89677f262153641 Mon Sep 17 00:00:00 2001 From: Kathleen Tuite Date: Wed, 18 Sep 2024 13:31:22 -0700 Subject: [PATCH] purge task transaction --- lib/task/purge.js | 42 +++++++++++++++++++++++------------------- 1 file changed, 23 insertions(+), 19 deletions(-) diff --git a/lib/task/purge.js b/lib/task/purge.js index af892f83f..e83ba52ce 100644 --- a/lib/task/purge.js +++ b/lib/task/purge.js @@ -9,27 +9,31 @@ const { task } = require('./task'); -const purgeTask = task.withContainer((container) => (options = {}) => container.transacting(async ({ Blobs, Forms, Submissions }) => { - let message; - - try { - if (options.mode === 'submissions' || options.instanceId) { - const count = await Submissions.purge(options.force, options.projectId, options.xmlFormId, options.instanceId); - message = `Submissions purged: ${count}`; - } else if (options.mode === 'forms' || (options.formId || options.xmlFormId)) { - const count = await Forms.purge(options.force, options.formId, options.projectId, options.xmlFormId); - message = `Forms purged: ${count}`; - } else { - const formCount = await Forms.purge(options.force, options.formId, options.projectId, options.xmlFormId); - const submissionCount = await Submissions.purge(options.force, options.projectId, options.xmlFormId, options.instanceId); - message = `Forms purged: ${formCount}, Submissions purged: ${submissionCount}`; +const purgeTask = task.withContainer((container) => async (options = {}) => { + // Form/submission purging will happen within its own transaction + const message = await container.db.transaction(async trxn => { + const { Forms, Submissions } = container.with({ db: trxn }); + try { + if (options.mode === 'submissions' || options.instanceId) { + const count = await Submissions.purge(options.force, options.projectId, options.xmlFormId, options.instanceId); + return `Submissions purged: ${count}`; + } else if (options.mode === 'forms' || (options.formId || options.xmlFormId)) { + const count = await Forms.purge(options.force, options.formId, options.projectId, options.xmlFormId); + return `Forms purged: ${count}`; + } else { + const formCount = await Forms.purge(options.force, options.formId, options.projectId, options.xmlFormId); + const submissionCount = await Submissions.purge(options.force, options.projectId, options.xmlFormId, options.instanceId); + return `Forms purged: ${formCount}, Submissions purged: ${submissionCount}`; + } + } catch (error) { + return error?.problemDetails?.error; } - } catch (error) { - return error.problemDetails.error; - } + }); - await Blobs.purgeUnattached(); + // Purging unattached blobs is outside of the above transaction because it + // may interact with an external blob store. + await container.Blobs.purgeUnattached(); return message; -})); +}); module.exports = { purgeTask };