From 51947d168e18b41275739d47a6bdd6dcdfb41a48 Mon Sep 17 00:00:00 2001 From: Dominik Hebeler <dominik@suma-ev.de> Date: Mon, 14 Nov 2022 15:29:56 +0100 Subject: [PATCH] added handler when canceling payment --- pass/app/Order.js | 12 ++++++++++ pass/resources/js/checkout.js | 24 +++++++++++++++++++ pass/routes/checkout/checkout.js | 41 ++++++++++++++++---------------- pass/routes/checkout/paypal.js | 24 +++++++++++++++---- 4 files changed, 76 insertions(+), 25 deletions(-) diff --git a/pass/app/Order.js b/pass/app/Order.js index 93fa3b6..cff4bb0 100644 --- a/pass/app/Order.js +++ b/pass/app/Order.js @@ -143,6 +143,18 @@ class Order { await storage_promise; } + + async delete() { + let redis_key = Order.STORAGE_KEY_PREFIX + this.#order_id; + return this.#redis_client + .del(redis_key) + .then(() => { + return true; + }) + .catch(() => { + return false; + }); + } } module.exports = Order; diff --git a/pass/resources/js/checkout.js b/pass/resources/js/checkout.js index 1d4b654..532680f 100644 --- a/pass/resources/js/checkout.js +++ b/pass/resources/js/checkout.js @@ -78,6 +78,30 @@ function execute_payment_paypal(e) { .then((response) => response.json()) .then((order) => order.id); }, + onCancel: (data) => { + return fetch("/checkout/payment/order/paypal/cancel", { + method: "POST", + headers: { + "Content-Type": "application/json;charset=utf-8", + }, + body: JSON.stringify({ + order_id: document.querySelector("input[name=order_id]").value, + amount: document.querySelector("input[name=amount]").value, + unit_size: document.querySelector("input[name=unit_size]") + .value, + price_per_unit: document.querySelector( + "input[name=price_per_unit]" + ).value, + public_key_n: document.querySelector("input[name=public_key_n]") + .value, + public_key_e: document.querySelector("input[name=public_key_e]") + .value, + integrity: document.querySelector("input[name=integrity]") + .value, + encrypted_sales_receipts: encrypted_sales_receipt, + }), + }); + }, }) .render("#payment-information"); }) diff --git a/pass/routes/checkout/checkout.js b/pass/routes/checkout/checkout.js index e71c0df..d60c1bb 100644 --- a/pass/routes/checkout/checkout.js +++ b/pass/routes/checkout/checkout.js @@ -119,34 +119,33 @@ router.use( return res.status(400).json({ errors: errors.array() }); } - // Order data is validated: Create and store the order in the redis database - let order = new Order( - req.body.order_id, - req.body.amount, - req.body.unit_size, - req.body.price_per_unit, - req.body.encrypted_sales_receipts - ); - order - .save() - .then(() => { - // Order created on our side. Continue the payment with the selected provider - next("route"); - }) - .catch((reason) => { - return res.status(400).json({ + next("route"); + } +); + +/** Cancel is the same for all payment gateways */ +router.post("/payment/order/*/cancel", (req, res) => { + Order.LOAD_ORDER_FROM_ID(req.body.order_id).then((loaded_order) => { + loaded_order.delete().then((success) => { + console.log(success); + if (success) { + res.status(200).json({ + msg: "Order deleted", + }); + } else { + res.status(400).json({ errors: [ { - msg: reason, + msg: "Could not delete specified order", }, ], }); - }); - } -); + } + }); + }); +}); var paypalRouter = require("./paypal.js"); -const { PRICE_FOR_250 } = require("../../app/Order.js"); router.use("/payment/order/paypal", paypalRouter); module.exports = router; diff --git a/pass/routes/checkout/paypal.js b/pass/routes/checkout/paypal.js index a25d26b..044e64d 100644 --- a/pass/routes/checkout/paypal.js +++ b/pass/routes/checkout/paypal.js @@ -10,12 +10,28 @@ const base = "https://api-m.sandbox.paypal.com"; /* Client initiates payment */ router.post("/", async (req, res, next) => { - Order.LOAD_ORDER_FROM_ID(req.body.order_id) - .then((order) => { + // Order data is validated: Create and store the order in the redis database + let order = new Order( + req.body.order_id, + req.body.amount, + req.body.unit_size, + req.body.price_per_unit, + req.body.encrypted_sales_receipts + ); + order + .save() + .then(() => { + // Order created on our side. Continue the payment with the selected provider createOrder(order).then((order_result) => res.json(order_result)); }) - .catch((error) => { - return res.status(400).json({ errors: [{ msg: error }] }); + .catch((reason) => { + return res.status(400).json({ + errors: [ + { + msg: reason, + }, + ], + }); }); }); -- GitLab