diff --git a/src/writer/delete-proposal.ts b/src/writer/delete-proposal.ts index 3d777acd..4e550b90 100644 --- a/src/writer/delete-proposal.ts +++ b/src/writer/delete-proposal.ts @@ -19,10 +19,12 @@ export async function verify(body): Promise { } export async function action(body): Promise { + const BATCH_SIZE = 1000; + const msg = jsonParse(body.msg); const proposal = await getProposal(msg.space, msg.payload.proposal); - const voters = await db.queryAsync(`SELECT voter FROM votes WHERE proposal = ?`, [ + const voters = await db.queryAsync(`SELECT voter, vp_value FROM votes WHERE proposal = ?`, [ msg.payload.proposal ]); const id = msg.payload.proposal; @@ -53,4 +55,21 @@ export async function action(body): Promise { } await db.queryAsync(queries, parameters); + + const votersWithVpValue = voters.filter(v => v.vp_value > 0); + if (votersWithVpValue.length > 0) { + for (let i = 0; i < votersWithVpValue.length; i += BATCH_SIZE) { + const batch = votersWithVpValue.slice(i, i + BATCH_SIZE); + const vpQueries = batch + .map( + () => + `UPDATE leaderboard SET vp_value = GREATEST(vp_value - ?, 0) WHERE user = ? AND space = ?;` + ) + .join('\n '); + + const vpParams = batch.flatMap(voter => [voter.vp_value, voter.voter, msg.space]); + + await db.queryAsync(vpQueries, vpParams); + } + } } diff --git a/src/writer/vote.ts b/src/writer/vote.ts index 2d5b76bb..3bd442c8 100644 --- a/src/writer/vote.ts +++ b/src/writer/vote.ts @@ -187,6 +187,7 @@ export async function action(body, ipfs, receipt, id, context): Promise { proposalId, msg.space, created, + vpValue, voter, msg.space ] @@ -196,12 +197,12 @@ export async function action(body, ipfs, receipt, id, context): Promise { await db.queryAsync( ` INSERT INTO votes SET ?; - INSERT INTO leaderboard (space, user, vote_count, last_vote) - VALUES(?, ?, 1, ?) - ON DUPLICATE KEY UPDATE vote_count = vote_count + 1, last_vote = ?; + INSERT INTO leaderboard (space, user, vote_count, last_vote, vp_value) + VALUES(?, ?, 1, ?, ?) + ON DUPLICATE KEY UPDATE vote_count = vote_count + 1, last_vote = VALUES(last_vote), vp_value = vp_value + VALUES(vp_value); UPDATE spaces SET vote_count = vote_count + 1 WHERE id = ?; `, - [params, msg.space, voter, created, created, msg.space] + [params, msg.space, voter, created, vpValue, msg.space] ); } diff --git a/test/schema.sql b/test/schema.sql index 7477fb10..d94d5664 100644 --- a/test/schema.sql +++ b/test/schema.sql @@ -190,11 +190,13 @@ CREATE TABLE leaderboard ( vote_count SMALLINT UNSIGNED NOT NULL DEFAULT '0', proposal_count SMALLINT UNSIGNED NOT NULL DEFAULT '0', last_vote BIGINT, + vp_value DECIMAL(13,3) NOT NULL DEFAULT 0.000, PRIMARY KEY user_space (user,space), INDEX space (space), INDEX vote_count (vote_count), INDEX proposal_count (proposal_count), - INDEX last_vote (last_vote) + INDEX last_vote (last_vote), + INDEX vp_value (vp_value) ); CREATE TABLE skins (