diff --git a/lib/model/query/submissions.js b/lib/model/query/submissions.js index 79c0909f5..ce11504a3 100644 --- a/lib/model/query/submissions.js +++ b/lib/model/query/submissions.js @@ -192,9 +192,91 @@ const getByIds = (projectId, xmlFormId, instanceId, draft, options = QueryOption _get(maybeOne, options.withCondition({ 'submissions.instanceId': instanceId }), projectId, xmlFormId, draft) .then(x => x.map(assignCurrentVersionSubmitter)); -const getAllForFormByIds = (projectId, xmlFormId, draft, options = QueryOptions.none) => ({ all }) => - _get(all, options, projectId, xmlFormId, draft) - .then(map(assignCurrentVersionSubmitter)); +const getAllForFormByIds = (projectId, xmlFormId, draft, options) => async ({ all }) => { + let newRes; + if (options.extended) { + const maybeExtendedUnjoiner = unjoiner(Submission, Submission.Def.into('currentVersion'), Actor.into('submitter'), Actor.alias('current_version_actors', 'currentVersionSubmitter')); + + newRes = await all(sql` + SELECT "submissions"."instanceId" AS "submissions!instanceId" + , "submissions"."submitterId" AS "submissions!submitterId" + , "submissions"."deviceId" AS "submissions!deviceId" + , "submissions"."createdAt" AS "submissions!createdAt" + , "submissions"."updatedAt" AS "submissions!updatedAt" + , "submissions"."reviewState" AS "submissions!reviewState" + , "submissions"."userAgent" AS "submissions!userAgent" + , "submissions"."draft" AS "submissions!draft" + , NULL AS "submissions!deletedAt" + , "submission_defs"."formDefId" AS "submission_defs!formDefId" + , "submission_defs"."submitterId" AS "submission_defs!submitterId" + , "submission_defs"."createdAt" AS "submission_defs!createdAt" + , "submission_defs"."instanceName" AS "submission_defs!instanceName" + , "submission_defs"."instanceId" AS "submission_defs!instanceId" + , TRUE AS "submission_defs!current" + , "submission_defs"."deviceId" AS "submission_defs!deviceId" + , "submission_defs"."userAgent" AS "submission_defs!userAgent" + , "actors"."id" AS "actors!id" + , "actors"."type" AS "actors!type" + , "actors"."displayName" AS "actors!displayName" + , "actors"."createdAt" AS "actors!createdAt" + , "actors"."updatedAt" AS "actors!updatedAt" + , "current_version_actors"."id" AS "current_version_actors!id" + , "current_version_actors"."type" AS "current_version_actors!type" + , "current_version_actors"."displayName" AS "current_version_actors!displayName" + , "current_version_actors"."createdAt" AS "current_version_actors!createdAt" + , "current_version_actors"."updatedAt" AS "current_version_actors!updatedAt" + FROM ( + SELECT submissions.*, submission_defs."userAgent" + FROM submissions + JOIN submission_defs ON submissions.id = submission_defs."submissionId" AND root + ) AS submissions + JOIN submission_defs ON submissions.id = submission_defs."submissionId" AND submission_defs.current + JOIN forms ON forms."projectId"=${projectId} AND forms."xmlFormId"=${xmlFormId} AND forms.id=submissions."formId" + LEFT OUTER JOIN actors on actors.id=submissions."submitterId" + LEFT OUTER JOIN actors current_version_actors on current_version_actors.id=submission_defs."submitterId" + WHERE draft=${draft} + AND submissions."deletedAt" IS NULL + ORDER BY submissions."createdAt" DESC + , submissions.id DESC + `) + .then(map(maybeExtendedUnjoiner)) + .then(map(assignCurrentVersionSubmitter)); + } else { + const maybeExtendedUnjoiner = unjoiner(Submission, Submission.Def.into('currentVersion')); + + newRes = await all(sql` + SELECT "submissions"."instanceId" AS "submissions!instanceId" + , "submissions"."submitterId" AS "submissions!submitterId" + , "submissions"."deviceId" AS "submissions!deviceId" + , "submissions"."createdAt" AS "submissions!createdAt" + , "submissions"."updatedAt" AS "submissions!updatedAt" + , "submissions"."reviewState" AS "submissions!reviewState" + , "submissions"."userAgent" AS "submissions!userAgent" + , NULL AS "submissions!deletedAt" + , "submission_defs"."submitterId" AS "submission_defs!submitterId" + , "submission_defs"."createdAt" AS "submission_defs!createdAt" + , "submission_defs"."instanceName" AS "submission_defs!instanceName" + , "submission_defs"."instanceId" AS "submission_defs!instanceId" + , TRUE AS "submission_defs!current" + , "submission_defs"."deviceId" AS "submission_defs!deviceId" + , "submission_defs"."userAgent" AS "submission_defs!userAgent" + FROM ( + SELECT submissions.*, submission_defs."userAgent" + FROM submissions + JOIN submission_defs ON submissions.id = submission_defs."submissionId" AND root + ) AS submissions + JOIN submission_defs ON submissions.id = submission_defs."submissionId" AND submission_defs.current + JOIN forms ON forms."projectId"=${projectId} AND forms."xmlFormId"=${xmlFormId} AND forms.id=submissions."formId" + WHERE draft=${draft} + AND submissions."deletedAt" IS NULL + ORDER BY submissions."createdAt" DESC + , submissions.id DESC + `) + .then(map(maybeExtendedUnjoiner)); + } + + return newRes; +}; const getById = (submissionId) => ({ maybeOne }) => maybeOne(sql`select * from submissions where id=${submissionId} and "deletedAt" is null`) @@ -408,8 +490,61 @@ const streamForExport = (formId, draft, keyIds, options = QueryOptions.none) => .then(dbStream => streamEncBlobs(s3, dbStream)) .then(stream.map(_exportUnjoiner)); -const getForExport = (formId, instanceId, draft, options = QueryOptions.none) => ({ maybeOne }) => - maybeOne(_export(formId, draft, [], options.withCondition({ 'submissions.instanceId': instanceId }))) +const getForExport = (formId, instanceId, draft) => ({ maybeOne }) => + maybeOne( + sql` + SELECT "submissions"."id" AS "submissions!id" + , "submissions"."instanceId" AS "submissions!instanceId" + , "submissions"."deviceId" AS "submissions!deviceId" + , "submissions"."createdAt" AS "submissions!createdAt" + , "submissions"."updatedAt" AS "submissions!updatedAt" + , "submissions"."reviewState" AS "submissions!reviewState" + , "submissions"."deletedAt" AS "submissions!deletedAt" + , "submission_defs"."localKey" AS "submission_defs!localKey" + , "submission_defs"."xml" AS "submission_defs!xml" + , "actors"."id" AS "actors!id" + , "actors"."displayName" AS "actors!displayName" + , "attachments"."present" > 0 AS "encHasData" + , "attachments"."present" AS "attachments!present" + , "attachments"."expected" AS "attachments!expected" + , "edits"."count" AS "edits!count" + , "fds"."formVersion" AS "formVersion" + FROM submission_defs + INNER JOIN ( + SELECT * + FROM submissions + WHERE draft=${draft} + ) AS submissions ON submissions.id=submission_defs."submissionId" + LEFT OUTER JOIN actors ON submissions."submitterId"=actors.id + LEFT OUTER JOIN ( + SELECT "submissionDefId" + , COUNT("blobId") AS present + , COUNT(*) AS expected + FROM submission_attachments + GROUP BY "submissionDefId" + ) AS attachments ON attachments."submissionDefId"=submission_defs.id + INNER JOIN ( + SELECT "formDefId" + , "submissionId" + FROM submission_defs + WHERE root IS TRUE + ) AS roots ON roots."submissionId"=submission_defs."submissionId" + INNER JOIN ( + SELECT id, version AS "formVersion" + FROM form_defs + ) AS fds ON fds.id=roots."formDefId" + INNER JOIN ( + SELECT "submissionId", (COUNT(id) - 1) AS COUNT + FROM submission_defs + GROUP BY "submissionId" + ) AS edits ON edits."submissionId"=submission_defs."submissionId" + WHERE submissions."instanceId" = ${instanceId} + AND submission_defs.current IS TRUE + AND submissions."formId" = ${formId} + AND submissions."deletedAt" IS NULL + ` + ) + //maybeOne(_export(formId, draft, [], options.withCondition({ 'submissions.instanceId': instanceId }))) .then(map(_exportUnjoiner)); ////////////////////////////////////////////////////////////////////////////////