Mostly working

This commit is contained in:
Arc 2024-11-18 21:54:27 +00:00
parent 5a2ba743cf
commit 08dad16611
5 changed files with 232 additions and 232 deletions

View file

@ -17,5 +17,11 @@ class MyExtension(BaseModel):
lnurlwithdrawamount: int
wallet: str
total: int
lnurlpay: str
lnurlwithdraw: str
lnurlpay: str = ""
lnurlwithdraw: str = ""
class CreatePayment(BaseModel):
myextension_id: str
amount: int
memo: str

View file

@ -57,209 +57,203 @@ window.app = Vue.createApp({
this.g.user.wallets[0].inkey
)
.then(response => {
console.log(response.data)
this.myex = response.data
})
.catch(error => {
console.error('Error fetching data:', error)
.catch(err => {
LNbits.utils.notifyApiError(err)
})
}
},
async sendMyExtensionData() {
const data = {
name: this.formDialog.data.name,
lnurlwithdrawamount: this.formDialog.data.lnurlwithdrawamount,
lnurlpayamount: this.formDialog.data.lnurlpayamount
}
const wallet = _.findWhere(this.g.user.wallets, {
id: this.formDialog.data.wallet
})
if (this.formDialog.data.id) {
data.id = this.formDialog.data.id
data.total = this.formDialog.data.total
await this.updateMyExtension(wallet, data)
} else {
await this.createMyExtension(wallet, data)
}
},
async updateMyExtensionForm(tempId) {
const myextension = _.findWhere(this.myex, {id: tempId})
this.formDialog.data = {
...myextension
}
if (this.formDialog.data.tip_wallet != '') {
this.formDialog.advanced.tips = true
}
if (this.formDialog.data.withdrawlimit >= 1) {
this.formDialog.advanced.otc = true
}
this.formDialog.show = true
},
async createMyExtension(wallet, data) {
await LNbits.api
.request('POST', '/myextension/api/v1/myex', wallet.adminkey, data)
.then(response => {
this.myex.push(response.data)
this.closeFormDialog()
})
.catch(error => {
LNbits.utils.notifyApiError(error)
})
},
async updateMyExtension(wallet, data) {
await LNbits.api
.request(
'PUT',
`/myextension/api/v1/myex/${data.id}`,
wallet.adminkey,
data
)
.then(response => {
this.myex = _.reject(this.myex, obj => {
return obj.id == data.id
})
this.myex.push(response.data)
this.closeFormDialog()
})
.catch(error => {
LNbits.utils.notifyApiError(error)
})
},
async deleteMyExtension(tempId) {
var myextension = _.findWhere(this.myex, {id: tempId})
await LNbits.utils
.confirmDialog('Are you sure you want to delete this MyExtension?')
.onOk(function () {
LNbits.api
.request(
'DELETE',
'/myextension/api/v1/myex/' + tempId,
_.findWhere(this.g.user.wallets, {id: myextension.wallet}).adminkey
)
.then(() => {
this.myex = _.reject(this.myex, function (obj) {
return obj.id == tempId
})
})
.catch(error => {
LNbits.utils.notifyApiError(error)
})
})
},
async exportCSV() {
await LNbits.utils.exportCSV(this.myexTable.columns, this.myex)
},
async itemsArray(tempId) {
const myextension = _.findWhere(this.myex, {id: tempId})
return [...myextension.itemsMap.values()]
},
async openformDialog(id) {
const [tempId, itemId] = id.split(':')
const myextension = _.findWhere(this.myex, {id: tempId})
if (itemId) {
const item = myextension.itemsMap.get(id)
this.formDialog.data = {
...item,
myextension: tempId
},
async openUrlDialog(tempid) {
this.urlDialog.data = _.findWhere(this.myex, {id: tempid})
this.qrValue = this.urlDialog.data.lnurlpay
await this.connectWebocket(this.urlDialog.data.id)
this.urlDialog.show = true
},
async sendMyExtensionData() {
const data = {
name: this.formDialog.data.name,
lnurlwithdrawamount: this.formDialog.data.lnurlwithdrawamount,
lnurlpayamount: this.formDialog.data.lnurlpayamount
}
} else {
this.formDialog.data.myextension = tempId
}
this.formDialog.data.currency = myextension.currency
this.formDialog.show = true
},
async closeformDialog() {
this.formDialog.show = false
this.formDialog.data = {}
},
async openUrlDialog(id) {
this.urlDialog.data = _.findWhere(this.myex, {id})
this.qrValue = this.urlDialog.data.lnurlpay
await this.connectWebocket(this.urlDialog.data.id)
this.urlDialog.show = true
},
async createInvoice(walletId, myextensionId) {
///////////////////////////////////////////////////
///Simple call to the api to create an invoice/////
///////////////////////////////////////////////////
console.log(walletId)
const wallet = _.findWhere(this.g.user.wallets, {
id: walletId
})
const dataToSend = {
out: false,
amount: this.invoiceAmount,
memo: 'Invoice created by MyExtension',
extra: {
tag: 'MyExtension',
myextensionId: myextensionId
}
}
await LNbits.api
.request('POST', `/api/v1/payments`, wallet.inkey, dataToSend)
.then(response => {
this.qrValue = response.data.payment_request
const wallet = _.findWhere(this.g.user.wallets, {
id: this.formDialog.data.wallet
})
.catch(error => {
LNbits.utils.notifyApiError(error)
})
},
async makeItRain() {
document.getElementById('vue').disabled = true
var end = Date.now() + 2 * 1000
var colors = ['#FFD700', '#ffffff']
async function frame() {
confetti({
particleCount: 2,
angle: 60,
spread: 55,
origin: {x: 0},
colors: colors,
zIndex: 999999
})
confetti({
particleCount: 2,
angle: 120,
spread: 55,
origin: {x: 1},
colors: colors,
zIndex: 999999
})
if (Date.now() < end) {
requestAnimationFrame(frame)
if (this.formDialog.data.id) {
data.id = this.formDialog.data.id
data.total = this.formDialog.data.total
await this.updateMyExtension(wallet, data)
} else {
document.getElementById('vue').disabled = false
await this.createMyExtension(wallet, data)
}
},
async updateMyExtensionForm(tempId) {
const myextension = _.findWhere(this.myex, {id: tempId})
this.formDialog.data = {
...myextension
}
if (this.formDialog.data.tip_wallet != '') {
this.formDialog.advanced.tips = true
}
if (this.formDialog.data.withdrawlimit >= 1) {
this.formDialog.advanced.otc = true
}
this.formDialog.show = true
},
async createMyExtension(wallet, data) {
await LNbits.api
.request('POST', '/myextension/api/v1/myex', wallet.adminkey, data)
.then(response => {
this.myex.push(response.data)
this.closeFormDialog()
})
.catch(error => {
LNbits.utils.notifyApiError(error)
})
},
async updateMyExtension(wallet, data) {
await LNbits.api
.request(
'PUT',
`/myextension/api/v1/myex/${data.id}`,
wallet.adminkey,
data
)
.then(response => {
this.myex = _.reject(this.myex, obj => obj.id == data.id)
this.myex.push(response.data)
this.closeFormDialog()
})
.catch(error => {
LNbits.utils.notifyApiError(error)
})
},
async deleteMyExtension(tempId) {
var myextension = _.findWhere(this.myex, {id: tempId})
await LNbits.utils
.confirmDialog('Are you sure you want to delete this MyExtension?')
.onOk(function () {
LNbits.api
.request(
'DELETE',
'/myextension/api/v1/myex/' + tempId,
_.findWhere(this.g.user.wallets, {id: myextension.wallet})
.adminkey
)
.then(() => {
this.myex = _.reject(this.myex, obj => obj.id == tempId)
})
.catch(error => {
LNbits.utils.notifyApiError(error)
})
})
},
async exportCSV() {
await LNbits.utils.exportCSV(this.myexTable.columns, this.myex)
},
async itemsArray(tempId) {
const myextension = _.findWhere(this.myex, {id: tempId})
return [...myextension.itemsMap.values()]
},
async openformDialog(id) {
const [tempId, itemId] = id.split(':')
const myextension = _.findWhere(this.myex, {id: tempId})
if (itemId) {
const item = myextension.itemsMap.get(id)
this.formDialog.data = {
...item,
myextension: tempId
}
} else {
this.formDialog.data.myextension = tempId
}
this.formDialog.data.currency = myextension.currency
this.formDialog.show = true
},
async closeformDialog() {
this.formDialog.show = false
this.formDialog.data = {}
},
async createInvoice(tempid) {
///////////////////////////////////////////////////
///Simple call to the api to create an invoice/////
///////////////////////////////////////////////////
myex = _.findWhere(this.myex, {id: tempid})
const wallet = _.findWhere(this.g.user.wallets, {id: myex.wallet})
const data = {
myextension_id: tempid,
amount: this.invoiceAmount,
memo: 'MyExtension - ' + myex.name
}
await LNbits.api
.request('POST', `/myextension/api/v1/myex/payment`, wallet.inkey, data)
.then(async response => {
this.qrValue = response.data.payment_request
await this.connectWebocket(wallet.id)
})
.catch(error => {
LNbits.utils.notifyApiError(error)
})
},
async makeItRain() {
document.getElementById('vue').disabled = true
var end = Date.now() + 2 * 1000
var colors = ['#FFD700', '#ffffff']
async function frame() {
confetti({
particleCount: 2,
angle: 60,
spread: 55,
origin: {x: 0},
colors: colors,
zIndex: 999999
})
confetti({
particleCount: 2,
angle: 120,
spread: 55,
origin: {x: 1},
colors: colors,
zIndex: 999999
})
if (Date.now() < end) {
requestAnimationFrame(frame)
} else {
document.getElementById('vue').disabled = false
}
}
await frame()
},
async connectWebocket(wallet_id) {
//////////////////////////////////////////////////
///wait for pay action to happen and do a thing////
///////////////////////////////////////////////////
if (location.protocol !== 'http:') {
localUrl =
'wss://' +
document.domain +
':' +
location.port +
'/api/v1/ws/' +
wallet_id
} else {
localUrl =
'ws://' +
document.domain +
':' +
location.port +
'/api/v1/ws/' +
wallet_id
}
this.connection = new WebSocket(localUrl)
this.connection.onmessage = async function (e) {
await this.makeItRain()
}
}
await frame()
},
async connectWebocket(wallet_id) {
//////////////////////////////////////////////////
///wait for pay action to happen and do a thing////
///////////////////////////////////////////////////
if (location.protocol !== 'http:') {
localUrl =
'wss://' +
document.domain +
':' +
location.port +
'/api/v1/ws/' +
wallet_id
} else {
localUrl =
'ws://' +
document.domain +
':' +
location.port +
'/api/v1/ws/' +
wallet_id
}
this.connection = new WebSocket(localUrl)
this.connection.onmessage = async function (e) {
await this.makeItRain()
}
},
///////////////////////////////////////////////////
//////LIFECYCLE FUNCTIONS RUNNING ON PAGE LOAD/////
///////////////////////////////////////////////////

View file

@ -67,7 +67,7 @@
icon="launch"
:color="($q.dark.isActive) ? 'grey-7' : 'grey-5'"
type="a"
:href="props.row.myextension"
:href="props.row.id"
target="_blank"
><q-tooltip>Open public page</q-tooltip></q-btn
></q-td
@ -222,7 +222,7 @@
<template v-slot:append>
<q-btn
round
@click="createInvoice(urlDialog.data.wallet, urlDialog.data.id)"
@click="createInvoice(urlDialog.data.id)"
color="primary"
flat
icon="add_circle"

View file

@ -10,6 +10,7 @@ from lnbits.helpers import template_renderer
from lnbits.settings import settings
from .crud import get_myextension
from .helpers import lnurler
myextension_generic_router = APIRouter()
@ -27,9 +28,9 @@ def myextension_renderer():
@myextension_generic_router.get("/", response_class=HTMLResponse)
async def index(request: Request, user: User = Depends(check_user_exists)):
async def index(req: Request, user: User = Depends(check_user_exists)):
return myextension_renderer().TemplateResponse(
"myextension/index.html", {"request": request, "user": user.json()}
"myextension/index.html", {"request": req, "user": user.json()}
)
@ -37,18 +38,18 @@ async def index(request: Request, user: User = Depends(check_user_exists)):
@myextension_generic_router.get("/{myextension_id}")
async def myextension(request: Request, myextension_id):
myextension = await get_myextension(myextension_id)
if not myextension:
async def myextension(req: Request, myextension_id):
myex = await get_myextension(myextension_id)
if not myex:
raise HTTPException(
status_code=HTTPStatus.NOT_FOUND, detail="MyExtension does not exist."
)
return myextension_renderer().TemplateResponse(
"myextension/myextension.html",
{
"request": request,
"request": req,
"myextension_id": myextension_id,
"lnurlpay": myextension.lnurlpay(request),
"lnurlpay": lnurler(myex.id, "myextension.api_lnurl_pay", req),
"web_manifest": f"/myextension/manifest/{myextension_id}.webmanifest",
},
)

View file

@ -18,7 +18,7 @@ from .crud import (
update_myextension,
)
from .helpers import lnurler
from .models import CreateMyExtensionData, MyExtension
from .models import CreateMyExtensionData, MyExtension, CreatePayment
myextension_api_router = APIRouter()
@ -67,6 +67,25 @@ async def api_myextension(myextension_id: str, req: Request) -> MyExtension:
return myex
## Create a new record
@myextension_api_router.post("/api/v1/myex", status_code=HTTPStatus.CREATED)
async def api_myextension_create(
req: Request, # Withoutthe lnurl stuff this wouldnt be needed
data: CreateMyExtensionData,
wallet: WalletTypeInfo = Depends(require_admin_key),
) -> MyExtension:
myex = MyExtension(**data.dict(), wallet=wallet.wallet.id, id=urlsafe_short_hash())
myex = await create_myextension(myex)
# Populate lnurlpay and lnurlwithdraw.
# Withoutthe lnurl stuff this wouldnt be needed.
myex.lnurlpay = lnurler(myex.id, "myextension.api_lnurl_pay", req)
myex.lnurlwithdraw = lnurler(myex.id, "myextension.api_lnurl_withdraw", req)
return myex
## update a record
@ -102,26 +121,6 @@ async def api_myextension_update(
return myex
## Create a new record
@myextension_api_router.post("/api/v1/myex", status_code=HTTPStatus.CREATED)
async def api_myextension_create(
req: Request, # Withoutthe lnurl stuff this wouldnt be needed
data: CreateMyExtensionData,
wallet: WalletTypeInfo = Depends(require_admin_key),
) -> MyExtension:
myex = MyExtension(**data.dict(), wallet=wallet.wallet.id, id=urlsafe_short_hash())
myex = await create_myextension(myex)
# Populate lnurlpay and lnurlwithdraw.
# Withoutthe lnurl stuff this wouldnt be needed.
myex.lnurlpay = lnurler(myex.id, "myextension.api_lnurl_pay", req)
myex.lnurlwithdraw = lnurler(myex.id, "myextension.api_lnurl_withdraw", req)
return myex
## Delete a record
@ -150,12 +149,12 @@ async def api_myextension_delete(
@myextension_api_router.post(
"/api/v1/myex/payment/{myextension_id}", status_code=HTTPStatus.CREATED
"/api/v1/myex/payment", status_code=HTTPStatus.CREATED
)
async def api_myextension_create_invoice(
myextension_id: str, amount: int = Query(..., ge=1), memo: str = ""
data: CreatePayment
) -> dict:
myextension = await get_myextension(myextension_id)
myextension = await get_myextension(data.myextension_id)
if not myextension:
raise HTTPException(
@ -167,11 +166,11 @@ async def api_myextension_create_invoice(
payment = await create_invoice(
wallet_id=myextension.wallet,
amount=amount,
memo=f"{memo} to {myextension.name}" if memo else f"{myextension.name}",
amount=data.amount,
memo=f"{data.memo} to {myextension.name}" if data.memo else f"{myextension.name}",
extra={
"tag": "myextension",
"amount": amount,
"amount": data.amount,
},
)