HotTRDealsBackend/db/vote.db.js
2026-01-23 17:28:21 +00:00

58 lines
1.2 KiB
JavaScript

const prisma = require("./client");
async function voteDealTx({ dealId, userId, voteType }) {
return prisma.$transaction(async (db) => {
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 },
});
// current state
await db.dealVote.upsert({
where: { dealId_userId: { dealId, userId } },
create: {
dealId,
userId,
voteType,
lastVotedAt: new Date(),
},
update: {
voteType,
lastVotedAt: new Date(),
},
});
// 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,
};
});
}
module.exports = {
voteDealTx,
};