stacker.news/pages/api/lnurlp/[username]/pay.js

51 lines
1.4 KiB
JavaScript
Raw Normal View History

2021-10-07 18:37:59 +00:00
import models from '../../../../api/models'
import lnd from '../../../../api/lnd'
import { createInvoice } from 'ln-service'
2021-10-07 21:03:54 +00:00
import { lnurlPayDescriptionHash } from '../../../../lib/lnurl'
2021-10-07 18:37:59 +00:00
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))
2021-10-07 20:36:12 +00:00
const description = `${amount} msats for @${user.name} on stacker.news`
2021-10-07 21:03:54 +00:00
const descriptionHash = lnurlPayDescriptionHash(username)
2021-10-07 18:37:59 +00:00
try {
const invoice = await createInvoice({
description,
2021-10-07 20:36:12 +00:00
description_hash: descriptionHash,
2021-10-07 18:37:59 +00:00
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' })
}
}