62 lines
1.5 KiB
JavaScript
62 lines
1.5 KiB
JavaScript
|
import { TERRITORY_PERIOD_COST } from '@/lib/constants'
|
||
|
import { satsToMsats } from '@/lib/format'
|
||
|
import { nextBilling } from '@/lib/territory'
|
||
|
|
||
|
export const anonable = false
|
||
|
export const supportsPessimism = true
|
||
|
export const supportsOptimism = false
|
||
|
|
||
|
export async function getCost ({ billingType }) {
|
||
|
return satsToMsats(TERRITORY_PERIOD_COST(billingType))
|
||
|
}
|
||
|
|
||
|
export async function perform ({ name, invoiceId, ...data }, { me, cost, tx }) {
|
||
|
const sub = await tx.sub.findUnique({
|
||
|
where: {
|
||
|
name
|
||
|
}
|
||
|
})
|
||
|
|
||
|
data.billingCost = TERRITORY_PERIOD_COST(data.billingType)
|
||
|
|
||
|
// we never want to bill them again if they are changing to ONCE
|
||
|
if (data.billingType === 'ONCE') {
|
||
|
data.billPaidUntil = null
|
||
|
data.billingAutoRenew = false
|
||
|
}
|
||
|
|
||
|
data.billedLastAt = new Date()
|
||
|
data.billPaidUntil = nextBilling(data.billedLastAt, data.billingType)
|
||
|
data.status = 'ACTIVE'
|
||
|
data.userId = me.id
|
||
|
|
||
|
if (sub.userId !== me.id) {
|
||
|
await tx.territoryTransfer.create({ data: { subName: name, oldUserId: sub.userId, newUserId: me.id } })
|
||
|
}
|
||
|
|
||
|
await tx.subAct.create({
|
||
|
data: {
|
||
|
userId: me.id,
|
||
|
subName: name,
|
||
|
msats: cost,
|
||
|
type: 'BILLING'
|
||
|
}
|
||
|
})
|
||
|
|
||
|
return await tx.sub.update({
|
||
|
data,
|
||
|
// optimistic concurrency control
|
||
|
// make sure none of the relevant fields have changed since we fetched the sub
|
||
|
where: {
|
||
|
...sub,
|
||
|
postTypes: {
|
||
|
equals: sub.postTypes
|
||
|
}
|
||
|
}
|
||
|
})
|
||
|
}
|
||
|
|
||
|
export async function describe ({ name }, context) {
|
||
|
return `SN: unarchive territory ${name}`
|
||
|
}
|