75 lines
1.7 KiB
JavaScript
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,
|
|
};
|