diff --git a/pages/api/create-election.ts b/pages/api/create-election.ts index d86b66e4..f4ca6ec8 100644 --- a/pages/api/create-election.ts +++ b/pages/api/create-election.ts @@ -20,6 +20,7 @@ export default async (req: NextApiRequest, res: NextApiResponse) => { creator: jwt.email, election_manager: jwt.name, election_title, + num_invalidated_votes: 0, num_voters: 0, num_votes: 0, }) diff --git a/pages/api/election/[election_id]/admin/invalidate-voters.ts b/pages/api/election/[election_id]/admin/invalidate-voters.ts index 09e74141..e614a8cd 100644 --- a/pages/api/election/[election_id]/admin/invalidate-voters.ts +++ b/pages/api/election/[election_id]/admin/invalidate-voters.ts @@ -1,4 +1,5 @@ import { firebase, sendEmail } from 'api/_services' +import { firestore } from 'firebase-admin' import { NextApiRequest, NextApiResponse } from 'next' import { checkJwtOwnsElection } from '../../../validate-admin-jwt' @@ -15,13 +16,9 @@ export default async (req: NextApiRequest, res: NextApiResponse) => { await Promise.all( voters_to_invalidate.map(async (voter) => { const db = firebase.firestore() - const voterRef = db.collection('elections').doc(election_id).collection('voters').doc(voter.email) - const votes = await db - .collection('elections') - .doc(election_id) - .collection('votes') - .where('auth', '==', voter.auth_token) - .get() + const electionDoc = db.collection('elections').doc(election_id) + const voterRef = electionDoc.collection('voters').doc(voter.email) + const votes = await electionDoc.collection('votes').where('auth', '==', voter.auth_token).get() // Do all in parallel return Promise.all([ @@ -33,13 +30,9 @@ export default async (req: NextApiRequest, res: NextApiResponse) => { await Promise.all( votes.docs.map(async (vote) => { const invalidatedVote = { ...vote.data(), invalidated_at: new Date() } - await db - .collection('elections') - .doc(election_id) - .collection('invalidated_votes') - .doc(vote.id) - .set(invalidatedVote) + await electionDoc.collection('invalidated_votes').doc(vote.id).set(invalidatedVote) await vote.ref.delete() + await electionDoc.update({ num_invalidated_votes: firestore.FieldValue.increment(1) }) }), ) })(), diff --git a/pages/api/election/[election_id]/num-accepted-votes.ts b/pages/api/election/[election_id]/num-accepted-votes.ts index 72b07649..cb486373 100644 --- a/pages/api/election/[election_id]/num-accepted-votes.ts +++ b/pages/api/election/[election_id]/num-accepted-votes.ts @@ -14,7 +14,10 @@ export default async (req: NextApiRequest, res: NextApiResponse) => { // Is election_id in DB? if (!electionDoc.exists) return res.status(400).json({ error: 'Unknown Election ID.' }) - const { num_votes } = { ...electionDoc.data() } as { num_votes: number } + const { num_invalidated_votes = 0, num_votes } = { ...electionDoc.data() } as { + num_invalidated_votes?: number + num_votes: number + } - return res.status(200).json(num_votes) + return res.status(200).json(num_votes - num_invalidated_votes) }