diff --git a/lib/model/query/form-attachments.js b/lib/model/query/form-attachments.js index db8068991..e63d248b2 100644 --- a/lib/model/query/form-attachments.js +++ b/lib/model/query/form-attachments.js @@ -165,11 +165,11 @@ const _get = (exec, options) => { SELECT datasets.id, MAX("loggedAt") AS "lastAudit" FROM audits JOIN datasets ON audits."acteeId" = datasets."acteeId" ${actorId == null ? sql`` : sql` - -- We're always interested in dataset.create and dataset.update - -- actions, even for ownerOnly datasets. + -- We're always interested in dataset.create and in actions that add + -- or delete entity properties -- even for ownerOnly datasets. WHERE (NOT datasets."ownerOnly") OR - audits.action IN ('dataset.create', 'dataset.update') + audits.action IN ('dataset.create', 'dataset.update', 'dataset.update.property.delete') `} GROUP BY datasets.id ) AS audit_metadata ON audit_metadata.id = datasets.id diff --git a/test/integration/api/datasets.js b/test/integration/api/datasets.js index 43fb4cdf5..d0d8df110 100644 --- a/test/integration/api/datasets.js +++ b/test/integration/api/datasets.js @@ -7064,6 +7064,23 @@ describe('datasets and entities', () => { (await getHash(asChelsea)).should.not.equal(originalHash); })); + it('changes hash after a dataset property is deleted', testServiceFullTrx(async (service) => { + const [asAlice, asChelsea] = await service.login(['alice', 'chelsea']); + await createData(asAlice); + await assignToProject(asAlice, asChelsea, 'formfill'); + + // Add an entity property. + await asAlice.post('/v1/projects/1/datasets/people/properties') + .send({ name: 'foo' }) + .expect(200); + const originalHash = await getHash(asChelsea); + + // Delete the property. + await asAlice.delete('/v1/projects/1/datasets/people/properties/foo') + .expect(200); + (await getHash(asChelsea)).should.not.equal(originalHash); + })); + it('computes hash based on timestamps and the entity count', testServiceFullTrx(async (service, container) => { const [asAlice, asChelsea] = await service.login(['alice', 'chelsea']); await createData(asAlice);