diff --git a/lib/model/query/datasets.js b/lib/model/query/datasets.js index ccf8f7330..be50cbf9b 100644 --- a/lib/model/query/datasets.js +++ b/lib/model/query/datasets.js @@ -143,8 +143,9 @@ const createOrMerge = (parsedDataset, form, fields) => async ({ context, one, Ac // Check properties with same name but different capitualization const duplicateProperties = newNames + .filter(newName => !existingNames.includes(newName)) .map(newName => ({ - current: existingNames.find(existingName => existingName !== newName && newName.toLowerCase() === existingName.toLowerCase()), + current: existingNames.find(existingName => newName.toLowerCase() === existingName.toLowerCase()), provided: newName })) .filter(property => property.current); @@ -290,6 +291,7 @@ const publishIfExists = (formDefId, publishedAt) => async ({ all, context, maybe AND dp.name != existing_properties.name WHERE dpf."formDefId" = ${formDefId} AND existing_properties."publishedAt" IS NOT NULL + AND dp."publishedAt" IS NULL `; const d = await maybeOne(_datasetNameConflict()); diff --git a/test/integration/api/datasets.js b/test/integration/api/datasets.js index f97d96676..838385fce 100644 --- a/test/integration/api/datasets.js +++ b/test/integration/api/datasets.js @@ -4063,6 +4063,23 @@ describe('datasets and entities', () => { }); })); + + it('should reject when publishing duplicate property with different capitalization', testService(async (service, container) => { + const alice = await service.login('alice'); + + await alice.post('/v1/projects/1/forms?publish=True') + .send(testData.forms.simpleEntity) + .set('Content-Type', 'application/xml') + .expect(200); + + await container.run(sql`UPDATE ds_properties SET name='FIRST_NAME' WHERE name='age'`); + + await alice.post('/v1/projects/1/forms/simpleEntity/draft') + .expect(200); + + await alice.post('/v1/projects/1/forms/simpleEntity/draft/publish?version=v2') + .expect(200); + })); }); describe('updating datasets through new form drafts', () => {