diff --git a/pass/app/Order.js b/pass/app/Order.js index 93fa3b6b7f70f6e8e04c6692dcaff644d99a44f0..cff4bb02926784ca8da8421db074c1f0d35e950d 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 1d4b65485cb0cd26850c23773bfa8f8f4d885942..532680fa29dca72787f52ab84c464cca1113d7d3 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 e71c0df2bbfac5f3164bf8daded19d04db7b0332..d60c1bba71957a9e573406f09a7bd3704232a91a 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 a25d26bf6fe777fa67ac603bd6b6405f27ea1a4e..044e64d09ad38d5e9deeaae4f91aaef0edf7fe98 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, + }, + ], + }); }); });