diff --git a/lnbits/extensions/lnticket/config.json.example b/lnbits/extensions/lnticket/config.json similarity index 100% rename from lnbits/extensions/lnticket/config.json.example rename to lnbits/extensions/lnticket/config.json diff --git a/lnbits/extensions/lnticket/crud.py b/lnbits/extensions/lnticket/crud.py index 7b50bf2..05174cd 100644 --- a/lnbits/extensions/lnticket/crud.py +++ b/lnbits/extensions/lnticket/crud.py @@ -10,28 +10,43 @@ from .models import Tickets, Forms #######TICKETS######## +def create_ticket(checking_id: str, wallet: str, form: str, name: str, email: str, ltext: str, sats: int) -> Tickets: + with open_ext_db("lnticket") as db: + db.execute( + """ + INSERT INTO tickets (id, paid, form, email, ltext, name, wallet, sats) + VALUES (?, ?, ?, ?, ?, ?, ?, ?) + """, + (checking_id, False, form, email, ltext, name, wallet, sats), + ) + + return get_ticket(checking_id) -def create_ticket(wallet: str, form: str, name: str, email: str, ltext: str, sats: int) -> Tickets: - formdata = get_form(form) - amount = formdata.amountmade + sats +def update_ticket(paid: bool, checking_id: str) -> Tickets: with open_ext_db("lnticket") as db: - ticket_id = urlsafe_short_hash() + row = db.fetchone("SELECT * FROM tickets WHERE id = ?", (checking_id,)) + if row[1] == True: + return get_ticket(checking_id) db.execute( """ - INSERT INTO tickets (id, form, email, ltext, name, wallet, sats) - VALUES (?, ?, ?, ?, ?, ?, ?) + UPDATE tickets + SET paid = ? + WHERE id = ? """, - (ticket_id, form, email, ltext, name, wallet, sats), + (paid, checking_id), ) + + formdata = get_form(row[2]) + amount = formdata.amountmade + row[7] db.execute( """ UPDATE forms SET amountmade = ? WHERE id = ? """, - (amount, form), + (amount, row[2]), ) - return get_ticket(ticket_id) + return get_ticket(checking_id) def get_ticket(ticket_id: str) -> Optional[Tickets]: diff --git a/lnbits/extensions/lnticket/migrations.py b/lnbits/extensions/lnticket/migrations.py index e296b93..471f78c 100644 --- a/lnbits/extensions/lnticket/migrations.py +++ b/lnbits/extensions/lnticket/migrations.py @@ -20,6 +20,7 @@ def m001_initial(db): """ CREATE TABLE IF NOT EXISTS tickets ( id TEXT PRIMARY KEY, + paid BOOLEAN NOT NULL, form TEXT NOT NULL, email TEXT NOT NULL, ltext TEXT NOT NULL, diff --git a/lnbits/extensions/lnticket/models.py b/lnbits/extensions/lnticket/models.py index 7da84a6..24f651d 100644 --- a/lnbits/extensions/lnticket/models.py +++ b/lnbits/extensions/lnticket/models.py @@ -13,6 +13,7 @@ class Forms(NamedTuple): class Tickets(NamedTuple): id: str + paid: bool form: str email: str ltext: str diff --git a/lnbits/extensions/lnticket/templates/lnticket/display.html b/lnbits/extensions/lnticket/templates/lnticket/display.html index a1808ea..1b72615 100644 --- a/lnbits/extensions/lnticket/templates/lnticket/display.html +++ b/lnbits/extensions/lnticket/templates/lnticket/display.html @@ -138,14 +138,18 @@ Invoice: function () { var self = this axios - - .get( + .post( '/lnticket/api/v1/tickets/' + - '{{ form_id }}' + - '/' + - self.formDialog.data.sats + '{{ form_id }}/' + + self.formDialog.data.sats, + { + form: '{{ form_id }}', + name: self.formDialog.data.name, + email: self.formDialog.data.email, + ltext: self.formDialog.data.text, + sats: self.formDialog.data.sats + } ) - .then(function (response) { self.paymentReq = response.data.payment_request self.paymentCheck = response.data.checking_id @@ -160,21 +164,10 @@ status: 'pending', paymentReq: self.paymentReq } - if (self.formDialog.data.email == '') { - daemail = 'null' - } else { - daemail = self.formDialog.data.email - } paymentChecker = setInterval(function () { axios - .post('/lnticket/api/v1/tickets/' + self.paymentCheck, { - form: '{{ form_id }}', - name: self.formDialog.data.name, - email: daemail, - ltext: self.formDialog.data.text, - sats: self.formDialog.data.sats - }) + .get('/lnticket/api/v1/tickets/' + self.paymentCheck) .then(function (res) { if (res.data.paid) { clearInterval(paymentChecker) diff --git a/lnbits/extensions/lnticket/views_api.py b/lnbits/extensions/lnticket/views_api.py index 79cfc6e..5e3975b 100644 --- a/lnbits/extensions/lnticket/views_api.py +++ b/lnbits/extensions/lnticket/views_api.py @@ -7,7 +7,7 @@ from lnbits.decorators import api_check_wallet_key, api_validate_post_request from lnbits.settings import WALLET from lnbits.extensions.lnticket import lnticket_ext -from .crud import create_ticket, get_ticket, get_tickets, delete_ticket, create_form, update_form, get_form, get_forms, delete_form +from .crud import create_ticket, update_ticket, get_ticket, get_tickets, delete_ticket, create_form, update_form, get_form, get_forms, delete_form #########FORMS########## @@ -82,51 +82,56 @@ def api_tickets(): return jsonify([form._asdict() for form in get_tickets(wallet_ids)]), HTTPStatus.OK -@lnticket_ext.route("/api/v1/tickets//", methods=["GET"]) -def api_ticket_create(form_id, sats): - form = get_form(form_id) +@lnticket_ext.route("/api/v1/tickets//", methods=["POST"]) +@api_validate_post_request( + schema={ + "form": {"type": "string", "empty": False, "required": True}, + "name": {"type": "string", "empty": False, "required": True}, + "email": {"type": "string", "empty": False, "required": True}, + "ltext": {"type": "string", "empty": False, "required": True}, + "sats": {"type": "integer", "min": 0, "required": True} + }) +def api_ticket_make_ticket(form_id, sats): + event = get_form(form_id) + + if not event: + return jsonify({"message": "LNTicket does not exist."}), HTTPStatus.NOT_FOUND try: checking_id, payment_request = create_invoice( - wallet_id=form.wallet, amount=int(sats), memo=f"#lnticket {form_id}" + wallet_id=event.wallet, amount=int(sats), memo=f"#lnticket {form_id}" ) except Exception as e: return jsonify({"message": str(e)}), HTTPStatus.INTERNAL_SERVER_ERROR - return jsonify({"checking_id": checking_id, "payment_request": payment_request}), HTTPStatus.OK + ticket = create_ticket(checking_id=checking_id, wallet=event.wallet, **g.data) + if not ticket: + return jsonify({"message": "LNTicket could not be fetched."}), HTTPStatus.NOT_FOUND + return jsonify({"checking_id": checking_id, "payment_request": payment_request}), HTTPStatus.OK -@lnticket_ext.route("/api/v1/tickets/", methods=["POST"]) -@api_validate_post_request( - schema={ - "form": {"type": "string", "empty": False, "required": True}, - "name": {"type": "string", "empty": False, "required": True}, - "email": {"type": "string", "empty": False, "required": True}, - "ltext": {"type": "string", "empty": False, "required": True}, - "sats": {"type": "integer", "min": 0, "required": True} - }) -def api_ticket_send_ticket(checking_id): - form = get_form(g.data['form']) - if not form: - return jsonify({"message": "LNTicket does not exist."}), HTTPStatus.NOT_FOUND +@lnticket_ext.route("/api/v1/tickets/", methods=["GET"]) +def api_ticket_send_ticket(checking_id): + theticket = get_ticket(checking_id) try: is_paid = not WALLET.get_invoice_status(checking_id).pending except Exception: return jsonify({"message": "Not paid."}), HTTPStatus.NOT_FOUND if is_paid: - wallet = get_wallet(form.wallet) + wallet = get_wallet(theticket.wallet) payment = wallet.get_payment(checking_id) payment.set_pending(False) - create_ticket(wallet=form.wallet, **g.data) + ticket = update_ticket(paid=True, checking_id=checking_id) - return jsonify({"paid": True}), HTTPStatus.OK + return jsonify({"paid": True, "ticket_id": ticket.id}), HTTPStatus.OK return jsonify({"paid": False}), HTTPStatus.OK + @lnticket_ext.route("/api/v1/tickets/", methods=["DELETE"]) @api_check_wallet_key("invoice") def api_ticket_delete(ticket_id):