Started fixing endpoints

This commit is contained in:
Ben Arc 2021-04-05 00:10:54 +01:00
parent 55748b427b
commit 744662fb63
3 changed files with 236 additions and 197 deletions

View file

@ -1,35 +1,42 @@
<q-card> <q-card>
<q-card-section> <q-card-section>
<p>SatsPay: Create Onchain/LN charges. Includes webhooks!<br /> <p>
SatsPay: Create Onchain/LN charges. Includes webhooks!<br />
<small> <small>
Created by, <a href="https://github.com/benarc">Ben Arc</a></small Created by, <a href="https://github.com/benarc">Ben Arc</a></small
> >
</p> </p>
</q-card-section> </q-card-section>
<q-expansion-item
<q-expansion-item
group="extras" group="extras"
icon="swap_vertical_circle" icon="swap_vertical_circle"
label="API info" label="API info"
:content-inset-level="0.5" :content-inset-level="0.5"
> >
<q-expansion-item group="api" dense expand-separator label="List pay links"> <q-expansion-item group="api" dense expand-separator label="Create charge">
<q-card> <q-card>
<q-card-section> <q-card-section>
<code><span class="text-blue">GET</span> /pay/api/v1/links</code> <code
><span class="text-blue">POST</span> /satspay/api/v1/charge</code
>
<h5 class="text-caption q-mt-sm q-mb-none">Headers</h5> <h5 class="text-caption q-mt-sm q-mb-none">Headers</h5>
<code>{"X-Api-Key": &lt;invoice_key&gt;}</code><br /> <code>{"X-Api-Key": &lt;admin_key&gt;}</code><br />
<h5 class="text-caption q-mt-sm q-mb-none">Body (application/json)</h5> <h5 class="text-caption q-mt-sm q-mb-none">
Body (application/json)
</h5>
<h5 class="text-caption q-mt-sm q-mb-none"> <h5 class="text-caption q-mt-sm q-mb-none">
Returns 200 OK (application/json) Returns 200 OK (application/json)
</h5> </h5>
<code>[&lt;pay_link_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 }}pay/api/v1/links -H "X-Api-Key: {{ >curl -X POST {{ request.url_root }}api/v1/charge -d
g.user.wallets[0].inkey }}" '{"onchainwallet": &lt;string, watchonly_wallet_id&gt;,
"description": &lt;string&gt;, "webhook":&lt;string&gt;, "time":
&lt;integer&gt;, "amount": &lt;integer&gt;, "lnbitswallet":
&lt;string, lnbits_wallet_id&gt;}' -H "Content-type:
application/json" -H "X-Api-Key: {{g.user.wallets[0].adminkey }}"
</code> </code>
</q-card-section> </q-card-section>
</q-card> </q-card>
@ -43,15 +50,17 @@
> >
<h5 class="text-caption q-mt-sm q-mb-none">Headers</h5> <h5 class="text-caption q-mt-sm q-mb-none">Headers</h5>
<code>{"X-Api-Key": &lt;invoice_key&gt;}</code><br /> <code>{"X-Api-Key": &lt;invoice_key&gt;}</code><br />
<h5 class="text-caption q-mt-sm q-mb-none">Body (application/json)</h5> <h5 class="text-caption q-mt-sm q-mb-none">
Body (application/json)
</h5>
<h5 class="text-caption q-mt-sm q-mb-none"> <h5 class="text-caption q-mt-sm q-mb-none">
Returns 201 CREATED (application/json) Returns 201 CREATED (application/json)
</h5> </h5>
<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 }}pay/api/v1/links/&lt;pay_id&gt; -H >curl -X GET {{ request.url_root }}pay/api/v1/links/&lt;pay_id&gt;
"X-Api-Key: {{ g.user.wallets[0].inkey }}" -H "X-Api-Key: {{ g.user.wallets[0].inkey }}"
</code> </code>
</q-card-section> </q-card-section>
</q-card> </q-card>
@ -67,27 +76,25 @@
<code><span class="text-green">POST</span> /pay/api/v1/links</code> <code><span class="text-green">POST</span> /pay/api/v1/links</code>
<h5 class="text-caption q-mt-sm q-mb-none">Headers</h5> <h5 class="text-caption q-mt-sm q-mb-none">Headers</h5>
<code>{"X-Api-Key": &lt;invoice_key&gt;}</code><br /> <code>{"X-Api-Key": &lt;invoice_key&gt;}</code><br />
<h5 class="text-caption q-mt-sm q-mb-none">Body (application/json)</h5> <h5 class="text-caption q-mt-sm q-mb-none">
Body (application/json)
</h5>
<code>{"description": &lt;string&gt; "amount": &lt;integer&gt;}</code> <code>{"description": &lt;string&gt; "amount": &lt;integer&gt;}</code>
<h5 class="text-caption q-mt-sm q-mb-none"> <h5 class="text-caption q-mt-sm q-mb-none">
Returns 201 CREATED (application/json) Returns 201 CREATED (application/json)
</h5> </h5>
<code> { <code>
"deliveryId": &lt;string&gt;, { "deliveryId": &lt;string&gt;, "description": &lt;string&gt;,
"description": &lt;string&gt;, "webhookId": &lt;string&gt;, "originalDeliveryId": &lt;string&gt;,
"webhookId": &lt;string&gt;, "isRedelivery": &lt;boolean&gt;, "type": &lt;string&gt;,
"originalDeliveryId": &lt;string&gt;, "timestamp": &lt;int&gt;, "paytime": &lt;int&gt;, "storeId":
"isRedelivery": &lt;boolean&gt;, &lt;string&gt;, "invoiceId": &lt;string&gt;, "manuallyMarked":
"type": &lt;string&gt;, &lt;boolean&gt;, "overPaid": &lt;boolean&gt;, "afterExpiration":
"timestamp": &lt;int&gt;, &lt;boolean&gt;, "partiallyPaid": &lt;boolean&gt; }<br /><small
"paytime": &lt;int&gt;, >"type" can be InvoiceReceivedPayment, InvoicePaidInFull,
"storeId": &lt;string&gt;, InvoiceExpired, InvoiceConfirmed, and InvoiceInvalid</small
"invoiceId": &lt;string&gt;, >
"manuallyMarked": &lt;boolean&gt;, </code>
"overPaid": &lt;boolean&gt;,
"afterExpiration": &lt;boolean&gt;,
"partiallyPaid": &lt;boolean&gt;
}<br/><small>"type" can be InvoiceReceivedPayment, InvoicePaidInFull, InvoiceExpired, InvoiceConfirmed, and InvoiceInvalid</small> </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 }}pay/api/v1/links -d >curl -X POST {{ request.url_root }}pay/api/v1/links -d
@ -112,16 +119,20 @@
> >
<h5 class="text-caption q-mt-sm q-mb-none">Headers</h5> <h5 class="text-caption q-mt-sm q-mb-none">Headers</h5>
<code>{"X-Api-Key": &lt;admin_key&gt;}</code><br /> <code>{"X-Api-Key": &lt;admin_key&gt;}</code><br />
<h5 class="text-caption q-mt-sm q-mb-none">Body (application/json)</h5> <h5 class="text-caption q-mt-sm q-mb-none">
<code>{"description": &lt;string&gt;, "amount": &lt;integer&gt;}</code> Body (application/json)
</h5>
<code
>{"description": &lt;string&gt;, "amount": &lt;integer&gt;}</code
>
<h5 class="text-caption q-mt-sm q-mb-none"> <h5 class="text-caption q-mt-sm q-mb-none">
Returns 200 OK (application/json) Returns 200 OK (application/json)
</h5> </h5>
<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 }}pay/api/v1/links/&lt;pay_id&gt; -d >curl -X PUT {{ request.url_root }}pay/api/v1/links/&lt;pay_id&gt;
'{"description": &lt;string&gt;, "amount": &lt;integer&gt;}' -H -d '{"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: {{
g.user.wallets[0].adminkey }}" g.user.wallets[0].adminkey }}"
</code> </code>
@ -147,10 +158,12 @@
<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 }}pay/api/v1/links/&lt;pay_id&gt; >curl -X DELETE {{ request.url_root
-H "X-Api-Key: {{ g.user.wallets[0].adminkey }}" }}pay/api/v1/links/&lt;pay_id&gt; -H "X-Api-Key: {{
g.user.wallets[0].adminkey }}"
</code> </code>
</q-card-section> </q-card-section>
</q-card> </q-card>
</q-expansion-item> </q-expansion-item>
</q-expansion-item> </q-expansion-item>
</q-card>

View file

@ -324,6 +324,18 @@
ChargesTable: { ChargesTable: {
columns: [ columns: [
{
name: 'timeleft',
align: 'left',
label: 'Time left',
field: 'countdown'
},
{
name: 'id',
align: 'left',
label: 'ID',
field: 'id'
},
{ {
name: 'description', name: 'description',
align: 'left', align: 'left',
@ -360,12 +372,6 @@
label: 'Time to Pay', label: 'Time to Pay',
field: 'time' field: 'time'
}, },
{
name: 'timeleft',
align: 'left',
label: 'Time left',
field: 'date'
},
], ],
pagination: { pagination: {
rowsPerPage: 10 rowsPerPage: 10
@ -386,8 +392,19 @@
} }
}, },
computed: {
updateCountdowns() {
console.log("whatever")
Object.mapWalletLink(this.data).forEach(row => {
let datem = moment(row.time).format('YYYY-MM-DD HH:mm');
row.countdown = countdown(new Date(datem).getTime()).toString();
})
}
},
methods: { methods: {
getWalletLinks: function () { getWalletLinks: function () {
var self = this var self = this
@ -466,8 +483,8 @@
} }
self.ChargeLinks = response.data.map(function (obj) { self.ChargeLinks = response.data.map(function (obj) {
console.log(obj.timestamp)
console.log(Date.now()/1000)
return mapCharge(obj) return mapCharge(obj)
}) })
}) })
@ -637,6 +654,8 @@
} }
}, 5000); }, 5000);
getCharges() getCharges()
} }
}) })
</script> </script>

View file

@ -17,19 +17,31 @@ from .crud import (
) )
#############################CHARGES########################## #############################CHARGES##########################
@satspay_ext.route("/api/v1/charges/balance/<charge_id>", methods=["GET"])
@api_check_wallet_key("invoice")
async def api_charges_balance(charge_id):
charge = await check_address_balance(charge_id)
if not charge: @satspay_ext.route("/api/v1/charge", methods=["POST"])
return ( @satspay_ext.route("/api/v1/charge/<charge_id>", methods=["PUT"])
jsonify(""), @api_check_wallet_key("admin")
HTTPStatus.OK @api_validate_post_request(
) schema={
"onchainwallet": {"type": "string"},
"lnbitswallet": {"type": "string"},
"description": {"type": "string", "empty": False, "required": True},
"webhook": {"type": "string", "empty": False, "required": True},
"time": {"type": "integer", "min": 1, "required": True},
"amount": {"type": "integer", "min": 1, "required": True},
}
)
async def api_charge_create_or_update(charge_id=None):
if not charge_id:
charge = await create_charge(user=g.wallet.user, **g.data)
return jsonify(charge._asdict()), HTTPStatus.CREATED
else: else:
charge = await update_charge(user=g.wallet.user, **g.data)
return jsonify(charge._asdict()), HTTPStatus.OK return jsonify(charge._asdict()), HTTPStatus.OK
@satspay_ext.route("/api/v1/charges", methods=["GET"]) @satspay_ext.route("/api/v1/charges", methods=["GET"])
@api_check_wallet_key("invoice") @api_check_wallet_key("invoice")
async def api_charges_retrieve(): async def api_charges_retrieve():
@ -55,29 +67,6 @@ async def api_charge_retrieve(charge_id):
return jsonify({charge}), HTTPStatus.OK return jsonify({charge}), HTTPStatus.OK
@satspay_ext.route("/api/v1/charge", methods=["POST"])
@satspay_ext.route("/api/v1/charge/<charge_id>", methods=["PUT"])
@api_check_wallet_key("invoice")
@api_validate_post_request(
schema={
"onchainwallet": {"type": "string"},
"lnbitswallet": {"type": "string"},
"description": {"type": "string", "empty": False, "required": True},
"webhook": {"type": "string", "empty": False, "required": True},
"time": {"type": "integer", "min": 1, "required": True},
"amount": {"type": "integer", "min": 1, "required": True},
}
)
async def api_charge_create_or_update(charge_id=None):
if not charge_id:
charge = await create_charge(user = g.wallet.user, **g.data)
return jsonify(charge), HTTPStatus.CREATED
else:
charge = await update_charge(user = g.wallet.user, **g.data)
return jsonify(charge), HTTPStatus.OK
@satspay_ext.route("/api/v1/charge/<charge_id>", methods=["DELETE"]) @satspay_ext.route("/api/v1/charge/<charge_id>", methods=["DELETE"])
@api_check_wallet_key("invoice") @api_check_wallet_key("invoice")
async def api_charge_delete(charge_id): async def api_charge_delete(charge_id):
@ -90,8 +79,25 @@ async def api_charge_delete(charge_id):
return "", HTTPStatus.NO_CONTENT return "", HTTPStatus.NO_CONTENT
#############################BALANCE##########################
@satspay_ext.route("/api/v1/charges/balance/<charge_id>", methods=["GET"])
@api_check_wallet_key("invoice")
async def api_charges_balance(charge_id):
charge = await check_address_balance(charge_id)
if not charge:
return (
jsonify(""),
HTTPStatus.OK
)
else:
return jsonify(charge._asdict()), HTTPStatus.OK
#############################MEMPOOL########################## #############################MEMPOOL##########################
@satspay_ext.route("/api/v1/mempool", methods=["PUT"]) @satspay_ext.route("/api/v1/mempool", methods=["PUT"])
@api_check_wallet_key("invoice") @api_check_wallet_key("invoice")
@api_validate_post_request( @api_validate_post_request(
@ -103,6 +109,7 @@ async def api_update_mempool():
mempool = await update_mempool(user=g.wallet.user, **g.data) mempool = await update_mempool(user=g.wallet.user, **g.data)
return jsonify(mempool._asdict()), HTTPStatus.OK return jsonify(mempool._asdict()), HTTPStatus.OK
@satspay_ext.route("/api/v1/mempool", methods=["GET"]) @satspay_ext.route("/api/v1/mempool", methods=["GET"])
@api_check_wallet_key("invoice") @api_check_wallet_key("invoice")
async def api_get_mempool(): async def api_get_mempool():