Fixed payment checking

This commit is contained in:
benarc 2021-10-22 00:41:30 +01:00
parent 6c7248ae94
commit e03370188a
28 changed files with 193 additions and 212 deletions

View file

@ -46,9 +46,9 @@ class Wallet(BaseModel):
) )
async def get_payment(self, payment_hash: str) -> Optional["Payment"]: async def get_payment(self, payment_hash: str) -> Optional["Payment"]:
from .crud import get_wallet_payment from .crud import get_standalone_payment
return await get_wallet_payment(self.id, payment_hash) return await get_standalone_payment(payment_hash)
class User(BaseModel): class User(BaseModel):

View file

@ -314,7 +314,6 @@ async def check_invoice_status(
if not payment: if not payment:
return PaymentStatus(None) return PaymentStatus(None)
status = await WALLET.get_invoice_status(payment.checking_id) status = await WALLET.get_invoice_status(payment.checking_id)
print(status)
if not payment.pending: if not payment.pending:
return status return status
if payment.is_out and status.failed: if payment.is_out and status.failed:

View file

@ -587,28 +587,29 @@ new Vue({
} }
}) })
}, },
updateWalletName: function(){ updateWalletName: function () {
let newName = this.newName let newName = this.newName
if(!newName || !newName.length) return if (!newName || !newName.length) return
// let data = {name: newName} // let data = {name: newName}
LNbits.api LNbits.api
.request( .request('PUT', '/api/v1/wallet/' + newName, this.g.wallet.inkey, {})
'PUT', .then(res => {
'/api/v1/wallet/' + newName, this.newName = ''
this.g.wallet.inkey, this.$q.notify({
{} message: `Wallet named updated.`,
).then(res => { type: 'positive',
this.newName = '' timeout: 3500
this.$q.notify({ })
message: `Wallet named updated.`, LNbits.href.updateWallet(
type: 'positive', res.data.name,
timeout: 3500 this.user.id,
this.g.wallet.id
)
})
.catch(err => {
this.newName = ''
LNbits.utils.notifyApiError(err)
}) })
LNbits.href.updateWallet(res.data.name, this.user.id, this.g.wallet.id)
}).catch(err => {
this.newName = ''
LNbits.utils.notifyApiError(err)
})
}, },
deleteWallet: function (walletId, user) { deleteWallet: function (walletId, user) {
LNbits.utils LNbits.utils

View file

@ -29,7 +29,7 @@
> >
<h5 class="text-caption q-mt-sm q-mb-none">Curl example</h5> <h5 class="text-caption q-mt-sm q-mb-none">Curl example</h5>
<code <code
>curl {{ request.url_root }}api/v1/wallet -H "X-Api-Key: >curl {{ request.base_url }}api/v1/wallet -H "X-Api-Key:
<i>{{ wallet.inkey }}</i>"</code <i>{{ wallet.inkey }}</i>"</code
> >
</q-card-section> </q-card-section>
@ -59,7 +59,7 @@
> >
<h5 class="text-caption q-mt-sm q-mb-none">Curl example</h5> <h5 class="text-caption q-mt-sm q-mb-none">Curl example</h5>
<code <code
>curl -X POST {{ request.url_root }}api/v1/payments -d '{"out": false, >curl -X POST {{ request.base_url }}api/v1/payments -d '{"out": false,
"amount": &lt;int&gt;, "memo": &lt;string&gt;, "webhook": "amount": &lt;int&gt;, "memo": &lt;string&gt;, "webhook":
&lt;url:string&gt;}' -H "X-Api-Key: <i>{{ wallet.inkey }}</i>" -H &lt;url:string&gt;}' -H "X-Api-Key: <i>{{ wallet.inkey }}</i>" -H
"Content-type: application/json"</code "Content-type: application/json"</code
@ -86,7 +86,7 @@
<code>{"payment_hash": &lt;string&gt;}</code> <code>{"payment_hash": &lt;string&gt;}</code>
<h5 class="text-caption q-mt-sm q-mb-none">Curl example</h5> <h5 class="text-caption q-mt-sm q-mb-none">Curl example</h5>
<code <code
>curl -X POST {{ request.url_root }}api/v1/payments -d '{"out": true, >curl -X POST {{ request.base_url }}api/v1/payments -d '{"out": true,
"bolt11": &lt;string&gt;}' -H "X-Api-Key: "bolt11": &lt;string&gt;}' -H "X-Api-Key:
<i>{{ wallet.adminkey }}"</i> -H "Content-type: <i>{{ wallet.adminkey }}"</i> -H "Content-type:
application/json"</code application/json"</code
@ -116,7 +116,7 @@
</h5> </h5>
<h5 class="text-caption q-mt-sm q-mb-none">Curl example</h5> <h5 class="text-caption q-mt-sm q-mb-none">Curl example</h5>
<code <code
>curl -X POST {{ request.url_root }}api/v1/payments/decode -d >curl -X POST {{ request.base_url }}api/v1/payments/decode -d
'{"data": &lt;bolt11/lnurl, string&gt;}' -H "X-Api-Key: '{"data": &lt;bolt11/lnurl, string&gt;}' -H "X-Api-Key:
<i>{{ wallet.inkey }}</i>" -H "Content-type: application/json"</code <i>{{ wallet.inkey }}</i>" -H "Content-type: application/json"</code
> >
@ -144,7 +144,7 @@
<code>{"paid": &lt;bool&gt;}</code> <code>{"paid": &lt;bool&gt;}</code>
<h5 class="text-caption q-mt-sm q-mb-none">Curl example</h5> <h5 class="text-caption q-mt-sm q-mb-none">Curl example</h5>
<code <code
>curl -X GET {{ request.url_root >curl -X GET {{ request.base_url
}}api/v1/payments/&lt;payment_hash&gt; -H "X-Api-Key: }}api/v1/payments/&lt;payment_hash&gt; -H "X-Api-Key:
<i>{{ wallet.inkey }}"</i> -H "Content-type: application/json"</code <i>{{ wallet.inkey }}"</i> -H "Content-type: application/json"</code
> >

View file

@ -270,22 +270,24 @@
can scan it from your phone to open your wallet from there. can scan it from your phone to open your wallet from there.
</p> </p>
<qrcode <qrcode
:value="'{{request.url_root}}'+'wallet?usr={{user.id}}&wal={{wallet.id}}'" :value="'{{request.base_url}}' +'wallet?usr={{user.id}}&wal={{wallet.id}}'"
:options="{width:240}" :options="{width:240}"
></qrcode> ></qrcode>
</q-card-section> </q-card-section>
</q-card> </q-card>
</q-expansion-item> </q-expansion-item>
<q-separator></q-separator> <q-separator></q-separator>
<q-expansion-item <q-expansion-item group="extras" icon="edit" label="Rename wallet">
group="extras"
icon="edit"
label="Rename wallet"
>
<q-card> <q-card>
<q-card-section> <q-card-section>
<div class="" style="max-width: 320px"> <div class="" style="max-width: 320px">
<q-input filled v-model.trim="newName" label="Label" dense="dense" @update:model-value="(e) => console.log(e)"/> <q-input
filled
v-model.trim="newName"
label="Label"
dense="dense"
@update:model-value="(e) => console.log(e)"
/>
</div> </div>
<q-btn <q-btn
:disable="!newName.length" :disable="!newName.length"
@ -466,7 +468,8 @@
</span> </span>
</p> </p>
<p v-else class="q-my-none text-h6 text-center"> <p v-else class="q-my-none text-h6 text-center">
<b>{{ parse.lnurlpay.targetUser || parse.lnurlpay.domain }}</b> is requesting <br /> <b>{{ parse.lnurlpay.targetUser || parse.lnurlpay.domain }}</b> is
requesting <br />
between <b>{{ parse.lnurlpay.minSendable | msatoshiFormat }}</b> and between <b>{{ parse.lnurlpay.minSendable | msatoshiFormat }}</b> and
<b>{{ parse.lnurlpay.maxSendable | msatoshiFormat }}</b> sat <b>{{ parse.lnurlpay.maxSendable | msatoshiFormat }}</b> sat
<span v-if="parse.lnurlpay.commentAllowed > 0"> <span v-if="parse.lnurlpay.commentAllowed > 0">

View file

@ -27,7 +27,12 @@ from lnbits.requestvars import g
from lnbits.utils.exchange_rates import currencies, fiat_amount_as_satoshis from lnbits.utils.exchange_rates import currencies, fiat_amount_as_satoshis
from .. import core_app, db from .. import core_app, db
from ..crud import get_payments, save_balance_check, update_wallet from ..crud import (
get_payments,
save_balance_check,
update_wallet,
get_standalone_payment,
)
from ..services import ( from ..services import (
InvoiceFailure, InvoiceFailure,
PaymentFailure, PaymentFailure,
@ -318,9 +323,11 @@ async def api_payments_sse(
@core_app.get("/api/v1/payments/{payment_hash}") @core_app.get("/api/v1/payments/{payment_hash}")
async def api_payment(payment_hash, wallet: WalletTypeInfo = Depends(get_key_type)): async def api_payment(payment_hash):
payment = await wallet.wallet.get_payment(payment_hash)
payment = await get_standalone_payment(payment_hash)
await check_invoice_status(payment.wallet_id, payment_hash)
payment = await get_standalone_payment(payment_hash)
if not payment: if not payment:
return {"message": "Payment does not exist."} return {"message": "Payment does not exist."}
elif not payment.pending: elif not payment.pending:

View file

@ -31,7 +31,7 @@
<code>[&lt;copilot_object&gt;, ...]</code> <code>[&lt;copilot_object&gt;, ...]</code>
<h5 class="text-caption q-mt-sm q-mb-none">Curl example</h5> <h5 class="text-caption q-mt-sm q-mb-none">Curl example</h5>
<code <code
>curl -X POST {{ request.url_root }}api/v1/copilot -d '{"title": >curl -X POST {{ request.base_url }}api/v1/copilot -d '{"title":
&lt;string&gt;, "animation": &lt;string&gt;, &lt;string&gt;, "animation": &lt;string&gt;,
"show_message":&lt;string&gt;, "amount": &lt;integer&gt;, "show_message":&lt;string&gt;, "amount": &lt;integer&gt;,
"lnurl_title": &lt;string&gt;}' -H "Content-type: application/json" "lnurl_title": &lt;string&gt;}' -H "Content-type: application/json"
@ -58,7 +58,7 @@
<code>[&lt;copilot_object&gt;, ...]</code> <code>[&lt;copilot_object&gt;, ...]</code>
<h5 class="text-caption q-mt-sm q-mb-none">Curl example</h5> <h5 class="text-caption q-mt-sm q-mb-none">Curl example</h5>
<code <code
>curl -X POST {{ request.url_root >curl -X POST {{ request.base_url
}}api/v1/copilot/&lt;copilot_id&gt; -d '{"title": &lt;string&gt;, }}api/v1/copilot/&lt;copilot_id&gt; -d '{"title": &lt;string&gt;,
"animation": &lt;string&gt;, "show_message":&lt;string&gt;, "animation": &lt;string&gt;, "show_message":&lt;string&gt;,
"amount": &lt;integer&gt;, "lnurl_title": &lt;string&gt;}' -H "amount": &lt;integer&gt;, "lnurl_title": &lt;string&gt;}' -H
@ -87,7 +87,7 @@
<code>[&lt;copilot_object&gt;, ...]</code> <code>[&lt;copilot_object&gt;, ...]</code>
<h5 class="text-caption q-mt-sm q-mb-none">Curl example</h5> <h5 class="text-caption q-mt-sm q-mb-none">Curl example</h5>
<code <code
>curl -X GET {{ request.url_root }}api/v1/copilot/&lt;copilot_id&gt; >curl -X GET {{ request.base_url }}api/v1/copilot/&lt;copilot_id&gt;
-H "X-Api-Key: {{ user.wallets[0].inkey }}" -H "X-Api-Key: {{ user.wallets[0].inkey }}"
</code> </code>
</q-card-section> </q-card-section>
@ -110,7 +110,7 @@
<code>[&lt;copilot_object&gt;, ...]</code> <code>[&lt;copilot_object&gt;, ...]</code>
<h5 class="text-caption q-mt-sm q-mb-none">Curl example</h5> <h5 class="text-caption q-mt-sm q-mb-none">Curl example</h5>
<code <code
>curl -X GET {{ request.url_root }}api/v1/copilots -H "X-Api-Key: {{ >curl -X GET {{ request.base_url }}api/v1/copilots -H "X-Api-Key: {{
user.wallets[0].inkey }}" user.wallets[0].inkey }}"
</code> </code>
</q-card-section> </q-card-section>
@ -135,7 +135,7 @@
<code></code> <code></code>
<h5 class="text-caption q-mt-sm q-mb-none">Curl example</h5> <h5 class="text-caption q-mt-sm q-mb-none">Curl example</h5>
<code <code
>curl -X DELETE {{ request.url_root >curl -X DELETE {{ request.base_url
}}api/v1/copilot/&lt;copilot_id&gt; -H "X-Api-Key: {{ }}api/v1/copilot/&lt;copilot_id&gt; -H "X-Api-Key: {{
user.wallets[0].adminkey }}" user.wallets[0].adminkey }}"
</code> </code>
@ -161,7 +161,7 @@
<code></code> <code></code>
<h5 class="text-caption q-mt-sm q-mb-none">Curl example</h5> <h5 class="text-caption q-mt-sm q-mb-none">Curl example</h5>
<code <code
>curl -X GET {{ request.url_root }}/api/v1/copilot/ws/&lt;string, >curl -X GET {{ request.base_url }}/api/v1/copilot/ws/&lt;string,
copilot_id&gt;/&lt;string, comment&gt;/&lt;string, gif name&gt; -H copilot_id&gt;/&lt;string, comment&gt;/&lt;string, gif name&gt; -H
"X-Api-Key: {{ user.wallets[0].adminkey }}" "X-Api-Key: {{ user.wallets[0].adminkey }}"
</code> </code>

View file

@ -7,6 +7,7 @@ from starlette.requests import Request
from lnbits.core.crud import get_user, get_wallet from lnbits.core.crud import get_user, get_wallet
from lnbits.core.services import check_invoice_status, create_invoice from lnbits.core.services import check_invoice_status, create_invoice
from lnbits.core.views.api import api_payment
from lnbits.decorators import WalletTypeInfo, get_key_type from lnbits.decorators import WalletTypeInfo, get_key_type
from lnbits.extensions.events.models import CreateEvent, CreateTicket from lnbits.extensions.events.models import CreateEvent, CreateTicket
@ -43,21 +44,22 @@ async def api_events(
return [event.dict() for event in await get_events(wallet_ids)] return [event.dict() for event in await get_events(wallet_ids)]
@events_ext.post("/api/v1/events") @events_ext.post("/api/v1/events")
@events_ext.put("/api/v1/events/{event_id}") @events_ext.put("/api/v1/events/{event_id}")
async def api_event_create(data: CreateEvent, event_id=None, wallet: WalletTypeInfo = Depends(get_key_type)): async def api_event_create(
data: CreateEvent, event_id=None, wallet: WalletTypeInfo = Depends(get_key_type)
):
if event_id: if event_id:
event = await get_event(event_id) event = await get_event(event_id)
if not event: if not event:
raise HTTPException( raise HTTPException(
status_code=HTTPStatus.NOT_FOUND, status_code=HTTPStatus.NOT_FOUND, detail=f"Event does not exist."
detail=f"Event does not exist."
) )
if event.wallet != wallet.wallet.id: if event.wallet != wallet.wallet.id:
raise HTTPException( raise HTTPException(
status_code=HTTPStatus.FORBIDDEN, status_code=HTTPStatus.FORBIDDEN, detail=f"Not your event."
detail=f"Not your event."
) )
event = await update_event(event_id, **data.dict()) event = await update_event(event_id, **data.dict())
else: else:
@ -70,16 +72,12 @@ async def api_event_create(data: CreateEvent, event_id=None, wallet: WalletTypeI
async def api_form_delete(event_id, wallet: WalletTypeInfo = Depends(get_key_type)): async def api_form_delete(event_id, wallet: WalletTypeInfo = Depends(get_key_type)):
event = await get_event(event_id) event = await get_event(event_id)
if not event: if not event:
raise HTTPException( raise HTTPException(
status_code=HTTPStatus.NOT_FOUND, status_code=HTTPStatus.NOT_FOUND, detail=f"Event does not exist."
detail=f"Event does not exist." )
)
if event.wallet != wallet.wallet.id: if event.wallet != wallet.wallet.id:
raise HTTPException( raise HTTPException(status_code=HTTPStatus.FORBIDDEN, detail=f"Not your event.")
status_code=HTTPStatus.FORBIDDEN,
detail=f"Not your event."
)
await delete_event(event_id) await delete_event(event_id)
await delete_event_tickets(event_id) await delete_event_tickets(event_id)
@ -107,10 +105,9 @@ async def api_tickets(
async def api_ticket_make_ticket(event_id, sats, data: CreateTicket): async def api_ticket_make_ticket(event_id, sats, data: CreateTicket):
event = await get_event(event_id) event = await get_event(event_id)
if not event: if not event:
raise HTTPException( raise HTTPException(
status_code=HTTPStatus.NOT_FOUND, status_code=HTTPStatus.NOT_FOUND, detail=f"Event does not exist."
detail=f"Event does not exist." )
)
try: try:
payment_hash, payment_request = await create_invoice( payment_hash, payment_request = await create_invoice(
wallet_id=event.wallet, wallet_id=event.wallet,
@ -122,14 +119,17 @@ async def api_ticket_make_ticket(event_id, sats, data: CreateTicket):
raise HTTPException(status_code=HTTPStatus.INTERNAL_SERVER_ERROR, detail=str(e)) raise HTTPException(status_code=HTTPStatus.INTERNAL_SERVER_ERROR, detail=str(e))
ticket = await create_ticket( ticket = await create_ticket(
payment_hash=payment_hash, wallet=event.wallet, event=event_id, name=data.name, email=data.email payment_hash=payment_hash,
wallet=event.wallet,
event=event_id,
name=data.name,
email=data.email,
) )
if not ticket: if not ticket:
raise HTTPException( raise HTTPException(
status_code=HTTPStatus.NOT_FOUND, status_code=HTTPStatus.NOT_FOUND, detail=f"Event could not be fetched."
detail=f"Event could not be fetched." )
)
return {"payment_hash": payment_hash, "payment_request": payment_request} return {"payment_hash": payment_hash, "payment_request": payment_request}
@ -139,20 +139,12 @@ async def api_ticket_send_ticket(payment_hash):
ticket = await get_ticket(payment_hash) ticket = await get_ticket(payment_hash)
try: try:
status = await check_invoice_status(ticket.wallet, payment_hash) status = await api_payment(payment_hash)
is_paid = not status.pending if status["paid"]:
await set_ticket_paid(payment_hash=payment_hash)
return {"paid": True, "ticket_id": ticket.id}
except Exception: except Exception:
raise HTTPException(status_code=HTTPStatus.NOT_FOUND, detail="Not paid") raise HTTPException(status_code=HTTPStatus.NOT_FOUND, detail="Not paid")
if is_paid:
wallet = await get_wallet(ticket.wallet)
payment = await wallet.get_payment(payment_hash)
await payment.set_pending(False)
ticket = await set_ticket_paid(payment_hash=payment_hash)
return {"paid": True, "ticket_id": ticket.id}
return {"paid": False} return {"paid": False}
@ -160,33 +152,28 @@ async def api_ticket_send_ticket(payment_hash):
async def api_ticket_delete(ticket_id, wallet: WalletTypeInfo = Depends(get_key_type)): async def api_ticket_delete(ticket_id, wallet: WalletTypeInfo = Depends(get_key_type)):
ticket = await get_ticket(ticket_id) ticket = await get_ticket(ticket_id)
if not ticket: if not ticket:
raise HTTPException( raise HTTPException(
status_code=HTTPStatus.NOT_FOUND, status_code=HTTPStatus.NOT_FOUND, detail=f"Ticket does not exist."
detail=f"Ticket does not exist." )
)
if ticket.wallet != wallet.wallet.id: if ticket.wallet != wallet.wallet.id:
raise HTTPException( raise HTTPException(
status_code=HTTPStatus.FORBIDDEN, status_code=HTTPStatus.FORBIDDEN, detail=f"Not your ticket."
detail=f"Not your ticket."
) )
await delete_ticket(ticket_id) await delete_ticket(ticket_id)
raise HTTPException(status_code=HTTPStatus.NO_CONTENT) raise HTTPException(status_code=HTTPStatus.NO_CONTENT)
# Event Tickets # Event Tickets
@events_ext.get("/api/v1/eventtickets/{wallet_id}/{event_id}") @events_ext.get("/api/v1/eventtickets/{wallet_id}/{event_id}")
async def api_event_tickets(wallet_id, event_id): async def api_event_tickets(wallet_id, event_id):
return [ return [
ticket.dict() ticket.dict()
for ticket in await get_event_tickets( for ticket in await get_event_tickets(wallet_id=wallet_id, event_id=event_id)
wallet_id=wallet_id, event_id=event_id ]
)
]
@events_ext.get("/api/v1/register/ticket/{ticket_id}") @events_ext.get("/api/v1/register/ticket/{ticket_id}")
@ -194,20 +181,17 @@ async def api_event_register_ticket(ticket_id):
ticket = await get_ticket(ticket_id) ticket = await get_ticket(ticket_id)
if not ticket: if not ticket:
raise HTTPException( raise HTTPException(
status_code=HTTPStatus.NOT_FOUND, status_code=HTTPStatus.NOT_FOUND, detail="Ticket does not exist."
detail="Ticket does not exist."
) )
if not ticket.paid: if not ticket.paid:
raise HTTPException( raise HTTPException(
status_code=HTTPStatus.FORBIDDEN, status_code=HTTPStatus.FORBIDDEN, detail="Ticket not paid for."
detail="Ticket not paid for."
) )
if ticket.registered == True: if ticket.registered == True:
raise HTTPException( raise HTTPException(
status_code=HTTPStatus.FORBIDDEN, status_code=HTTPStatus.FORBIDDEN, detail="Ticket already registered"
detail="Ticket already registered"
) )
return [ticket.dict() for ticket in await reg_ticket(ticket_id)] return [ticket.dict() for ticket in await reg_ticket(ticket_id)]

View file

@ -37,7 +37,7 @@
<code>[&lt;jukebox_object&gt;, ...]</code> <code>[&lt;jukebox_object&gt;, ...]</code>
<h5 class="text-caption q-mt-sm q-mb-none">Curl example</h5> <h5 class="text-caption q-mt-sm q-mb-none">Curl example</h5>
<code <code
>curl -X GET {{ request.url_root }}api/v1/jukebox -H "X-Api-Key: {{ >curl -X GET {{ request.base_url }}api/v1/jukebox -H "X-Api-Key: {{
user.wallets[0].adminkey }}" user.wallets[0].adminkey }}"
</code> </code>
</q-card-section> </q-card-section>
@ -59,7 +59,7 @@
<code>&lt;jukebox_object&gt;</code> <code>&lt;jukebox_object&gt;</code>
<h5 class="text-caption q-mt-sm q-mb-none">Curl example</h5> <h5 class="text-caption q-mt-sm q-mb-none">Curl example</h5>
<code <code
>curl -X GET {{ request.url_root }}api/v1/jukebox/&lt;juke_id&gt; -H >curl -X GET {{ request.base_url }}api/v1/jukebox/&lt;juke_id&gt; -H
"X-Api-Key: {{ user.wallets[0].adminkey }}" "X-Api-Key: {{ user.wallets[0].adminkey }}"
</code> </code>
</q-card-section> </q-card-section>
@ -86,7 +86,7 @@
<code>&lt;jukbox_object&gt;</code> <code>&lt;jukbox_object&gt;</code>
<h5 class="text-caption q-mt-sm q-mb-none">Curl example</h5> <h5 class="text-caption q-mt-sm q-mb-none">Curl example</h5>
<code <code
>curl -X POST {{ request.url_root }}api/v1/jukebox/ -d '{"user": >curl -X POST {{ request.base_url }}api/v1/jukebox/ -d '{"user":
&lt;string, user_id&gt;, "title": &lt;string&gt;, &lt;string, user_id&gt;, "title": &lt;string&gt;,
"wallet":&lt;string&gt;, "sp_user": &lt;string, "wallet":&lt;string&gt;, "sp_user": &lt;string,
spotify_user_account&gt;, "sp_secret": &lt;string, spotify_user_account&gt;, "sp_secret": &lt;string,
@ -116,7 +116,7 @@
<code>&lt;jukebox_object&gt;</code> <code>&lt;jukebox_object&gt;</code>
<h5 class="text-caption q-mt-sm q-mb-none">Curl example</h5> <h5 class="text-caption q-mt-sm q-mb-none">Curl example</h5>
<code <code
>curl -X DELETE {{ request.url_root }}api/v1/jukebox/&lt;juke_id&gt; >curl -X DELETE {{ request.base_url }}api/v1/jukebox/&lt;juke_id&gt;
-H "X-Api-Key: {{ user.wallets[0].adminkey }}" -H "X-Api-Key: {{ user.wallets[0].adminkey }}"
</code> </code>
</q-card-section> </q-card-section>

View file

@ -10,6 +10,7 @@ from starlette.exceptions import HTTPException
from starlette.responses import HTMLResponse # type: ignore from starlette.responses import HTMLResponse # type: ignore
from lnbits.core.crud import get_wallet from lnbits.core.crud import get_wallet
from lnbits.core.views.api import api_payment
from lnbits.core.services import check_invoice_status, create_invoice from lnbits.core.services import check_invoice_status, create_invoice
from lnbits.decorators import WalletTypeInfo, get_key_type, require_admin_key from lnbits.decorators import WalletTypeInfo, get_key_type, require_admin_key
@ -95,7 +96,9 @@ async def api_create_update_jukebox(
@jukebox_ext.delete("/api/v1/jukebox/{juke_id}") @jukebox_ext.delete("/api/v1/jukebox/{juke_id}")
async def api_delete_item(juke_id=None, wallet: WalletTypeInfo = Depends(require_admin_key)): async def api_delete_item(
juke_id=None, wallet: WalletTypeInfo = Depends(require_admin_key)
):
await delete_jukebox(juke_id) await delete_jukebox(juke_id)
try: try:
return [{**jukebox} for jukebox in await get_jukeboxs(wallet.wallet.user)] return [{**jukebox} for jukebox in await get_jukeboxs(wallet.wallet.user)]
@ -276,20 +279,17 @@ async def api_get_jukebox_invoice_check(
pay_hash: str = Query(None), juke_id: str = Query(None) pay_hash: str = Query(None), juke_id: str = Query(None)
): ):
try: try:
jukebox = await get_jukebox(juke_id) await get_jukebox(juke_id)
except: except:
raise HTTPException(status_code=HTTPStatus.FORBIDDEN, detail="No jukebox") raise HTTPException(status_code=HTTPStatus.FORBIDDEN, detail="No jukebox")
try: try:
status = await check_invoice_status(jukebox.wallet, pay_hash) status = await api_payment(pay_hash)
is_paid = not status.pending if status["paid"]:
await update_jukebox_payment(pay_hash, paid=True)
return {"paid": True}
except: except:
return {"paid": False} return {"paid": False}
if is_paid:
wallet = await get_wallet(jukebox.wallet)
payment = await wallet.get_payment(pay_hash)
await payment.set_pending(False)
await update_jukebox_payment(pay_hash, paid=True)
return {"paid": True}
return {"paid": False} return {"paid": False}

View file

@ -9,6 +9,7 @@ from starlette.exceptions import HTTPException
from starlette.requests import Request from starlette.requests import Request
from starlette.responses import HTMLResponse, JSONResponse # type: ignore from starlette.responses import HTMLResponse, JSONResponse # type: ignore
from lnbits.core.views.api import api_payment
from lnbits.core.crud import get_user, get_wallet from lnbits.core.crud import get_user, get_wallet
from lnbits.core.services import check_invoice_status, create_invoice from lnbits.core.services import check_invoice_status, create_invoice
from lnbits.decorators import WalletTypeInfo, get_key_type from lnbits.decorators import WalletTypeInfo, get_key_type
@ -169,19 +170,15 @@ async def api_ticket_make_ticket(data: CreateTicketData, form_id):
@lnticket_ext.get("/api/v1/tickets/{payment_hash}", status_code=HTTPStatus.OK) @lnticket_ext.get("/api/v1/tickets/{payment_hash}", status_code=HTTPStatus.OK)
async def api_ticket_send_ticket(payment_hash): async def api_ticket_send_ticket(payment_hash):
ticket = await get_ticket(payment_hash) ticket = await get_ticket(payment_hash)
try: try:
status = await check_invoice_status(ticket.wallet, payment_hash) status = await api_payment(payment_hash)
is_paid = not status.pending if status["paid"]:
await set_ticket_paid(payment_hash=payment_hash)
return {"paid": True}
except Exception: except Exception:
return {"paid": False} return {"paid": False}
if is_paid:
wallet = await get_wallet(ticket.wallet)
payment = await wallet.get_payment(payment_hash)
await payment.set_pending(False)
ticket = await set_ticket_paid(payment_hash=payment_hash)
return {"paid": True}
return {"paid": False} return {"paid": False}

View file

@ -17,7 +17,7 @@
<code>[&lt;pay_link_object&gt;, ...]</code> <code>[&lt;pay_link_object&gt;, ...]</code>
<h5 class="text-caption q-mt-sm q-mb-none">Curl example</h5> <h5 class="text-caption q-mt-sm q-mb-none">Curl example</h5>
<code <code
>curl -X GET {{ request.url_root }}api/v1/links -H "X-Api-Key: {{ >curl -X GET {{ request.base_url }}api/v1/links -H "X-Api-Key: {{
user.wallets[0].inkey }}" user.wallets[0].inkey }}"
</code> </code>
</q-card-section> </q-card-section>
@ -39,7 +39,7 @@
<code>{"lnurl": &lt;string&gt;}</code> <code>{"lnurl": &lt;string&gt;}</code>
<h5 class="text-caption q-mt-sm q-mb-none">Curl example</h5> <h5 class="text-caption q-mt-sm q-mb-none">Curl example</h5>
<code <code
>curl -X GET {{ request.url_root }}api/v1/links/&lt;pay_id&gt; -H >curl -X GET {{ request.base_url }}api/v1/links/&lt;pay_id&gt; -H
"X-Api-Key: {{ user.wallets[0].inkey }}" "X-Api-Key: {{ user.wallets[0].inkey }}"
</code> </code>
</q-card-section> </q-card-section>
@ -68,7 +68,7 @@
<code>{"lnurl": &lt;string&gt;}</code> <code>{"lnurl": &lt;string&gt;}</code>
<h5 class="text-caption q-mt-sm q-mb-none">Curl example</h5> <h5 class="text-caption q-mt-sm q-mb-none">Curl example</h5>
<code <code
>curl -X POST {{ request.url_root }}api/v1/links -d '{"description": >curl -X POST {{ request.base_url }}api/v1/links -d '{"description":
&lt;string&gt;, "amount": &lt;integer&gt;, "max": &lt;integer&gt;, &lt;string&gt;, "amount": &lt;integer&gt;, "max": &lt;integer&gt;,
"min": &lt;integer&gt;, "comment_chars": &lt;integer&gt;}' -H "min": &lt;integer&gt;, "comment_chars": &lt;integer&gt;}' -H
"Content-type: application/json" -H "X-Api-Key: {{ "Content-type: application/json" -H "X-Api-Key: {{
@ -99,7 +99,7 @@
<code>{"lnurl": &lt;string&gt;}</code> <code>{"lnurl": &lt;string&gt;}</code>
<h5 class="text-caption q-mt-sm q-mb-none">Curl example</h5> <h5 class="text-caption q-mt-sm q-mb-none">Curl example</h5>
<code <code
>curl -X PUT {{ request.url_root }}api/v1/links/&lt;pay_id&gt; -d >curl -X PUT {{ request.base_url }}api/v1/links/&lt;pay_id&gt; -d
'{"description": &lt;string&gt;, "amount": &lt;integer&gt;}' -H '{"description": &lt;string&gt;, "amount": &lt;integer&gt;}' -H
"Content-type: application/json" -H "X-Api-Key: {{ "Content-type: application/json" -H "X-Api-Key: {{
user.wallets[0].adminkey }}" user.wallets[0].adminkey }}"
@ -126,7 +126,7 @@
<code></code> <code></code>
<h5 class="text-caption q-mt-sm q-mb-none">Curl example</h5> <h5 class="text-caption q-mt-sm q-mb-none">Curl example</h5>
<code <code
>curl -X DELETE {{ request.url_root }}api/v1/links/&lt;pay_id&gt; -H >curl -X DELETE {{ request.base_url }}api/v1/links/&lt;pay_id&gt; -H
"X-Api-Key: {{ user.wallets[0].adminkey }}" "X-Api-Key: {{ user.wallets[0].adminkey }}"
</code> </code>
</q-card-section> </q-card-section>

View file

@ -39,7 +39,7 @@
<code>[&lt;lnurlpos_object&gt;, ...]</code> <code>[&lt;lnurlpos_object&gt;, ...]</code>
<h5 class="text-caption q-mt-sm q-mb-none">Curl example</h5> <h5 class="text-caption q-mt-sm q-mb-none">Curl example</h5>
<code <code
>curl -X POST {{ request.url_root }}api/v1/lnurlpos -d '{"title": >curl -X POST {{ request.base_url }}api/v1/lnurlpos -d '{"title":
&lt;string&gt;, "message":&lt;string&gt;, "currency": &lt;string&gt;, "message":&lt;string&gt;, "currency":
&lt;integer&gt;}' -H "Content-type: application/json" -H "X-Api-Key: &lt;integer&gt;}' -H "Content-type: application/json" -H "X-Api-Key:
{{user.wallets[0].adminkey }}" {{user.wallets[0].adminkey }}"
@ -70,7 +70,7 @@
<code>[&lt;lnurlpos_object&gt;, ...]</code> <code>[&lt;lnurlpos_object&gt;, ...]</code>
<h5 class="text-caption q-mt-sm q-mb-none">Curl example</h5> <h5 class="text-caption q-mt-sm q-mb-none">Curl example</h5>
<code <code
>curl -X POST {{ request.url_root >curl -X POST {{ request.base_url
}}api/v1/lnurlpos/&lt;lnurlpos_id&gt; -d ''{"title": &lt;string&gt;, }}api/v1/lnurlpos/&lt;lnurlpos_id&gt; -d ''{"title": &lt;string&gt;,
"message":&lt;string&gt;, "currency": &lt;integer&gt;} -H "message":&lt;string&gt;, "currency": &lt;integer&gt;} -H
"Content-type: application/json" -H "X-Api-Key: "Content-type: application/json" -H "X-Api-Key:
@ -98,7 +98,7 @@
<code>[&lt;lnurlpos_object&gt;, ...]</code> <code>[&lt;lnurlpos_object&gt;, ...]</code>
<h5 class="text-caption q-mt-sm q-mb-none">Curl example</h5> <h5 class="text-caption q-mt-sm q-mb-none">Curl example</h5>
<code <code
>curl -X GET {{ request.url_root >curl -X GET {{ request.base_url
}}api/v1/lnurlpos/&lt;lnurlpos_id&gt; -H "X-Api-Key: {{ }}api/v1/lnurlpos/&lt;lnurlpos_id&gt; -H "X-Api-Key: {{
user.wallets[0].inkey }}" user.wallets[0].inkey }}"
</code> </code>
@ -122,7 +122,7 @@
<code>[&lt;lnurlpos_object&gt;, ...]</code> <code>[&lt;lnurlpos_object&gt;, ...]</code>
<h5 class="text-caption q-mt-sm q-mb-none">Curl example</h5> <h5 class="text-caption q-mt-sm q-mb-none">Curl example</h5>
<code <code
>curl -X GET {{ request.url_root }}api/v1/lnurlposs -H "X-Api-Key: >curl -X GET {{ request.base_url }}api/v1/lnurlposs -H "X-Api-Key:
{{ user.wallets[0].inkey }}" {{ user.wallets[0].inkey }}"
</code> </code>
</q-card-section> </q-card-section>
@ -147,7 +147,7 @@
<code></code> <code></code>
<h5 class="text-caption q-mt-sm q-mb-none">Curl example</h5> <h5 class="text-caption q-mt-sm q-mb-none">Curl example</h5>
<code <code
>curl -X DELETE {{ request.url_root >curl -X DELETE {{ request.base_url
}}api/v1/lnurlpos/&lt;lnurlpos_id&gt; -H "X-Api-Key: {{ }}api/v1/lnurlpos/&lt;lnurlpos_id&gt; -H "X-Api-Key: {{
user.wallets[0].adminkey }}" user.wallets[0].adminkey }}"
</code> </code>

View file

@ -9,6 +9,7 @@ from lnbits.core.crud import get_standalone_payment
import hashlib import hashlib
from lnbits.core.services import check_invoice_status from lnbits.core.services import check_invoice_status
from lnbits.core.crud import update_payment_status from lnbits.core.crud import update_payment_status
from lnbits.core.views.api import api_payment
from fastapi import FastAPI, Request from fastapi import FastAPI, Request
from fastapi.templating import Jinja2Templates from fastapi.templating import Jinja2Templates
from starlette.exceptions import HTTPException from starlette.exceptions import HTTPException
@ -44,17 +45,13 @@ async def displaypin(request: Request, paymentid: str = Query(None)):
raise HTTPException( raise HTTPException(
status_code=HTTPStatus.NOT_FOUND, detail="lnurlpos not found." status_code=HTTPStatus.NOT_FOUND, detail="lnurlpos not found."
) )
status = await api_payment(lnurlpospayment.payhash)
status = await check_invoice_status(pos.wallet, lnurlpospayment.payhash) if status["paid"]:
await update_payment_status(checking_id=lnurlpospayment.payhash, pending=True)
is_paid = not status.pending
if not is_paid:
return lnurlpos_renderer().TemplateResponse( return lnurlpos_renderer().TemplateResponse(
"lnurlpos/error.html", "lnurlpos/paid.html", {"request": request, "pin": lnurlpospayment.pin}
{"request": request, "pin": "filler", "not_paid": True},
) )
await update_payment_status(checking_id=lnurlpospayment.payhash, pending=True)
return lnurlpos_renderer().TemplateResponse( return lnurlpos_renderer().TemplateResponse(
"lnurlpos/paid.html", {"request": request, "pin": lnurlpospayment.pin} "lnurlpos/error.html",
{"request": request, "pin": "filler", "not_paid": True},
) )

View file

@ -62,7 +62,7 @@
<h5 class="text-caption q-mt-sm q-mb-none">Returns 201 OK</h5> <h5 class="text-caption q-mt-sm q-mb-none">Returns 201 OK</h5>
<h5 class="text-caption q-mt-sm q-mb-none">Curl example</h5> <h5 class="text-caption q-mt-sm q-mb-none">Curl example</h5>
<code <code
>curl -X GET {{ request.url_root >curl -X GET {{ request.base_url
}}/offlineshop/api/v1/offlineshop/items -H "Content-Type: }}/offlineshop/api/v1/offlineshop/items -H "Content-Type:
application/json" -H "X-Api-Key: {{ user.wallets[0].inkey }}" -d application/json" -H "X-Api-Key: {{ user.wallets[0].inkey }}" -d
'{"name": &lt;string&gt;, "description": &lt;string&gt;, "image": '{"name": &lt;string&gt;, "description": &lt;string&gt;, "image":
@ -96,7 +96,7 @@
> >
<h5 class="text-caption q-mt-sm q-mb-none">Curl example</h5> <h5 class="text-caption q-mt-sm q-mb-none">Curl example</h5>
<code <code
>curl -X GET {{ request.url_root }}/offlineshop/api/v1/offlineshop -H >curl -X GET {{ request.base_url }}/offlineshop/api/v1/offlineshop -H
"X-Api-Key: {{ user.wallets[0].inkey }}" "X-Api-Key: {{ user.wallets[0].inkey }}"
</code> </code>
</q-card-section> </q-card-section>
@ -117,12 +117,12 @@
<h5 class="text-caption q-mt-sm q-mb-none">Returns 200 OK</h5> <h5 class="text-caption q-mt-sm q-mb-none">Returns 200 OK</h5>
<h5 class="text-caption q-mt-sm q-mb-none">Curl example</h5> <h5 class="text-caption q-mt-sm q-mb-none">Curl example</h5>
<code <code
>curl -X GET {{ request.url_root >curl -X GET {{ request.base_url
}}/offlineshop/api/v1/offlineshop/items/&lt;item_id&gt; -H }}/offlineshop/api/v1/offlineshop/items/&lt;item_id&gt; -H
"Content-Type: application/json" -H "X-Api-Key: {{ "Content-Type: application/json" -H "X-Api-Key: {{
user.wallets[0].inkey }}" -d '{"name": &lt;string&gt;, user.wallets[0].inkey }}" -d '{"name": &lt;string&gt;, "description":
"description": &lt;string&gt;, "image": &lt;data-uri string&gt;, &lt;string&gt;, "image": &lt;data-uri string&gt;, "price":
"price": &lt;integer&gt;, "unit": &lt;"sat" or "USD"&gt;}' &lt;integer&gt;, "unit": &lt;"sat" or "USD"&gt;}'
</code> </code>
</q-card-section> </q-card-section>
</q-card> </q-card>
@ -137,7 +137,7 @@
<h5 class="text-caption q-mt-sm q-mb-none">Returns 200 OK</h5> <h5 class="text-caption q-mt-sm q-mb-none">Returns 200 OK</h5>
<h5 class="text-caption q-mt-sm q-mb-none">Curl example</h5> <h5 class="text-caption q-mt-sm q-mb-none">Curl example</h5>
<code <code
>curl -X GET {{ request.url_root >curl -X GET {{ request.base_url
}}/offlineshop/api/v1/offlineshop/items/&lt;item_id&gt; -H "X-Api-Key: }}/offlineshop/api/v1/offlineshop/items/&lt;item_id&gt; -H "X-Api-Key:
{{ user.wallets[0].inkey }}" {{ user.wallets[0].inkey }}"
</code> </code>

View file

@ -17,7 +17,7 @@
<code>[&lt;satsdice_link_object&gt;, ...]</code> <code>[&lt;satsdice_link_object&gt;, ...]</code>
<h5 class="text-caption q-mt-sm q-mb-none">Curl example</h5> <h5 class="text-caption q-mt-sm q-mb-none">Curl example</h5>
<code <code
>curl -X GET {{ request.url_root }}api/v1/links -H "X-Api-Key: {{ >curl -X GET {{ request.base_url }}api/v1/links -H "X-Api-Key: {{
user.wallets[0].inkey }}" user.wallets[0].inkey }}"
</code> </code>
</q-card-section> </q-card-section>
@ -44,7 +44,7 @@
<code>{"lnurl": &lt;string&gt;}</code> <code>{"lnurl": &lt;string&gt;}</code>
<h5 class="text-caption q-mt-sm q-mb-none">Curl example</h5> <h5 class="text-caption q-mt-sm q-mb-none">Curl example</h5>
<code <code
>curl -X GET {{ request.url_root }}api/v1/links/&lt;satsdice_id&gt; -H >curl -X GET {{ request.base_url }}api/v1/links/&lt;satsdice_id&gt; -H
"X-Api-Key: {{ user.wallets[0].inkey }}" "X-Api-Key: {{ user.wallets[0].inkey }}"
</code> </code>
</q-card-section> </q-card-section>
@ -73,7 +73,7 @@
<code>{"lnurl": &lt;string&gt;}</code> <code>{"lnurl": &lt;string&gt;}</code>
<h5 class="text-caption q-mt-sm q-mb-none">Curl example</h5> <h5 class="text-caption q-mt-sm q-mb-none">Curl example</h5>
<code <code
>curl -X POST {{ request.url_root }}api/v1/links -d '{"title": >curl -X POST {{ request.base_url }}api/v1/links -d '{"title":
&lt;string&gt;, "min_satsdiceable": &lt;integer&gt;, &lt;string&gt;, "min_satsdiceable": &lt;integer&gt;,
"max_satsdiceable": &lt;integer&gt;, "uses": &lt;integer&gt;, "max_satsdiceable": &lt;integer&gt;, "uses": &lt;integer&gt;,
"wait_time": &lt;integer&gt;, "is_unique": &lt;boolean&gt;}' -H "wait_time": &lt;integer&gt;, "is_unique": &lt;boolean&gt;}' -H
@ -109,7 +109,7 @@
<code>{"lnurl": &lt;string&gt;}</code> <code>{"lnurl": &lt;string&gt;}</code>
<h5 class="text-caption q-mt-sm q-mb-none">Curl example</h5> <h5 class="text-caption q-mt-sm q-mb-none">Curl example</h5>
<code <code
>curl -X PUT {{ request.url_root }}api/v1/links/&lt;satsdice_id&gt; -d >curl -X PUT {{ request.base_url }}api/v1/links/&lt;satsdice_id&gt; -d
'{"title": &lt;string&gt;, "min_satsdiceable": &lt;integer&gt;, '{"title": &lt;string&gt;, "min_satsdiceable": &lt;integer&gt;,
"max_satsdiceable": &lt;integer&gt;, "uses": &lt;integer&gt;, "max_satsdiceable": &lt;integer&gt;, "uses": &lt;integer&gt;,
"wait_time": &lt;integer&gt;, "is_unique": &lt;boolean&gt;}' -H "wait_time": &lt;integer&gt;, "is_unique": &lt;boolean&gt;}' -H
@ -137,7 +137,7 @@
<code></code> <code></code>
<h5 class="text-caption q-mt-sm q-mb-none">Curl example</h5> <h5 class="text-caption q-mt-sm q-mb-none">Curl example</h5>
<code <code
>curl -X DELETE {{ request.url_root }}api/v1/links/&lt;satsdice_id&gt; >curl -X DELETE {{ request.base_url }}api/v1/links/&lt;satsdice_id&gt;
-H "X-Api-Key: {{ user.wallets[0].adminkey }}" -H "X-Api-Key: {{ user.wallets[0].adminkey }}"
</code> </code>
</q-card-section> </q-card-section>
@ -164,7 +164,7 @@
<code>{"status": &lt;bool&gt;}</code> <code>{"status": &lt;bool&gt;}</code>
<h5 class="text-caption q-mt-sm q-mb-none">Curl example</h5> <h5 class="text-caption q-mt-sm q-mb-none">Curl example</h5>
<code <code
>curl -X GET {{ request.url_root >curl -X GET {{ request.base_url
}}api/v1/links/&lt;the_hash&gt;/&lt;lnurl_id&gt; -H "X-Api-Key: {{ }}api/v1/links/&lt;the_hash&gt;/&lt;lnurl_id&gt; -H "X-Api-Key: {{
user.wallets[0].inkey }}" user.wallets[0].inkey }}"
</code> </code>
@ -186,7 +186,7 @@
> >
<h5 class="text-caption q-mt-sm q-mb-none">Curl example</h5> <h5 class="text-caption q-mt-sm q-mb-none">Curl example</h5>
<code <code
>curl -X GET {{ request.url_root }}/satsdice/img/&lt;lnurl_id&gt;" >curl -X GET {{ request.base_url }}/satsdice/img/&lt;lnurl_id&gt;"
</code> </code>
</q-card-section> </q-card-section>
</q-card> </q-card>

View file

@ -15,6 +15,7 @@ from lnbits.core.crud import (
delete_expired_invoices, delete_expired_invoices,
get_balance_checks, get_balance_checks,
) )
from lnbits.core.views.api import api_payment
from lnbits.core.services import check_invoice_status from lnbits.core.services import check_invoice_status
from fastapi import FastAPI, Request from fastapi import FastAPI, Request
from fastapi.params import Depends from fastapi.params import Depends
@ -62,9 +63,7 @@ async def displaywin(
HTTPStatus.NOT_FOUND, "satsdice link does not exist." HTTPStatus.NOT_FOUND, "satsdice link does not exist."
) )
status = await check_invoice_status( await api_payment(payment_hash)
wallet_id=satsdicelink.wallet, payment_hash=payment_hash
)
withdrawLink = await get_satsdice_withdraw(payment_hash) withdrawLink = await get_satsdice_withdraw(payment_hash)
if withdrawLink: if withdrawLink:
@ -86,7 +85,7 @@ async def displaywin(
) )
if payment.pending == 1: if payment.pending == 1:
await check_invoice_status(payment.wallet_id, payment_hash) await api_payment(payment_hash)
payment = await get_standalone_payment(payment_hash) or abort( payment = await get_standalone_payment(payment_hash) or abort(
HTTPStatus.NOT_FOUND, "satsdice link does not exist." HTTPStatus.NOT_FOUND, "satsdice link does not exist."
) )

View file

@ -9,7 +9,7 @@ from lnbits.helpers import urlsafe_short_hash
import httpx import httpx
from lnbits.core.services import create_invoice, check_invoice_status from lnbits.core.services import create_invoice, check_invoice_status
from ..watchonly.crud import get_watch_wallet, get_fresh_address, get_mempool from ..watchonly.crud import get_watch_wallet, get_fresh_address, get_mempool
from lnbits.core.views.api import api_payment
###############CHARGES########################## ###############CHARGES##########################
@ -110,10 +110,9 @@ async def check_address_balance(charge_id: str) -> List[Charges]:
except Exception: except Exception:
pass pass
if charge.lnbitswallet: if charge.lnbitswallet:
invoice_status = await check_invoice_status( invoice_status = await api_payment(charge.payment_hash)
charge.lnbitswallet, charge.payment_hash
) if invoice_status["paid"]:
if invoice_status.paid:
return await update_charge(charge_id=charge_id, balance=charge.amount) return await update_charge(charge_id=charge_id, balance=charge.amount)
row = await db.fetchone("SELECT * FROM satspay.charges WHERE id = ?", (charge_id,)) row = await db.fetchone("SELECT * FROM satspay.charges WHERE id = ?", (charge_id,))
return Charges.from_row(row) if row else None return Charges.from_row(row) if row else None

View file

@ -32,7 +32,7 @@
<code>[&lt;charge_object&gt;, ...]</code> <code>[&lt;charge_object&gt;, ...]</code>
<h5 class="text-caption q-mt-sm q-mb-none">Curl example</h5> <h5 class="text-caption q-mt-sm q-mb-none">Curl example</h5>
<code <code
>curl -X POST {{ request.url_root }}api/v1/charge -d >curl -X POST {{ request.base_url }}api/v1/charge -d
'{"onchainwallet": &lt;string, watchonly_wallet_id&gt;, '{"onchainwallet": &lt;string, watchonly_wallet_id&gt;,
"description": &lt;string&gt;, "webhook":&lt;string&gt;, "time": "description": &lt;string&gt;, "webhook":&lt;string&gt;, "time":
&lt;integer&gt;, "amount": &lt;integer&gt;, "lnbitswallet": &lt;integer&gt;, "amount": &lt;integer&gt;, "lnbitswallet":
@ -60,7 +60,7 @@
<code>[&lt;charge_object&gt;, ...]</code> <code>[&lt;charge_object&gt;, ...]</code>
<h5 class="text-caption q-mt-sm q-mb-none">Curl example</h5> <h5 class="text-caption q-mt-sm q-mb-none">Curl example</h5>
<code <code
>curl -X POST {{ request.url_root }}api/v1/charge/&lt;charge_id&gt; >curl -X POST {{ request.base_url }}api/v1/charge/&lt;charge_id&gt;
-d '{"onchainwallet": &lt;string, watchonly_wallet_id&gt;, -d '{"onchainwallet": &lt;string, watchonly_wallet_id&gt;,
"description": &lt;string&gt;, "webhook":&lt;string&gt;, "time": "description": &lt;string&gt;, "webhook":&lt;string&gt;, "time":
&lt;integer&gt;, "amount": &lt;integer&gt;, "lnbitswallet": &lt;integer&gt;, "amount": &lt;integer&gt;, "lnbitswallet":
@ -89,7 +89,7 @@
<code>[&lt;charge_object&gt;, ...]</code> <code>[&lt;charge_object&gt;, ...]</code>
<h5 class="text-caption q-mt-sm q-mb-none">Curl example</h5> <h5 class="text-caption q-mt-sm q-mb-none">Curl example</h5>
<code <code
>curl -X GET {{ request.url_root }}api/v1/charge/&lt;charge_id&gt; >curl -X GET {{ request.base_url }}api/v1/charge/&lt;charge_id&gt;
-H "X-Api-Key: {{ user.wallets[0].inkey }}" -H "X-Api-Key: {{ user.wallets[0].inkey }}"
</code> </code>
</q-card-section> </q-card-section>
@ -112,7 +112,7 @@
<code>[&lt;charge_object&gt;, ...]</code> <code>[&lt;charge_object&gt;, ...]</code>
<h5 class="text-caption q-mt-sm q-mb-none">Curl example</h5> <h5 class="text-caption q-mt-sm q-mb-none">Curl example</h5>
<code <code
>curl -X GET {{ request.url_root }}api/v1/charges -H "X-Api-Key: {{ >curl -X GET {{ request.base_url }}api/v1/charges -H "X-Api-Key: {{
user.wallets[0].inkey }}" user.wallets[0].inkey }}"
</code> </code>
</q-card-section> </q-card-section>
@ -137,7 +137,7 @@
<code></code> <code></code>
<h5 class="text-caption q-mt-sm q-mb-none">Curl example</h5> <h5 class="text-caption q-mt-sm q-mb-none">Curl example</h5>
<code <code
>curl -X DELETE {{ request.url_root >curl -X DELETE {{ request.base_url
}}api/v1/charge/&lt;charge_id&gt; -H "X-Api-Key: {{ }}api/v1/charge/&lt;charge_id&gt; -H "X-Api-Key: {{
user.wallets[0].adminkey }}" user.wallets[0].adminkey }}"
</code> </code>
@ -160,7 +160,7 @@
<code>[&lt;charge_object&gt;, ...]</code> <code>[&lt;charge_object&gt;, ...]</code>
<h5 class="text-caption q-mt-sm q-mb-none">Curl example</h5> <h5 class="text-caption q-mt-sm q-mb-none">Curl example</h5>
<code <code
>curl -X GET {{ request.url_root >curl -X GET {{ request.base_url
}}api/v1/charges/balance/&lt;charge_id&gt; -H "X-Api-Key: {{ }}api/v1/charges/balance/&lt;charge_id&gt; -H "X-Api-Key: {{
user.wallets[0].inkey }}" user.wallets[0].inkey }}"
</code> </code>

View file

@ -7,7 +7,7 @@ from starlette.exceptions import HTTPException
from lnbits.decorators import WalletTypeInfo, get_key_type, require_admin_key from lnbits.decorators import WalletTypeInfo, get_key_type, require_admin_key
from lnbits.extensions.satspay import satspay_ext from lnbits.extensions.satspay import satspay_ext
from lnbits.core.views.api import api_payment
from .crud import ( from .crud import (
check_address_balance, check_address_balance,
create_charge, create_charge,
@ -24,7 +24,9 @@ from .models import CreateCharge
@satspay_ext.post("/api/v1/charge") @satspay_ext.post("/api/v1/charge")
@satspay_ext.put("/api/v1/charge/{charge_id}") @satspay_ext.put("/api/v1/charge/{charge_id}")
async def api_charge_create_or_update( async def api_charge_create_or_update(
data: CreateCharge, wallet: WalletTypeInfo = Depends(require_admin_key), charge_id=None data: CreateCharge,
wallet: WalletTypeInfo = Depends(require_admin_key),
charge_id=None,
): ):
if not charge_id: if not charge_id:
charge = await create_charge(user=wallet.wallet.user, data=data) charge = await create_charge(user=wallet.wallet.user, data=data)

View file

@ -52,7 +52,7 @@
> >
<h5 class="text-caption q-mt-sm q-mb-none">Curl example</h5> <h5 class="text-caption q-mt-sm q-mb-none">Curl example</h5>
<code <code
>curl -X GET {{ request.url_root }}api/v1/livestream -H "X-Api-Key: {{ >curl -X GET {{ request.base_url }}api/v1/livestream -H "X-Api-Key: {{
user.wallets[0].inkey }}" user.wallets[0].inkey }}"
</code> </code>
</q-card-section> </q-card-section>
@ -78,7 +78,7 @@
</h5> </h5>
<h5 class="text-caption q-mt-sm q-mb-none">Curl example</h5> <h5 class="text-caption q-mt-sm q-mb-none">Curl example</h5>
<code <code
>curl -X PUT {{ request.url_root }}api/v1/splitpayments/targets -H >curl -X PUT {{ request.base_url }}api/v1/splitpayments/targets -H
"X-Api-Key: {{ user.wallets[0].adminkey }}" -H 'Content-Type: "X-Api-Key: {{ user.wallets[0].adminkey }}" -H 'Content-Type:
application/json' -d '{"targets": [{"wallet": &lt;wallet id or invoice application/json' -d '{"targets": [{"wallet": &lt;wallet id or invoice
key&gt;, "alias": &lt;name to identify this&gt;, "percent": &lt;number key&gt;, "alias": &lt;name to identify this&gt;, "percent": &lt;number

View file

@ -17,7 +17,7 @@
<code>[&lt;tpos_object&gt;, ...]</code> <code>[&lt;tpos_object&gt;, ...]</code>
<h5 class="text-caption q-mt-sm q-mb-none">Curl example</h5> <h5 class="text-caption q-mt-sm q-mb-none">Curl example</h5>
<code <code
>curl -X GET {{ request.url_root }}api/v1/tposs -H "X-Api-Key: >curl -X GET {{ request.base_url }}api/v1/tposs -H "X-Api-Key:
&lt;invoice_key&gt;" &lt;invoice_key&gt;"
</code> </code>
</q-card-section> </q-card-section>
@ -42,7 +42,7 @@
> >
<h5 class="text-caption q-mt-sm q-mb-none">Curl example</h5> <h5 class="text-caption q-mt-sm q-mb-none">Curl example</h5>
<code <code
>curl -X POST {{ request.url_root }}api/v1/tposs -d '{"name": >curl -X POST {{ request.base_url }}api/v1/tposs -d '{"name":
&lt;string&gt;, "currency": &lt;string&gt;}' -H "Content-type: &lt;string&gt;, "currency": &lt;string&gt;}' -H "Content-type:
application/json" -H "X-Api-Key: &lt;admin_key&gt;" application/json" -H "X-Api-Key: &lt;admin_key&gt;"
</code> </code>
@ -69,7 +69,7 @@
<code></code> <code></code>
<h5 class="text-caption q-mt-sm q-mb-none">Curl example</h5> <h5 class="text-caption q-mt-sm q-mb-none">Curl example</h5>
<code <code
>curl -X DELETE {{ request.url_root }}api/v1/tposs/&lt;tpos_id&gt; -H >curl -X DELETE {{ request.base_url }}api/v1/tposs/&lt;tpos_id&gt; -H
"X-Api-Key: &lt;admin_key&gt;" "X-Api-Key: &lt;admin_key&gt;"
</code> </code>
</q-card-section> </q-card-section>

View file

@ -29,6 +29,7 @@ async def tpos(request: Request, tpos_id):
raise HTTPException( raise HTTPException(
status_code=HTTPStatus.NOT_FOUND, detail="TPoS does not exist." status_code=HTTPStatus.NOT_FOUND, detail="TPoS does not exist."
) )
print(request.base_url)
return tpos_renderer().TemplateResponse( return tpos_renderer().TemplateResponse(
"tpos/tpos.html", {"request": request, "tpos": tpos} "tpos/tpos.html", {"request": request, "tpos": tpos}

View file

@ -7,7 +7,8 @@ from starlette.exceptions import HTTPException
from lnbits.core.crud import get_user, get_wallet from lnbits.core.crud import get_user, get_wallet
from lnbits.core.services import check_invoice_status, create_invoice from lnbits.core.services import check_invoice_status, create_invoice
from lnbits.decorators import WalletTypeInfo, get_key_type, require_admin_key from lnbits.decorators import WalletTypeInfo, get_key_type, require_admin_key
from lnbits.core.views.api import api_payment
from lnbits.core.models import Wallet
from . import tpos_ext from . import tpos_ext
from .crud import create_tpos, delete_tpos, get_tpos, get_tposs from .crud import create_tpos, delete_tpos, get_tpos, get_tposs
from .models import CreateTposData from .models import CreateTposData
@ -33,7 +34,9 @@ async def api_tpos_create(
@tpos_ext.delete("/api/v1/tposs/{tpos_id}") @tpos_ext.delete("/api/v1/tposs/{tpos_id}")
async def api_tpos_delete(tpos_id: str, wallet: WalletTypeInfo = Depends(require_admin_key)): async def api_tpos_delete(
tpos_id: str, wallet: WalletTypeInfo = Depends(require_admin_key)
):
tpos = await get_tpos(tpos_id) tpos = await get_tpos(tpos_id)
if not tpos: if not tpos:
@ -84,20 +87,9 @@ async def api_tpos_check_invoice(tpos_id: str, payment_hash: str):
raise HTTPException( raise HTTPException(
status_code=HTTPStatus.NOT_FOUND, detail="TPoS does not exist." status_code=HTTPStatus.NOT_FOUND, detail="TPoS does not exist."
) )
# return {"message": "TPoS does not exist."}, HTTPStatus.NOT_FOUND
try: try:
status = await check_invoice_status(tpos.wallet, payment_hash) status = await api_payment(payment_hash)
is_paid = not status.pending
except Exception as exc: except Exception as exc:
print(exc) print(exc)
return {"paid": False} return {"paid": False}
return status
if is_paid:
wallet = await get_wallet(tpos.wallet)
payment = await wallet.get_payment(payment_hash)
await payment.set_pending(False)
return {"paid": True}
return {"paid": False}

View file

@ -42,7 +42,7 @@
<code>JSON list of users</code> <code>JSON list of users</code>
<h5 class="text-caption q-mt-sm q-mb-none">Curl example</h5> <h5 class="text-caption q-mt-sm q-mb-none">Curl example</h5>
<code <code
>curl -X GET {{ request.url_root }}usermanager/api/v1/users -H >curl -X GET {{ request.base_url }}usermanager/api/v1/users -H
"X-Api-Key: {{ user.wallets[0].inkey }}" "X-Api-Key: {{ user.wallets[0].inkey }}"
</code> </code>
</q-card-section> </q-card-section>
@ -62,7 +62,7 @@
<code>JSON list of users</code> <code>JSON list of users</code>
<h5 class="text-caption q-mt-sm q-mb-none">Curl example</h5> <h5 class="text-caption q-mt-sm q-mb-none">Curl example</h5>
<code <code
>curl -X GET {{ request.url_root >curl -X GET {{ request.base_url
}}usermanager/api/v1/users/&lt;user_id&gt; -H "X-Api-Key: {{ }}usermanager/api/v1/users/&lt;user_id&gt; -H "X-Api-Key: {{
user.wallets[0].inkey }}" user.wallets[0].inkey }}"
</code> </code>
@ -85,7 +85,7 @@
<code>JSON wallet data</code> <code>JSON wallet data</code>
<h5 class="text-caption q-mt-sm q-mb-none">Curl example</h5> <h5 class="text-caption q-mt-sm q-mb-none">Curl example</h5>
<code <code
>curl -X GET {{ request.url_root >curl -X GET {{ request.base_url
}}usermanager/api/v1/wallets/&lt;user_id&gt; -H "X-Api-Key: {{ }}usermanager/api/v1/wallets/&lt;user_id&gt; -H "X-Api-Key: {{
user.wallets[0].inkey }}" user.wallets[0].inkey }}"
</code> </code>
@ -108,7 +108,7 @@
<code>JSON a wallets transactions</code> <code>JSON a wallets transactions</code>
<h5 class="text-caption q-mt-sm q-mb-none">Curl example</h5> <h5 class="text-caption q-mt-sm q-mb-none">Curl example</h5>
<code <code
>curl -X GET {{ request.url_root >curl -X GET {{ request.base_url
}}usermanager/api/v1/wallets&lt;wallet_id&gt; -H "X-Api-Key: {{ }}usermanager/api/v1/wallets&lt;wallet_id&gt; -H "X-Api-Key: {{
user.wallets[0].inkey }}" user.wallets[0].inkey }}"
</code> </code>
@ -150,7 +150,7 @@
> >
<h5 class="text-caption q-mt-sm q-mb-none">Curl example</h5> <h5 class="text-caption q-mt-sm q-mb-none">Curl example</h5>
<code <code
>curl -X POST {{ request.url_root }}usermanager/api/v1/users -d >curl -X POST {{ request.base_url }}usermanager/api/v1/users -d
'{"admin_id": "{{ user.id }}", "wallet_name": &lt;string&gt;, '{"admin_id": "{{ user.id }}", "wallet_name": &lt;string&gt;,
"user_name": &lt;string&gt;, "email": &lt;Optional string&gt;, "user_name": &lt;string&gt;, "email": &lt;Optional string&gt;,
"password": &lt; Optional string&gt;}' -H "X-Api-Key: {{ "password": &lt; Optional string&gt;}' -H "X-Api-Key: {{
@ -188,7 +188,7 @@
> >
<h5 class="text-caption q-mt-sm q-mb-none">Curl example</h5> <h5 class="text-caption q-mt-sm q-mb-none">Curl example</h5>
<code <code
>curl -X POST {{ request.url_root }}usermanager/api/v1/wallets -d >curl -X POST {{ request.base_url }}usermanager/api/v1/wallets -d
'{"user_id": &lt;string&gt;, "wallet_name": &lt;string&gt;, '{"user_id": &lt;string&gt;, "wallet_name": &lt;string&gt;,
"admin_id": "{{ user.id }}"}' -H "X-Api-Key: {{ user.wallets[0].inkey "admin_id": "{{ user.id }}"}' -H "X-Api-Key: {{ user.wallets[0].inkey
}}" -H "Content-type: application/json" }}" -H "Content-type: application/json"
@ -212,7 +212,7 @@
<code>{"X-Api-Key": &lt;string&gt;}</code> <code>{"X-Api-Key": &lt;string&gt;}</code>
<h5 class="text-caption q-mt-sm q-mb-none">Curl example</h5> <h5 class="text-caption q-mt-sm q-mb-none">Curl example</h5>
<code <code
>curl -X DELETE {{ request.url_root >curl -X DELETE {{ request.base_url
}}usermanager/api/v1/users/&lt;user_id&gt; -H "X-Api-Key: {{ }}usermanager/api/v1/users/&lt;user_id&gt; -H "X-Api-Key: {{
user.wallets[0].inkey }}" user.wallets[0].inkey }}"
</code> </code>
@ -230,7 +230,7 @@
<code>{"X-Api-Key": &lt;string&gt;}</code> <code>{"X-Api-Key": &lt;string&gt;}</code>
<h5 class="text-caption q-mt-sm q-mb-none">Curl example</h5> <h5 class="text-caption q-mt-sm q-mb-none">Curl example</h5>
<code <code
>curl -X DELETE {{ request.url_root >curl -X DELETE {{ request.base_url
}}usermanager/api/v1/wallets/&lt;wallet_id&gt; -H "X-Api-Key: {{ }}usermanager/api/v1/wallets/&lt;wallet_id&gt; -H "X-Api-Key: {{
user.wallets[0].inkey }}" user.wallets[0].inkey }}"
</code> </code>
@ -253,7 +253,7 @@
<code>{"X-Api-Key": &lt;string&gt;}</code> <code>{"X-Api-Key": &lt;string&gt;}</code>
<h5 class="text-caption q-mt-sm q-mb-none">Curl example</h5> <h5 class="text-caption q-mt-sm q-mb-none">Curl example</h5>
<code <code
>curl -X POST {{ request.url_root }}usermanager/api/v1/extensions -d >curl -X POST {{ request.base_url }}usermanager/api/v1/extensions -d
'{"userid": &lt;string&gt;, "extension": &lt;string&gt;, "active": '{"userid": &lt;string&gt;, "extension": &lt;string&gt;, "active":
&lt;integer&gt;}' -H "X-Api-Key: {{ user.wallets[0].inkey }}" -H &lt;integer&gt;}' -H "X-Api-Key: {{ user.wallets[0].inkey }}" -H
"Content-type: application/json" "Content-type: application/json"

View file

@ -37,7 +37,7 @@
<code>[&lt;wallets_object&gt;, ...]</code> <code>[&lt;wallets_object&gt;, ...]</code>
<h5 class="text-caption q-mt-sm q-mb-none">Curl example</h5> <h5 class="text-caption q-mt-sm q-mb-none">Curl example</h5>
<code <code
>curl -X GET {{ request.url_root }}api/v1/wallet -H "X-Api-Key: {{ >curl -X GET {{ request.base_url }}api/v1/wallet -H "X-Api-Key: {{
user.wallets[0].inkey }}" user.wallets[0].inkey }}"
</code> </code>
</q-card-section> </q-card-section>
@ -66,7 +66,7 @@
<code>[&lt;wallet_object&gt;, ...]</code> <code>[&lt;wallet_object&gt;, ...]</code>
<h5 class="text-caption q-mt-sm q-mb-none">Curl example</h5> <h5 class="text-caption q-mt-sm q-mb-none">Curl example</h5>
<code <code
>curl -X GET {{ request.url_root }}api/v1/wallet/&lt;wallet_id&gt; >curl -X GET {{ request.base_url }}api/v1/wallet/&lt;wallet_id&gt;
-H "X-Api-Key: {{ user.wallets[0].inkey }}" -H "X-Api-Key: {{ user.wallets[0].inkey }}"
</code> </code>
</q-card-section> </q-card-section>
@ -89,7 +89,7 @@
<code>[&lt;wallet_object&gt;, ...]</code> <code>[&lt;wallet_object&gt;, ...]</code>
<h5 class="text-caption q-mt-sm q-mb-none">Curl example</h5> <h5 class="text-caption q-mt-sm q-mb-none">Curl example</h5>
<code <code
>curl -X POST {{ request.url_root }}api/v1/wallet -d '{"title": >curl -X POST {{ request.base_url }}api/v1/wallet -d '{"title":
&lt;string&gt;, "masterpub": &lt;string&gt;}' -H "Content-type: &lt;string&gt;, "masterpub": &lt;string&gt;}' -H "Content-type:
application/json" -H "X-Api-Key: {{ user.wallets[0].adminkey }}" application/json" -H "X-Api-Key: {{ user.wallets[0].adminkey }}"
</code> </code>
@ -115,7 +115,7 @@
<code></code> <code></code>
<h5 class="text-caption q-mt-sm q-mb-none">Curl example</h5> <h5 class="text-caption q-mt-sm q-mb-none">Curl example</h5>
<code <code
>curl -X DELETE {{ request.url_root >curl -X DELETE {{ request.base_url
}}api/v1/wallet/&lt;wallet_id&gt; -H "X-Api-Key: {{ }}api/v1/wallet/&lt;wallet_id&gt; -H "X-Api-Key: {{
user.wallets[0].adminkey }}" user.wallets[0].adminkey }}"
</code> </code>
@ -141,7 +141,7 @@
<code>[&lt;address_object&gt;, ...]</code> <code>[&lt;address_object&gt;, ...]</code>
<h5 class="text-caption q-mt-sm q-mb-none">Curl example</h5> <h5 class="text-caption q-mt-sm q-mb-none">Curl example</h5>
<code <code
>curl -X GET {{ request.url_root >curl -X GET {{ request.base_url
}}api/v1/addresses/&lt;wallet_id&gt; -H "X-Api-Key: {{ }}api/v1/addresses/&lt;wallet_id&gt; -H "X-Api-Key: {{
user.wallets[0].inkey }}" user.wallets[0].inkey }}"
</code> </code>
@ -173,7 +173,7 @@
<code>[&lt;address_object&gt;, ...]</code> <code>[&lt;address_object&gt;, ...]</code>
<h5 class="text-caption q-mt-sm q-mb-none">Curl example</h5> <h5 class="text-caption q-mt-sm q-mb-none">Curl example</h5>
<code <code
>curl -X GET {{ request.url_root }}api/v1/address/&lt;wallet_id&gt; >curl -X GET {{ request.base_url }}api/v1/address/&lt;wallet_id&gt;
-H "X-Api-Key: {{ user.wallets[0].inkey }}" -H "X-Api-Key: {{ user.wallets[0].inkey }}"
</code> </code>
</q-card-section> </q-card-section>
@ -202,7 +202,7 @@
<code>[&lt;mempool_object&gt;, ...]</code> <code>[&lt;mempool_object&gt;, ...]</code>
<h5 class="text-caption q-mt-sm q-mb-none">Curl example</h5> <h5 class="text-caption q-mt-sm q-mb-none">Curl example</h5>
<code <code
>curl -X GET {{ request.url_root }}api/v1/mempool -H "X-Api-Key: {{ >curl -X GET {{ request.base_url }}api/v1/mempool -H "X-Api-Key: {{
user.wallets[0].adminkey }}" user.wallets[0].adminkey }}"
</code> </code>
</q-card-section> </q-card-section>
@ -233,7 +233,7 @@
<code>[&lt;mempool_object&gt;, ...]</code> <code>[&lt;mempool_object&gt;, ...]</code>
<h5 class="text-caption q-mt-sm q-mb-none">Curl example</h5> <h5 class="text-caption q-mt-sm q-mb-none">Curl example</h5>
<code <code
>curl -X PUT {{ request.url_root }}api/v1/mempool -d '{"endpoint": >curl -X PUT {{ request.base_url }}api/v1/mempool -d '{"endpoint":
&lt;string&gt;}' -H "Content-type: application/json" -H "X-Api-Key: &lt;string&gt;}' -H "Content-type: application/json" -H "X-Api-Key:
{{ user.wallets[0].adminkey }}" {{ user.wallets[0].adminkey }}"
</code> </code>

View file

@ -22,7 +22,7 @@
<code>[&lt;withdraw_link_object&gt;, ...]</code> <code>[&lt;withdraw_link_object&gt;, ...]</code>
<h5 class="text-caption q-mt-sm q-mb-none">Curl example</h5> <h5 class="text-caption q-mt-sm q-mb-none">Curl example</h5>
<code <code
>curl -X GET {{ request.url_root }}api/v1/links -H "X-Api-Key: {{ >curl -X GET {{ request.base_url }}api/v1/links -H "X-Api-Key: {{
user.wallets[0].inkey }}" user.wallets[0].inkey }}"
</code> </code>
</q-card-section> </q-card-section>
@ -49,7 +49,7 @@
<code>{"lnurl": &lt;string&gt;}</code> <code>{"lnurl": &lt;string&gt;}</code>
<h5 class="text-caption q-mt-sm q-mb-none">Curl example</h5> <h5 class="text-caption q-mt-sm q-mb-none">Curl example</h5>
<code <code
>curl -X GET {{ request.url_root }}api/v1/links/&lt;withdraw_id&gt; -H >curl -X GET {{ request.base_url }}api/v1/links/&lt;withdraw_id&gt; -H
"X-Api-Key: {{ user.wallets[0].inkey }}" "X-Api-Key: {{ user.wallets[0].inkey }}"
</code> </code>
</q-card-section> </q-card-section>
@ -78,7 +78,7 @@
<code>{"lnurl": &lt;string&gt;}</code> <code>{"lnurl": &lt;string&gt;}</code>
<h5 class="text-caption q-mt-sm q-mb-none">Curl example</h5> <h5 class="text-caption q-mt-sm q-mb-none">Curl example</h5>
<code <code
>curl -X POST {{ request.url_root }}api/v1/links -d '{"title": >curl -X POST {{ request.base_url }}api/v1/links -d '{"title":
&lt;string&gt;, "min_withdrawable": &lt;integer&gt;, &lt;string&gt;, "min_withdrawable": &lt;integer&gt;,
"max_withdrawable": &lt;integer&gt;, "uses": &lt;integer&gt;, "max_withdrawable": &lt;integer&gt;, "uses": &lt;integer&gt;,
"wait_time": &lt;integer&gt;, "is_unique": &lt;boolean&gt;}' -H "wait_time": &lt;integer&gt;, "is_unique": &lt;boolean&gt;}' -H
@ -114,7 +114,7 @@
<code>{"lnurl": &lt;string&gt;}</code> <code>{"lnurl": &lt;string&gt;}</code>
<h5 class="text-caption q-mt-sm q-mb-none">Curl example</h5> <h5 class="text-caption q-mt-sm q-mb-none">Curl example</h5>
<code <code
>curl -X PUT {{ request.url_root }}api/v1/links/&lt;withdraw_id&gt; -d >curl -X PUT {{ request.base_url }}api/v1/links/&lt;withdraw_id&gt; -d
'{"title": &lt;string&gt;, "min_withdrawable": &lt;integer&gt;, '{"title": &lt;string&gt;, "min_withdrawable": &lt;integer&gt;,
"max_withdrawable": &lt;integer&gt;, "uses": &lt;integer&gt;, "max_withdrawable": &lt;integer&gt;, "uses": &lt;integer&gt;,
"wait_time": &lt;integer&gt;, "is_unique": &lt;boolean&gt;}' -H "wait_time": &lt;integer&gt;, "is_unique": &lt;boolean&gt;}' -H
@ -142,7 +142,7 @@
<code></code> <code></code>
<h5 class="text-caption q-mt-sm q-mb-none">Curl example</h5> <h5 class="text-caption q-mt-sm q-mb-none">Curl example</h5>
<code <code
>curl -X DELETE {{ request.url_root }}api/v1/links/&lt;withdraw_id&gt; >curl -X DELETE {{ request.base_url }}api/v1/links/&lt;withdraw_id&gt;
-H "X-Api-Key: {{ user.wallets[0].adminkey }}" -H "X-Api-Key: {{ user.wallets[0].adminkey }}"
</code> </code>
</q-card-section> </q-card-section>
@ -169,7 +169,7 @@
<code>{"status": &lt;bool&gt;}</code> <code>{"status": &lt;bool&gt;}</code>
<h5 class="text-caption q-mt-sm q-mb-none">Curl example</h5> <h5 class="text-caption q-mt-sm q-mb-none">Curl example</h5>
<code <code
>curl -X GET {{ request.url_root >curl -X GET {{ request.base_url
}}api/v1/links/&lt;the_hash&gt;/&lt;lnurl_id&gt; -H "X-Api-Key: {{ }}api/v1/links/&lt;the_hash&gt;/&lt;lnurl_id&gt; -H "X-Api-Key: {{
user.wallets[0].inkey }}" user.wallets[0].inkey }}"
</code> </code>
@ -191,7 +191,7 @@
> >
<h5 class="text-caption q-mt-sm q-mb-none">Curl example</h5> <h5 class="text-caption q-mt-sm q-mb-none">Curl example</h5>
<code <code
>curl -X GET {{ request.url_root }}/withdraw/img/&lt;lnurl_id&gt;" >curl -X GET {{ request.base_url }}/withdraw/img/&lt;lnurl_id&gt;"
</code> </code>
</q-card-section> </q-card-section>
</q-card> </q-card>