HotTRDealsBackend/db/vote.db.js
2026-02-04 06:39:10 +00:00

75 lines
1.7 KiB
JavaScript

const prisma = require("./client");
async function voteDealTxWithDb(db, { dealId, userId, voteType, createdAt }) {
const timestamp = createdAt instanceof Date ? createdAt : createdAt ? new Date(createdAt) : new Date()
const current = await db.dealVote.findUnique({
where: { dealId_userId: { dealId, userId } },
select: { voteType: true },
})
const oldValue = current ? current.voteType : 0
const delta = voteType - oldValue
// history (append-only)
await db.dealVoteHistory.create({
data: { dealId, userId, voteType, createdAt: timestamp },
})
// current state
await db.dealVote.upsert({
where: { dealId_userId: { dealId, userId } },
create: {
dealId,
userId,
voteType,
createdAt: timestamp,
lastVotedAt: timestamp,
},
update: {
voteType,
lastVotedAt: timestamp,
},
})
// score delta
if (delta !== 0) {
await db.deal.update({
where: { id: dealId },
data: { score: { increment: delta } },
})
}
const deal = await db.deal.findUnique({
where: { id: dealId },
select: { score: true },
})
return {
dealId,
voteType,
delta,
score: deal?.score ?? null,
}
}
async function voteDealTx({ dealId, userId, voteType, createdAt }) {
return prisma.$transaction((db) =>
voteDealTxWithDb(db, { dealId, userId, voteType, createdAt })
)
}
async function voteDealBatchTx(items = []) {
if (!items.length) return { count: 0 }
return prisma.$transaction(async (db) => {
for (const item of items) {
await voteDealTxWithDb(db, item)
}
return { count: items.length }
})
}
module.exports = {
voteDealTx,
voteDealBatchTx,
};