diff --git a/src/ingestor.ts b/src/ingestor.ts index 192595a2..30b02017 100644 --- a/src/ingestor.ts +++ b/src/ingestor.ts @@ -142,7 +142,7 @@ export default async function ingestor(req) { body: message.body, discussion: message.discussion || '', choices: message.choices, - privacy: message.privacy || '', + privacy: message.privacy, labels: message.labels || [], start: message.start, end: message.end, @@ -169,7 +169,7 @@ export default async function ingestor(req) { name: message.title, body: message.body, discussion: message.discussion || '', - privacy: message.privacy || '', + privacy: message.privacy, choices: message.choices, labels: message.labels || [], metadata: { diff --git a/src/writer/proposal.ts b/src/writer/proposal.ts index 789c0fdf..43817d90 100644 --- a/src/writer/proposal.ts +++ b/src/writer/proposal.ts @@ -102,11 +102,10 @@ export async function verify(body): Promise { if (msg.payload.type !== space.voting.type) return Promise.reject('invalid voting type'); } - if ( - space.voting?.privacy !== 'any' && - msg.payload.privacy && - !(space.voting?.privacy === 'shutter' && msg.payload.privacy === 'shutter') - ) { + const spacePrivacy = space.voting?.privacy ?? 'any'; + const proposalPrivacy = msg.payload.privacy; + + if (proposalPrivacy !== undefined && spacePrivacy !== 'any' && spacePrivacy !== proposalPrivacy) { return Promise.reject('not allowed to set privacy'); } @@ -214,9 +213,9 @@ export async function action(body, ipfs, receipt, id): Promise { const plugins = JSON.stringify(metadata.plugins || {}); const spaceNetwork = spaceSettings.network; const proposalSnapshot = parseInt(msg.payload.snapshot || '0'); - let privacy = spaceSettings.voting?.privacy || ''; + let privacy = spaceSettings.voting?.privacy ?? 'any'; if (privacy === 'any') { - privacy = msg.payload.privacy; + privacy = msg.payload.privacy ?? ''; } let quorum = spaceSettings.voting?.quorum || 0; diff --git a/src/writer/update-proposal.ts b/src/writer/update-proposal.ts index 271f6366..680119cf 100644 --- a/src/writer/update-proposal.ts +++ b/src/writer/update-proposal.ts @@ -49,11 +49,10 @@ export async function verify(body): Promise { if (proposal.author !== body.address) return Promise.reject('Not the author'); - if ( - space.voting?.privacy !== 'any' && - msg.payload.privacy && - !(space.voting.privacy === 'shutter' && msg.payload.privacy === 'shutter') - ) { + const spacePrivacy = space.voting?.privacy ?? 'any'; + const proposalPrivacy = msg.payload.privacy; + + if (proposalPrivacy !== undefined && spacePrivacy !== 'any' && spacePrivacy !== proposalPrivacy) { return Promise.reject('not allowed to set privacy'); } @@ -72,9 +71,9 @@ export async function action(body, ipfs): Promise { const metadata = msg.payload.metadata || {}; const plugins = JSON.stringify(metadata.plugins || {}); const spaceSettings = await getSpace(msg.space); - let privacy = spaceSettings.voting?.privacy || ''; + let privacy = spaceSettings.voting?.privacy ?? 'any'; if (privacy === 'any') { - privacy = msg.payload.privacy; + privacy = msg.payload.privacy ?? ''; } const proposal = { diff --git a/test/unit/writer/proposal.test.ts b/test/unit/writer/proposal.test.ts index f8b7268f..8dd623be 100644 --- a/test/unit/writer/proposal.test.ts +++ b/test/unit/writer/proposal.test.ts @@ -337,10 +337,10 @@ describe('writer/proposal', () => { }); }); - it('rejects a proposal with shutter privacy', () => { + it('accepts a proposal with shutter privacy', () => { return expect( writer.verify(updateInputPayload(input, { privacy: 'shutter' })) - ).rejects.toMatch('not allowed to set privacy'); + ).resolves.toBeUndefined(); }); it('accepts a proposal with undefined privacy', () => { @@ -402,6 +402,13 @@ describe('writer/proposal', () => { writer.verify(updateInputPayload(input, { privacy: undefined })) ).resolves.toBeUndefined(); }); + + it('rejects a proposal with privacy empty string', async () => { + expect.assertions(1); + await expect(writer.verify(updateInputPayload(input, { privacy: '' }))).rejects.toMatch( + 'not allowed to set privacy' + ); + }); }); });