Skip to content

Commit 2386d7b

Browse files
sadiqkhojaspwoodcock
authored andcommitted
Fixes getodk/central#930: multiple published forms (getodk#1462)
* wrongly assumed that only one form_def will have publishedAt, changed the condition in the query to use currentDefId instead. * Also added condition to check enketoOnceId to fetch the Form.
1 parent 7eea5eb commit 2386d7b

File tree

2 files changed

+49
-1
lines changed

2 files changed

+49
-1
lines changed

lib/model/query/forms.js

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -574,7 +574,15 @@ order by coalesce(form_defs.name, forms."xmlFormId") asc`)
574574
// helper function to gate how form defs are joined to forms in _get
575575
/* eslint-disable indent */
576576
const versionJoinCondition = (version, enketoId) => (
577-
(enketoId) ? sql`form_defs."formId"=forms.id AND (form_defs."enketoId" = ${enketoId} OR (forms."enketoId" = ${enketoId} AND form_defs."publishedAt" IS NOT NULL))` :
577+
(enketoId) ? sql`
578+
form_defs."formId"=forms.id
579+
AND (
580+
form_defs."enketoId" = ${enketoId} AND form_defs.id = forms."draftDefId"
581+
OR (
582+
( forms."enketoId" = ${enketoId} OR forms."enketoOnceId" = ${enketoId} )
583+
AND form_defs.id = forms."currentDefId"
584+
)
585+
)` :
578586
(version === '___') ? versionJoinCondition('') :
579587
(version == null) ? sql`form_defs.id=coalesce(forms."currentDefId", forms."draftDefId")` :
580588
(version === Form.DraftVersion) ? sql`form_defs.id=forms."draftDefId"` :

test/integration/api/forms/forms.js

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1684,5 +1684,45 @@ describe('api: /projects/:id/forms (create, read, update)', () => {
16841684
await service.get(`/v1/enketo-ids/${enketoId}/form?st=${token}`)
16851685
.expect(200);
16861686
}));
1687+
1688+
it('should allow form lookup by enketoId if form has multiple published versions', testService(async (service) => {
1689+
const asAlice = await service.login('alice');
1690+
global.enketo.enketoId = '::firstEnketoId';
1691+
global.enketo.autoReset = false;
1692+
await asAlice.post('/v1/projects/1/forms?publish=true')
1693+
.send(testData.forms.simple2)
1694+
.set('Content-Type', 'application/xml')
1695+
.expect(200);
1696+
global.enketo.enketoId = '::secondEnketoId';
1697+
await asAlice.post('/v1/projects/1/forms/simple2/draft')
1698+
.expect(200);
1699+
await asAlice.post('/v1/projects/1/forms/simple2/draft/publish?version=two')
1700+
.expect(200);
1701+
const { body: { enketoId } } = await asAlice.get('/v1/projects/1/forms/simple2')
1702+
.expect(200);
1703+
should.exist(enketoId);
1704+
const token = await asAlice.post('/v1/projects/1/forms/simple2/public-links')
1705+
.send({ displayName: 'link1' })
1706+
.then(({ body }) => body.token);
1707+
await service.get(`/v1/enketo-ids/${enketoId}/form?st=${token}`)
1708+
.expect(200);
1709+
}));
1710+
1711+
it('should return the Form by enketoOnceId', testService(async (service) => {
1712+
const asAlice = await service.login('alice');
1713+
1714+
const enketoOnceId = await asAlice.post('/v1/projects/1/forms?publish=true')
1715+
.set('Content-Type', 'application/xml')
1716+
.send(testData.forms.simple2)
1717+
.expect(200)
1718+
.then(({ body }) => body.enketoOnceId);
1719+
1720+
const token = await asAlice.post('/v1/projects/1/forms/simple2/public-links')
1721+
.send({ displayName: 'link1' })
1722+
.then(({ body }) => body.token);
1723+
1724+
await service.get(`/v1/enketo-ids/${enketoOnceId}/form?st=${token}`)
1725+
.expect(200);
1726+
}));
16871727
});
16881728
});

0 commit comments

Comments
 (0)