51 lines
1.4 KiB
JavaScript
51 lines
1.4 KiB
JavaScript
import models from '../../../../api/models'
|
|
import lnd from '../../../../api/lnd'
|
|
import { createInvoice } from 'ln-service'
|
|
import { lnurlPayDescriptionHash } from '../../../../lib/lnurl'
|
|
|
|
export default async ({ query: { username, amount } }, res) => {
|
|
const user = await models.user.findUnique({ where: { name: username } })
|
|
if (!user) {
|
|
return res.status(400).json({ status: 'ERROR', reason: `user @${username} does not exist` })
|
|
}
|
|
|
|
if (!amount || amount < 1000) {
|
|
return res.status(400).json({ status: 'ERROR', reason: 'amount must be >=1000 msats' })
|
|
}
|
|
|
|
// generate invoice
|
|
const expiresAt = new Date(new Date().setHours(new Date().getHours() + 3))
|
|
const description = `${amount} msats for @${user.name} on stacker.news`
|
|
const descriptionHash = lnurlPayDescriptionHash(username)
|
|
try {
|
|
const invoice = await createInvoice({
|
|
description,
|
|
description_hash: descriptionHash,
|
|
lnd,
|
|
mtokens: amount,
|
|
expires_at: expiresAt
|
|
})
|
|
|
|
const data = {
|
|
hash: invoice.id,
|
|
bolt11: invoice.request,
|
|
expiresAt: expiresAt,
|
|
msatsRequested: Number(amount),
|
|
user: {
|
|
connect: {
|
|
id: user.id
|
|
}
|
|
}
|
|
}
|
|
|
|
await models.invoice.create({ data })
|
|
|
|
return res.status(200).json({
|
|
pr: invoice.request
|
|
})
|
|
} catch (error) {
|
|
console.log(error)
|
|
res.status(400).json({ status: 'ERROR', reason: 'failed to create invoice' })
|
|
}
|
|
}
|