From 5231d8d0eee91215d62c4efb0d3814b49140b7a2 Mon Sep 17 00:00:00 2001 From: Damian Karzon Date: Fri, 12 Jan 2024 14:16:42 +1000 Subject: [PATCH] Split out some specific events from the firehose events trigger so they can be defined better and easier to use. payer-created payer-updated realtime-payment scheduled-process --- creates/payment_create_realtime.js | 6 +-- creates/payment_create_scheduled.js | 6 +-- package.json | 2 +- samples/sample_payer.js | 14 ++++++ samples/{payment.js => sample_payment.js} | 47 ++++++++++++++++---- triggers/evt_payer_created.js | 54 +++++++++++++++++++++++ triggers/evt_payer_updated.js | 54 +++++++++++++++++++++++ triggers/evt_realtime_payment.js | 47 ++++++++++++++++++++ triggers/evt_scheduled_process.js | 49 ++++++++++++++++++++ 9 files changed, 263 insertions(+), 16 deletions(-) create mode 100644 samples/sample_payer.js rename samples/{payment.js => sample_payment.js} (82%) create mode 100644 triggers/evt_payer_created.js create mode 100644 triggers/evt_payer_updated.js create mode 100644 triggers/evt_realtime_payment.js create mode 100644 triggers/evt_scheduled_process.js diff --git a/creates/payment_create_realtime.js b/creates/payment_create_realtime.js index 61b260b..320a03d 100644 --- a/creates/payment_create_realtime.js +++ b/creates/payment_create_realtime.js @@ -1,6 +1,6 @@ const { BASE_URL } = require('../constants'); -const { PaymentSample, PaymentOutputFields } = require('../samples/payment'); +const { paymentSample, singlePaymentOutputFields } = require('../samples/sample_payment'); const createPayment = (z, bundle) => { const options = { @@ -125,8 +125,8 @@ module.exports = { altersDynamicFields: false, }, ], - sample: PaymentSample, - outputFields: PaymentOutputFields, + sample: paymentSample, + outputFields: singlePaymentOutputFields, }, key: 'payment_create_realtime', noun: 'Payment', diff --git a/creates/payment_create_scheduled.js b/creates/payment_create_scheduled.js index 1c2b729..3a53637 100644 --- a/creates/payment_create_scheduled.js +++ b/creates/payment_create_scheduled.js @@ -1,6 +1,6 @@ const { BASE_URL } = require('../constants'); -const { PaymentSample, PaymentOutputFields } = require('../samples/payment'); +const { paymentSample, singlePaymentOutputFields } = require('../samples/sample_payment'); const createPayment = (z, bundle) => { @@ -73,8 +73,8 @@ module.exports = { altersDynamicFields: false, }, ], - sample: PaymentSample, - outputFields: PaymentOutputFields, + sample: paymentSample, + outputFields: singlePaymentOutputFields, }, key: 'payment_create_scheduled', noun: 'Payment', diff --git a/package.json b/package.json index bfba6ba..0e0a619 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "pinch-payments", - "version": "1.0.4", + "version": "1.1.0", "description": "Pinch is a PCI Compliant, Australian payments platform offering automated Bank Account Direct Debit and Credit Card payments for standard and repeating invoices or standalone transactions.", "main": "index.js", "scripts": { diff --git a/samples/sample_payer.js b/samples/sample_payer.js new file mode 100644 index 0000000..b22a238 --- /dev/null +++ b/samples/sample_payer.js @@ -0,0 +1,14 @@ +module.exports = { + id: "pyr_XXXXXXXXXXXXXX", + firstName: "John", + lastName: "Smith", + emailAddress: "pinch+zapier@mailinator.com", + mobileNumber: null, + streetAddress: null, + suburb: null, + postcode: null, + state: null, + country: null, + companyName: null, + metadata: "" +} \ No newline at end of file diff --git a/samples/payment.js b/samples/sample_payment.js similarity index 82% rename from samples/payment.js rename to samples/sample_payment.js index 97b02b2..d196e58 100644 --- a/samples/payment.js +++ b/samples/sample_payment.js @@ -1,6 +1,6 @@ 'use strict'; -const PaymentSample = { +const paymentSample = { id: 'pmt_XXXXXXXXXXXXXX', attemptId: 'att_XXXXXXXX', amount: 1000, @@ -29,7 +29,11 @@ const PaymentSample = { companyRegistrationNumber: null, metadata: null, }, - subscription: null, + subscription: { + id: "sub_XXXXXXXXXXXXXX", + planId: "pln_XXXXXXXXXXXXXX", + planName: "Monthly Payments" + }, attempts: [ { id: 'att_XXXXXXXX', @@ -77,8 +81,7 @@ const PaymentSample = { metadata: null, }; - -const PaymentOutputFields = [ +const corePaymentOutputFields = [ { key: 'id', type: 'string' }, { key: 'attemptId', type: 'string' }, { key: 'amount', type: 'integer' }, @@ -105,7 +108,14 @@ const PaymentOutputFields = [ { key: 'payer__companyName', type: 'string' }, { key: 'payer__companyRegistrationNumber', type: 'string' }, { key: 'payer__metadata', dict: true }, - { key: 'subscription' }, + { key: 'subscription__id', type: 'string' }, + { key: 'subscription__planId', type: 'string' }, + { key: 'subscription__planName', type: 'string' }, + { key: 'metadata', dict: true }, +]; + +const singlePaymentOutputFields = [ + ...corePaymentOutputFields, { key: 'attempts[]id', type: 'string' }, { key: 'attempts[]amount', type: 'integer' }, { key: 'attempts[]currency', type: 'string' }, @@ -141,11 +151,30 @@ const PaymentOutputFields = [ { key: 'attempts[]fees__convertedTotalFee', type: 'number' }, { key: 'attempts[]fees__convertedCurrency', type: 'string' }, { key: 'attempts[]fees__conversionRate', type: 'number' }, - { key: 'attempts[]status' }, - { key: 'metadata', dict: true }, + { key: 'attempts[]status' } ]; +const eventSinglePaymentOutputFields = () => { + var eventPaymentOutputs = []; + corePaymentOutputFields.forEach(field => { + var fieldClone = structuredClone(field); + fieldClone.key = 'data__payment__' + fieldClone.key; + eventPaymentOutputs.push(fieldClone); + }); +}; + +const eventProcessedPaymentsOutputFields = () => { + var eventPaymentOutputs = []; + corePaymentOutputFields.forEach(field => { + var fieldClone = structuredClone(field); + fieldClone.key = 'data__payments[]' + fieldClone.key; + eventPaymentOutputs.push(fieldClone); + }); +}; + module.exports = { - PaymentSample, - PaymentOutputFields + paymentSample, + singlePaymentOutputFields, + eventSinglePaymentOutputFields, + eventProcessedPaymentsOutputFields }; diff --git a/triggers/evt_payer_created.js b/triggers/evt_payer_created.js new file mode 100644 index 0000000..b358be9 --- /dev/null +++ b/triggers/evt_payer_created.js @@ -0,0 +1,54 @@ +const { BASE_URL } = require('../constants'); +const samplePayer = require('../samples/sample_issue'); + +const perform = (z, bundle) => { + const options = { + url: `${BASE_URL}/${bundle.authData.environment}/events`, + method: 'GET', + headers: { }, + params: { + page: bundle.meta.page + 1, + eventType: 'payer-created', + }, + }; + + return z.request(options).then((response) => { + response.throwForStatus(); + const results = response.data; + return results.data; + }); +}; + +module.exports = { + operation: { + perform: perform, + canPaginate: true, + inputFields: [], + sample: { + id: 'evt_XXXXXXXXXXXXXX', + type: 'payer-created', + eventDate: '2024-01-01T01:01:00Z', + metadata: { payerName: "John Smith" }, + data: { + payer: samplePayer + } + }, + outputFields: [ + { key: 'id', type: 'string' }, + { key: 'type', type: 'string' }, + { key: 'eventDate', type: 'datetime' }, + { key: 'metadata', dict: true }, + { key: 'data__payer__id', type: 'string' }, + { key: 'data__payer__firstName', type: 'string' }, + { key: 'data__payer__lastName', type: 'string' }, + { key: 'data__payer__emailAddress', type: 'string' }, + { key: 'data__payer__companyName', type: 'string' } + ], + }, + key: 'evt_payer_created', + noun: 'Event', + display: { + label: 'Payer Created Event', + description: 'Triggers when a Payer is created.' + }, +}; diff --git a/triggers/evt_payer_updated.js b/triggers/evt_payer_updated.js new file mode 100644 index 0000000..c1526db --- /dev/null +++ b/triggers/evt_payer_updated.js @@ -0,0 +1,54 @@ +const { BASE_URL } = require('../constants'); +const samplePayer = require('../samples/sample_issue'); + +const perform = (z, bundle) => { + const options = { + url: `${BASE_URL}/${bundle.authData.environment}/events`, + method: 'GET', + headers: { }, + params: { + page: bundle.meta.page + 1, + eventType: 'payer-updated', + }, + }; + + return z.request(options).then((response) => { + response.throwForStatus(); + const results = response.data; + return results.data; + }); +}; + +module.exports = { + operation: { + perform: perform, + canPaginate: true, + inputFields: [], + sample: { + id: 'evt_XXXXXXXXXXXXXX', + type: 'payer-updated', + eventDate: '2024-01-01T01:01:00Z', + metadata: { payerName: "John Smith" }, + data: { + payer: samplePayer + } + }, + outputFields: [ + { key: 'id', type: 'string' }, + { key: 'type', type: 'string' }, + { key: 'eventDate', type: 'datetime' }, + { key: 'metadata', dict: true }, + { key: 'data__payer__id', type: 'string' }, + { key: 'data__payer__firstName', type: 'string' }, + { key: 'data__payer__lastName', type: 'string' }, + { key: 'data__payer__emailAddress', type: 'string' }, + { key: 'data__payer__companyName', type: 'string' } + ], + }, + key: 'evt_payer_updated', + noun: 'Event', + display: { + label: 'Payer Updated Event', + description: 'Triggers when a Payer is updated.' + }, +}; diff --git a/triggers/evt_realtime_payment.js b/triggers/evt_realtime_payment.js new file mode 100644 index 0000000..e3f8eb6 --- /dev/null +++ b/triggers/evt_realtime_payment.js @@ -0,0 +1,47 @@ +const { BASE_URL } = require('../constants'); +const { PaymentSample, eventSinglePaymentOutputFields } = require('../samples/sample_payment'); + +const perform = (z, bundle) => { + const options = { + url: `${BASE_URL}/${bundle.authData.environment}/events`, + method: 'GET', + headers: { }, + params: { + page: bundle.meta.page + 1, + eventType: 'realtime-payment', + }, + }; + + return z.request(options).then((response) => { + response.throwForStatus(); + const results = response.data; + return results.data; + }); +}; + +module.exports = { + operation: { + perform: perform, + canPaginate: true, + inputFields: [], + sample: { + id: 'evt_XXXXXXXXXXXXXX', + type: 'realtime-payment', + eventDate: '2024-01-01T01:01:00Z', + metadata: { + status: "approved", + amount: 1000 + }, + data: { + payment: PaymentSample + } + }, + outputFields: eventSinglePaymentOutputFields(), + }, + key: 'evt_realtime_payment', + noun: 'Event', + display: { + label: 'Realtime Payment Event', + description: 'Triggers when a realtime Payment occurs.' + }, +}; diff --git a/triggers/evt_scheduled_process.js b/triggers/evt_scheduled_process.js new file mode 100644 index 0000000..1d2f3ae --- /dev/null +++ b/triggers/evt_scheduled_process.js @@ -0,0 +1,49 @@ +const { BASE_URL } = require('../constants'); +const { paymentSample, eventProcessedPaymentsOutputFields } = require('../samples/sample_payment'); + +const perform = (z, bundle) => { + const options = { + url: `${BASE_URL}/${bundle.authData.environment}/events`, + method: 'GET', + headers: { }, + params: { + page: bundle.meta.page + 1, + eventType: 'scheduled-process', + }, + }; + + return z.request(options).then((response) => { + response.throwForStatus(); + const results = response.data; + return results.data; + }); +}; + +module.exports = { + operation: { + perform: perform, + canPaginate: true, + inputFields: [], + sample: { + id: 'evt_XXXXXXXXXXXXXX', + type: 'scheduled-process', + eventDate: '2024-01-01T01:01:00Z', + metadata: { + status: "approved", + amount: 1000 + }, + data: { + payments: [ + paymentSample + ] + } + }, + outputFields: eventProcessedPaymentsOutputFields, + }, + key: 'evt_scheduled_process', + noun: 'Event', + display: { + label: 'Scheduled Process Event', + description: 'Triggers when a Scheduled Payments are processed.' + }, +};