Mostly working
This commit is contained in:
parent
5a2ba743cf
commit
08dad16611
5 changed files with 232 additions and 232 deletions
10
models.py
10
models.py
|
|
@ -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
|
||||
|
||||
|
|
|
|||
|
|
@ -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/////
|
||||
///////////////////////////////////////////////////
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
|
|
|||
15
views.py
15
views.py
|
|
@ -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",
|
||||
},
|
||||
)
|
||||
|
|
|
|||
53
views_api.py
53
views_api.py
|
|
@ -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,
|
||||
},
|
||||
)
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue