order all zap recipients

This commit is contained in:
keyan 2024-07-26 12:25:48 -05:00
parent 3d1f7834ca
commit 4964e2c7d1

View File

@ -74,23 +74,22 @@ export async function onPaid ({ invoice, actIds }, { models, tx }) {
SELECT "userId", ((${itemAct.msats}::BIGINT * pct) / 100)::BIGINT AS msats
FROM "ItemForward"
WHERE "itemId" = ${itemAct.itemId}::INTEGER
ORDER BY "userId" ASC -- order to prevent deadlocks
), total_forwarded AS (
SELECT COALESCE(SUM(msats), 0) as msats
FROM forwardees
), forward AS (
UPDATE users
SET
msats = users.msats + forwardees.msats,
"stackedMsats" = users."stackedMsats" + forwardees.msats
FROM forwardees
WHERE users.id = forwardees."userId"
), recipients AS (
SELECT "userId", msats FROM forwardees
UNION
SELECT ${itemAct.item.userId}::INTEGER as "userId",
${itemAct.msats}::BIGINT - (SELECT msats FROM total_forwarded)::BIGINT as msats
ORDER BY "userId" ASC -- order to prevent deadlocks
)
UPDATE users
SET
msats = msats + ${itemAct.msats}::BIGINT - (SELECT msats FROM total_forwarded)::BIGINT,
"stackedMsats" = "stackedMsats" + ${itemAct.msats}::BIGINT - (SELECT msats FROM total_forwarded)::BIGINT
WHERE id = ${itemAct.item.userId}::INTEGER`
msats = users.msats + recipients.msats,
"stackedMsats" = users."stackedMsats" + recipients.msats
FROM recipients
WHERE users.id = recipients."userId"`
// perform denomormalized aggregates: weighted votes, upvotes, msats, lastZapAt
// NOTE: for the rows that might be updated by a concurrent zap, we use UPDATE for implicit locking