From a951bc6316e3f627745fa82ce3b7903a4e10a179 Mon Sep 17 00:00:00 2001 From: alxndrsn Date: Mon, 8 Sep 2025 11:25:44 +0000 Subject: [PATCH] forms: restructure createNew() SQL --- lib/model/query/forms.js | 32 ++++++++++++++++++-------------- 1 file changed, 18 insertions(+), 14 deletions(-) diff --git a/lib/model/query/forms.js b/lib/model/query/forms.js index 683d2b7cb..3f2a55fb5 100644 --- a/lib/model/query/forms.js +++ b/lib/model/query/forms.js @@ -105,20 +105,24 @@ const _insertFormFields = (fields, formId, schemaId) => async ({ run }) => { const _createNew = (form, def, project) => ({ oneFirst, Forms }) => oneFirst(sql` -with sch as - (insert into form_schemas (id) - values (default) - returning *), -def as - (insert into form_defs ("formId", "schemaId", xml, name, hash, sha, sha256, version, "keyId", "xlsBlobId", "draftToken", "enketoId", "createdAt") - select nextval(pg_get_serial_sequence('forms', 'id')), sch.id, ${form.xml}, ${def.name}, ${def.hash}, ${def.sha}, ${def.sha256}, ${def.version}, ${def.keyId}, ${form.xls.xlsBlobId || null}, ${def.draftToken || null}, ${def.enketoId || null}, clock_timestamp() - from sch - returning *), -form as - (insert into forms (id, "xmlFormId", state, "projectId", "draftDefId", "acteeId", "enketoId", "enketoOnceId", "createdAt", "webformsEnabled") - select def."formId", ${form.xmlFormId}, ${form.state || 'open'}, ${project.id}, def.id, ${form.acteeId}, ${form.enketoId || null}, ${form.enketoOnceId || null}, def."createdAt", ${form.webformsEnabled || false} from def - returning forms.*) -select id from form`) + WITH + shared AS ( + SELECT nextval(pg_get_serial_sequence('forms', 'id')) AS form_id + , nextval(pg_get_serial_sequence('form_defs', 'id')) AS form_def_id + , clock_timestamp() AS created_at + ), + sch AS (INSERT INTO form_schemas DEFAULT VALUES RETURNING id), + def AS ( + INSERT INTO form_defs (id, "formId", "schemaId", xml, name, hash, sha, sha256, version, "keyId", "xlsBlobId", "draftToken", "enketoId", "createdAt") + SELECT form_def_id, form_id, sch.id, ${form.xml}, ${def.name}, ${def.hash}, ${def.sha}, ${def.sha256}, ${def.version}, ${def.keyId}, ${form.xls.xlsBlobId || null}, ${def.draftToken || null}, ${def.enketoId || null}, created_at + FROM shared, sch + RETURNING * + ) + INSERT INTO forms (id, "xmlFormId", state, "projectId", "draftDefId", "acteeId", "enketoId", "enketoOnceId", "createdAt", "webformsEnabled") + SELECT form_id, ${form.xmlFormId}, ${form.state || 'open'}, ${project.id}, form_def_id, ${form.acteeId}, ${form.enketoId || null}, ${form.enketoOnceId || null}, created_at, ${form.webformsEnabled || false} + FROM shared + RETURNING id + `) .then(() => Forms.getByProjectAndXmlFormId(project.id, form.xmlFormId, Form.DraftVersion)) .then((option) => option.get());