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