70 lines
2.8 KiB
JavaScript
70 lines
2.8 KiB
JavaScript
import { PAID_ACTION_PAYMENT_METHODS } from '@/lib/constants'
|
|
import { satsToMsats } from '@/lib/format'
|
|
|
|
export const anonable = false
|
|
|
|
export const paymentMethods = [
|
|
PAID_ACTION_PAYMENT_METHODS.FEE_CREDIT,
|
|
PAID_ACTION_PAYMENT_METHODS.OPTIMISTIC
|
|
]
|
|
|
|
export async function getCost ({ id }, { me, models }) {
|
|
const pollOption = await models.pollOption.findUnique({
|
|
where: { id: parseInt(id) },
|
|
include: { item: true }
|
|
})
|
|
return satsToMsats(pollOption.item.pollCost)
|
|
}
|
|
|
|
export async function perform ({ invoiceId, id }, { me, cost, tx }) {
|
|
const pollOption = await tx.pollOption.findUnique({
|
|
where: { id: parseInt(id) }
|
|
})
|
|
const itemId = parseInt(pollOption.itemId)
|
|
|
|
let invoiceData = {}
|
|
if (invoiceId) {
|
|
invoiceData = { invoiceId, invoiceActionState: 'PENDING' }
|
|
// store a reference to the item in the invoice
|
|
await tx.invoice.update({
|
|
where: { id: invoiceId },
|
|
data: { actionId: itemId }
|
|
})
|
|
}
|
|
|
|
// the unique index on userId, itemId will prevent double voting
|
|
await tx.itemAct.create({ data: { msats: cost, itemId, userId: me.id, act: 'POLL', ...invoiceData } })
|
|
await tx.pollBlindVote.create({ data: { userId: me.id, itemId, ...invoiceData } })
|
|
await tx.pollVote.create({ data: { pollOptionId: pollOption.id, itemId, ...invoiceData } })
|
|
|
|
return { id }
|
|
}
|
|
|
|
export async function retry ({ invoiceId, newInvoiceId }, { tx }) {
|
|
await tx.itemAct.updateMany({ where: { invoiceId }, data: { invoiceId: newInvoiceId, invoiceActionState: 'PENDING' } })
|
|
await tx.pollBlindVote.updateMany({ where: { invoiceId }, data: { invoiceId: newInvoiceId, invoiceActionState: 'PENDING' } })
|
|
await tx.pollVote.updateMany({ where: { invoiceId }, data: { invoiceId: newInvoiceId, invoiceActionState: 'PENDING' } })
|
|
|
|
const { pollOptionId } = await tx.pollVote.findFirst({ where: { invoiceId: newInvoiceId } })
|
|
return { id: pollOptionId }
|
|
}
|
|
|
|
export async function onPaid ({ invoice }, { tx }) {
|
|
if (!invoice) return
|
|
|
|
await tx.itemAct.updateMany({ where: { invoiceId: invoice.id }, data: { invoiceActionState: 'PAID' } })
|
|
await tx.pollBlindVote.updateMany({ where: { invoiceId: invoice.id }, data: { invoiceActionState: 'PAID' } })
|
|
// anonymize the vote
|
|
await tx.pollVote.updateMany({ where: { invoiceId: invoice.id }, data: { invoiceId: null, invoiceActionState: null } })
|
|
}
|
|
|
|
export async function onFail ({ invoice }, { tx }) {
|
|
await tx.itemAct.updateMany({ where: { invoiceId: invoice.id }, data: { invoiceActionState: 'FAILED' } })
|
|
await tx.pollBlindVote.updateMany({ where: { invoiceId: invoice.id }, data: { invoiceActionState: 'FAILED' } })
|
|
await tx.pollVote.updateMany({ where: { invoiceId: invoice.id }, data: { invoiceActionState: 'FAILED' } })
|
|
}
|
|
|
|
export async function describe ({ id }, { actionId }) {
|
|
return `SN: vote on poll #${id ?? actionId}`
|
|
}
|