FIX: generate LNURL server-side for unique voucher links (#68)
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
parent
68ff753cfd
commit
8a20df70fe
5 changed files with 19 additions and 3 deletions
|
|
@ -47,6 +47,11 @@ class WithdrawLink(BaseModel):
|
||||||
"Example: lnurlw://${window.location.hostname}/lnurlw/${id}"
|
"Example: lnurlw://${window.location.hostname}/lnurlw/${id}"
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
|
lnurl_url: str | None = Field(
|
||||||
|
default=None,
|
||||||
|
no_database=True,
|
||||||
|
description="The raw LNURL callback URL (use for QR code generation)",
|
||||||
|
)
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def is_spent(self) -> bool:
|
def is_spent(self) -> bool:
|
||||||
|
|
|
||||||
|
|
@ -138,7 +138,7 @@ window.app = Vue.createApp({
|
||||||
const link = _.findWhere(this.withdrawLinks, {id: linkId})
|
const link = _.findWhere(this.withdrawLinks, {id: linkId})
|
||||||
this.qrCodeDialog.data = _.clone(link)
|
this.qrCodeDialog.data = _.clone(link)
|
||||||
this.qrCodeDialog.show = true
|
this.qrCodeDialog.show = true
|
||||||
this.activeUrl = `${window.location.origin}/withdraw/api/v1/lnurl/${link.unique_hash}`
|
this.activeUrl = link.lnurl_url
|
||||||
},
|
},
|
||||||
openUpdateDialog(linkId) {
|
openUpdateDialog(linkId) {
|
||||||
let link = _.findWhere(this.withdrawLinks, {id: linkId})
|
let link = _.findWhere(this.withdrawLinks, {id: linkId})
|
||||||
|
|
|
||||||
|
|
@ -55,7 +55,7 @@
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
spent: {{ 'true' if spent else 'false' }},
|
spent: {{ 'true' if spent else 'false' }},
|
||||||
url: `${window.location.origin}/withdraw/api/v1/lnurl/{{ unique_hash }}`,
|
url: '{{ lnurl_url }}',
|
||||||
lnurl: '',
|
lnurl: '',
|
||||||
nfcTagWriting: false
|
nfcTagWriting: false
|
||||||
}
|
}
|
||||||
|
|
|
||||||
10
views.py
10
views.py
|
|
@ -33,12 +33,20 @@ async def display(request: Request, link_id):
|
||||||
status_code=HTTPStatus.NOT_FOUND, detail="Withdraw link does not exist."
|
status_code=HTTPStatus.NOT_FOUND, detail="Withdraw link does not exist."
|
||||||
)
|
)
|
||||||
|
|
||||||
|
try:
|
||||||
|
lnurl = create_lnurl(link, request)
|
||||||
|
except ValueError as exc:
|
||||||
|
raise HTTPException(
|
||||||
|
status_code=HTTPStatus.INTERNAL_SERVER_ERROR,
|
||||||
|
detail=str(exc),
|
||||||
|
) from exc
|
||||||
|
|
||||||
return withdraw_renderer().TemplateResponse(
|
return withdraw_renderer().TemplateResponse(
|
||||||
"withdraw/display.html",
|
"withdraw/display.html",
|
||||||
{
|
{
|
||||||
"request": request,
|
"request": request,
|
||||||
"spent": link.is_spent,
|
"spent": link.is_spent,
|
||||||
"unique_hash": link.unique_hash,
|
"lnurl_url": str(lnurl.url),
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -45,6 +45,7 @@ async def api_links(
|
||||||
detail=str(exc),
|
detail=str(exc),
|
||||||
) from exc
|
) from exc
|
||||||
linkk.lnurl = str(lnurl.bech32)
|
linkk.lnurl = str(lnurl.bech32)
|
||||||
|
linkk.lnurl_url = str(lnurl.url)
|
||||||
|
|
||||||
return links
|
return links
|
||||||
|
|
||||||
|
|
@ -75,6 +76,7 @@ async def api_link_retrieve(
|
||||||
detail=str(exc),
|
detail=str(exc),
|
||||||
) from exc
|
) from exc
|
||||||
link.lnurl = str(lnurl.bech32)
|
link.lnurl = str(lnurl.bech32)
|
||||||
|
link.lnurl_url = str(lnurl.url)
|
||||||
return link
|
return link
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -166,6 +168,7 @@ async def api_link_create_or_update(
|
||||||
) from exc
|
) from exc
|
||||||
|
|
||||||
link.lnurl = str(lnurl.bech32)
|
link.lnurl = str(lnurl.bech32)
|
||||||
|
link.lnurl_url = str(lnurl.url)
|
||||||
|
|
||||||
return link
|
return link
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue