limit pending invoices
This commit is contained in:
parent
ba4644463f
commit
c061f4a6f0
@ -1,11 +1,29 @@
|
|||||||
import { createInvoice, decodePaymentRequest, payViaPaymentRequest } from 'ln-service'
|
import { createInvoice, decodePaymentRequest, payViaPaymentRequest } from 'ln-service'
|
||||||
import { UserInputError, AuthenticationError } from 'apollo-server-micro'
|
import { UserInputError, AuthenticationError, ForbiddenError } from 'apollo-server-micro'
|
||||||
import serialize from './serial'
|
import serialize from './serial'
|
||||||
import { decodeCursor, LIMIT, nextCursorEncoded } from '../../lib/cursor'
|
import { decodeCursor, LIMIT, nextCursorEncoded } from '../../lib/cursor'
|
||||||
import lnpr from 'bolt11'
|
import lnpr from 'bolt11'
|
||||||
import { SELECT } from './item'
|
import { SELECT } from './item'
|
||||||
import { lnurlPayDescriptionHash } from '../../lib/lnurl'
|
import { lnurlPayDescriptionHash } from '../../lib/lnurl'
|
||||||
|
|
||||||
|
const INVOICE_LIMIT = 10
|
||||||
|
|
||||||
|
export async function belowInvoiceLimit (models, userId) {
|
||||||
|
// make sure user has not exceeded INVOICE_LIMIT
|
||||||
|
const count = await models.invoice.count({
|
||||||
|
where: {
|
||||||
|
userId,
|
||||||
|
expiresAt: {
|
||||||
|
gt: new Date()
|
||||||
|
},
|
||||||
|
confirmedAt: null,
|
||||||
|
cancelled: false
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
return count < INVOICE_LIMIT
|
||||||
|
}
|
||||||
|
|
||||||
export async function getInvoice (parent, { id }, { me, models }) {
|
export async function getInvoice (parent, { id }, { me, models }) {
|
||||||
if (!me) {
|
if (!me) {
|
||||||
throw new AuthenticationError('you must be logged in')
|
throw new AuthenticationError('you must be logged in')
|
||||||
@ -181,6 +199,10 @@ export default {
|
|||||||
|
|
||||||
const user = await models.user.findUnique({ where: { id: me.id } })
|
const user = await models.user.findUnique({ where: { id: me.id } })
|
||||||
|
|
||||||
|
if (!await belowInvoiceLimit(models, me.id)) {
|
||||||
|
throw new ForbiddenError('too many pending invoices')
|
||||||
|
}
|
||||||
|
|
||||||
// set expires at to 3 hours into future
|
// set expires at to 3 hours into future
|
||||||
const expiresAt = new Date(new Date().setHours(new Date().getHours() + 3))
|
const expiresAt = new Date(new Date().setHours(new Date().getHours() + 3))
|
||||||
const description = `${amount} sats for @${user.name} on stacker.news`
|
const description = `${amount} sats for @${user.name} on stacker.news`
|
||||||
|
@ -3,6 +3,7 @@ import lnd from '../../../../api/lnd'
|
|||||||
import { createInvoice } from 'ln-service'
|
import { createInvoice } from 'ln-service'
|
||||||
import { lnurlPayDescriptionHashForUser } from '../../../../lib/lnurl'
|
import { lnurlPayDescriptionHashForUser } from '../../../../lib/lnurl'
|
||||||
import serialize from '../../../../api/resolvers/serial'
|
import serialize from '../../../../api/resolvers/serial'
|
||||||
|
import { belowInvoiceLimit } from '../../../../api/resolvers/wallet'
|
||||||
|
|
||||||
export default async ({ query: { username, amount } }, res) => {
|
export default async ({ query: { username, amount } }, res) => {
|
||||||
const user = await models.user.findUnique({ where: { name: username } })
|
const user = await models.user.findUnique({ where: { name: username } })
|
||||||
@ -14,8 +15,12 @@ export default async ({ query: { username, amount } }, res) => {
|
|||||||
return res.status(400).json({ status: 'ERROR', reason: 'amount must be >=1000 msats' })
|
return res.status(400).json({ status: 'ERROR', reason: 'amount must be >=1000 msats' })
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!await belowInvoiceLimit(models, user.id)) {
|
||||||
|
return res.status(400).json({ status: 'ERROR', reason: 'too many pending invoices' })
|
||||||
|
}
|
||||||
|
|
||||||
// generate invoice
|
// generate invoice
|
||||||
const expiresAt = new Date(new Date().setHours(new Date().getHours() + 3))
|
const expiresAt = new Date(new Date().setMinutes(new Date().getMinutes() + 1))
|
||||||
const description = `${amount} msats for @${user.name} on stacker.news`
|
const description = `${amount} msats for @${user.name} on stacker.news`
|
||||||
const descriptionHash = lnurlPayDescriptionHashForUser(username)
|
const descriptionHash = lnurlPayDescriptionHashForUser(username)
|
||||||
try {
|
try {
|
||||||
|
@ -114,6 +114,7 @@ export function FundForm () {
|
|||||||
initial={{
|
initial={{
|
||||||
amount: 1000
|
amount: 1000
|
||||||
}}
|
}}
|
||||||
|
initialError={error?.toString()}
|
||||||
schema={FundSchema}
|
schema={FundSchema}
|
||||||
onSubmit={async ({ amount }) => {
|
onSubmit={async ({ amount }) => {
|
||||||
const { data } = await createInvoice({ variables: { amount: Number(amount) } })
|
const { data } = await createInvoice({ variables: { amount: Number(amount) } })
|
||||||
|
Loading…
x
Reference in New Issue
Block a user