From f354e6429cb53c2b5374ccaff4dc8c9c5efc4d5a Mon Sep 17 00:00:00 2001 From: Dominik Hebeler <dominik@hebeler.club> Date: Fri, 3 Mar 2023 12:44:14 +0100 Subject: [PATCH] added charge api --- docs/api.md | 25 +++++++++++++++++++++++++ pass/app/Order.js | 6 +++++- pass/routes/api.js | 28 ++++++++++++++++++++++++++++ pass/routes/checkout/manual.js | 1 - pass/routes/checkout/paypal.js | 1 - 5 files changed, 58 insertions(+), 3 deletions(-) diff --git a/docs/api.md b/docs/api.md index a1e41e9..80403be 100644 --- a/docs/api.md +++ b/docs/api.md @@ -53,3 +53,28 @@ Reduces the charge of a key by specified amount "discharged": <AMOUNT_DISCHARGED> } ``` + +## `POST /api/json/key/:key/charge` + +Charges a key by specified amount. Creates a Order to do so. A note can be attached to the Order. +`manual` is currently the only valid payment processor for API. + +### Parameters + +```json +{ + "amount": <AMOUNT_TO_CHARGE> + "payment_processor": "manual", + "note": <NOTE_FOR_ORDER> +} +``` + +### Example Response + +```json +{ + "key": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx", + "charge": 100, + "discharged": <AMOUNT_DISCHARGED> +} +``` \ No newline at end of file diff --git a/pass/app/Order.js b/pass/app/Order.js index 91362e2..70786be 100644 --- a/pass/app/Order.js +++ b/pass/app/Order.js @@ -296,7 +296,11 @@ class Order { * @param {PaymentProcessor} payment_processor * @returns */ - static async CREATE_NEW_ORDER(amount, price, key, payment_processor) { + static async CREATE_NEW_ORDER(amount, key, payment_processor) { + // Calculate price from amount + let price = (amount / 300) * config.get("price.per_300"); + price = price.toFixed(2); + return Order.GENERATE_UNIQUE_ORDER_ID().then((order_id) => { let new_order = new Order(order_id, amount, price, payment_processor); return new_order diff --git a/pass/routes/api.js b/pass/routes/api.js index 07b1b14..adb4894 100644 --- a/pass/routes/api.js +++ b/pass/routes/api.js @@ -3,6 +3,8 @@ var router = express.Router(); const config = require("config"); const Key = require("../app/Key"); +const Order = require("../app/Order"); +const Manual = require("../app/payment_processor/Manual"); router.use((req, res, next) => { let auth_token = req.get("Authorization"); @@ -50,6 +52,32 @@ router.post("/key/:key/discharge", (req, res) => { }); }) +router.post("/key/:key/charge", (req, res) => { + let amount = req.body.amount; + let payment_processor = "manual"; // Only supported processor via API currently + let note = req.body.note; + + /** + * @type {Order} + */ + let new_order = null; + Order.CREATE_NEW_ORDER( + amount, + req.params.key, + new Manual(note) + ).then(order => { + new_order = order; + return new_order.captureOrder(); + }).then(() => new_order.chargeKey()) + .then(async () => { + res.json({ + key: await new_order.getKeyFromOrderLink(), + order_id: new_order.getOrderID(), + charged: new_order.getAmount(), + }); + }); +}); + router.use((req, res) => { res.status(404).json({ code: 404, diff --git a/pass/routes/checkout/manual.js b/pass/routes/checkout/manual.js index a805e5e..d7a90aa 100644 --- a/pass/routes/checkout/manual.js +++ b/pass/routes/checkout/manual.js @@ -30,7 +30,6 @@ router.post("/", (req, res) => { let new_order = null; Order.CREATE_NEW_ORDER( req.params.amount, - (req.params.amount / 300) * config.get("price.per_300"), req.data.key.key.get_key(), new Manual(req.body.note)) .then(order => { diff --git a/pass/routes/checkout/paypal.js b/pass/routes/checkout/paypal.js index 21ff598..afca4a7 100644 --- a/pass/routes/checkout/paypal.js +++ b/pass/routes/checkout/paypal.js @@ -60,7 +60,6 @@ router.post("/:funding_source/order/create", async (req, res) => { Order.CREATE_NEW_ORDER( // Create Order on our side req.params.amount, - (req.params.amount / 300) * config.get("price.per_300"), req.data.key.key.get_key(), new Paypal() ) -- GitLab