From ef27c9348b4340b204af29d00c3f00f69f5e02a7 Mon Sep 17 00:00:00 2001 From: Pierre Maurice Schwang Date: Thu, 24 Nov 2022 23:22:02 +0100 Subject: [PATCH 1/4] feat: stripe triggers (payout + transaction) --- .../src/apps/stripe/assets/favicon.svg | 10 ++++++ .../backend/src/apps/stripe/auth/index.ts | 31 +++++++++++++++++ .../src/apps/stripe/auth/is-still-verified.ts | 9 +++++ .../apps/stripe/auth/verify-credentials.ts | 16 +++++++++ .../src/apps/stripe/common/add-auth-header.ts | 8 +++++ .../stripe/common/get-balance-transactions.ts | 34 +++++++++++++++++++ .../src/apps/stripe/common/get-payouts.ts | 34 +++++++++++++++++++ packages/backend/src/apps/stripe/index.ts | 19 +++++++++++ .../triggers/balance-transaction/index.ts | 12 +++++++ .../backend/src/apps/stripe/triggers/index.ts | 4 +++ .../src/apps/stripe/triggers/payouts/index.ts | 12 +++++++ 11 files changed, 189 insertions(+) create mode 100644 packages/backend/src/apps/stripe/assets/favicon.svg create mode 100644 packages/backend/src/apps/stripe/auth/index.ts create mode 100644 packages/backend/src/apps/stripe/auth/is-still-verified.ts create mode 100644 packages/backend/src/apps/stripe/auth/verify-credentials.ts create mode 100644 packages/backend/src/apps/stripe/common/add-auth-header.ts create mode 100644 packages/backend/src/apps/stripe/common/get-balance-transactions.ts create mode 100644 packages/backend/src/apps/stripe/common/get-payouts.ts create mode 100644 packages/backend/src/apps/stripe/index.ts create mode 100644 packages/backend/src/apps/stripe/triggers/balance-transaction/index.ts create mode 100644 packages/backend/src/apps/stripe/triggers/index.ts create mode 100644 packages/backend/src/apps/stripe/triggers/payouts/index.ts diff --git a/packages/backend/src/apps/stripe/assets/favicon.svg b/packages/backend/src/apps/stripe/assets/favicon.svg new file mode 100644 index 00000000..25d00aaa --- /dev/null +++ b/packages/backend/src/apps/stripe/assets/favicon.svg @@ -0,0 +1,10 @@ + + + + + + \ No newline at end of file diff --git a/packages/backend/src/apps/stripe/auth/index.ts b/packages/backend/src/apps/stripe/auth/index.ts new file mode 100644 index 00000000..d2d74554 --- /dev/null +++ b/packages/backend/src/apps/stripe/auth/index.ts @@ -0,0 +1,31 @@ +import verifyCredentials from "./verify-credentials"; +import isStillVerified from "./is-still-verified"; + +export default { + fields: [ + { + key: 'secretKey', + label: 'Secret Key', + type: 'string' as const, + required: true, + readOnly: false, + value: null, + placeholder: null, + description: null, + clickToCopy: false, + }, + { + key: 'displayName', + label: 'Account Name', + type: 'string' as const, + required: true, + readOnly: false, + value: null, + placeholder: null, + description: 'The display name that identifies this stripe connection - most likely the associated account name', + clickToCopy: false, + }, + ], + verifyCredentials, + isStillVerified +}; \ No newline at end of file diff --git a/packages/backend/src/apps/stripe/auth/is-still-verified.ts b/packages/backend/src/apps/stripe/auth/is-still-verified.ts new file mode 100644 index 00000000..4470a643 --- /dev/null +++ b/packages/backend/src/apps/stripe/auth/is-still-verified.ts @@ -0,0 +1,9 @@ +import { IGlobalVariable } from '@automatisch/types'; +import verifyCredentials from "./verify-credentials"; + +const isStillVerified = async ($: IGlobalVariable) => { + await verifyCredentials($); + return true; +}; + +export default isStillVerified; diff --git a/packages/backend/src/apps/stripe/auth/verify-credentials.ts b/packages/backend/src/apps/stripe/auth/verify-credentials.ts new file mode 100644 index 00000000..21320635 --- /dev/null +++ b/packages/backend/src/apps/stripe/auth/verify-credentials.ts @@ -0,0 +1,16 @@ +import { IGlobalVariable } from '@automatisch/types'; + +const verifyCredentials = async ($: IGlobalVariable) => { + try { + await $.http.get( + `/v1/events`, + ); + } catch (e) { + throw new Error('Invalid secret key') + } + await $.auth.set({ + screenName: $.auth.data?.displayName, + }); +}; + +export default verifyCredentials; diff --git a/packages/backend/src/apps/stripe/common/add-auth-header.ts b/packages/backend/src/apps/stripe/common/add-auth-header.ts new file mode 100644 index 00000000..ba6b13cc --- /dev/null +++ b/packages/backend/src/apps/stripe/common/add-auth-header.ts @@ -0,0 +1,8 @@ +import {TBeforeRequest} from "@automatisch/types"; + +const addAuthHeader: TBeforeRequest = ($, requestConfig) => { + requestConfig.headers['Authorization'] = `Bearer ${$.auth.data?.secretKey}` + return requestConfig +} + +export default addAuthHeader; \ No newline at end of file diff --git a/packages/backend/src/apps/stripe/common/get-balance-transactions.ts b/packages/backend/src/apps/stripe/common/get-balance-transactions.ts new file mode 100644 index 00000000..16777cb3 --- /dev/null +++ b/packages/backend/src/apps/stripe/common/get-balance-transactions.ts @@ -0,0 +1,34 @@ +import {IGlobalVariable, IJSONObject} from "@automatisch/types"; +import {URLSearchParams} from "url"; +import {isEmpty, omitBy} from "lodash"; + +const getBalanceTransactions = async ($: IGlobalVariable) => { + let response; + let lastId = undefined; + + do { + const params: IJSONObject = { + starting_after: lastId, + ending_before: $.flow.lastInternalId + } + const queryParams = new URLSearchParams(omitBy(params, isEmpty)) + const requestPath = `/v1/balance_transactions${ + queryParams.toString() ? `?${queryParams.toString()}` : '' + }`; + + response = (await $.http.get(requestPath)).data + for (const entry of response.data) { + $.pushTriggerItem({ + raw: entry, + meta: { + internalId: entry.id as string + } + }) + lastId = entry.id + } + } while (response.has_more) + + return $.triggerOutput; +}; + +export default getBalanceTransactions; \ No newline at end of file diff --git a/packages/backend/src/apps/stripe/common/get-payouts.ts b/packages/backend/src/apps/stripe/common/get-payouts.ts new file mode 100644 index 00000000..c699b7e6 --- /dev/null +++ b/packages/backend/src/apps/stripe/common/get-payouts.ts @@ -0,0 +1,34 @@ +import {IGlobalVariable, IJSONObject} from "@automatisch/types"; +import {URLSearchParams} from "url"; +import {isEmpty, omitBy} from "lodash"; + +const getPayouts = async ($: IGlobalVariable) => { + let response; + let lastId = undefined; + + do { + const params: IJSONObject = { + starting_after: lastId, + ending_before: $.flow.lastInternalId + } + const queryParams = new URLSearchParams(omitBy(params, isEmpty)) + const requestPath = `/v1/payouts${ + queryParams.toString() ? `?${queryParams.toString()}` : '' + }`; + + response = (await $.http.get(requestPath)).data + for (const entry of response.data) { + $.pushTriggerItem({ + raw: entry, + meta: { + internalId: entry.id as string + } + }) + lastId = entry.id + } + } while (response.has_more) + + return $.triggerOutput; +}; + +export default getPayouts; \ No newline at end of file diff --git a/packages/backend/src/apps/stripe/index.ts b/packages/backend/src/apps/stripe/index.ts new file mode 100644 index 00000000..3bc30057 --- /dev/null +++ b/packages/backend/src/apps/stripe/index.ts @@ -0,0 +1,19 @@ +import defineApp from "../../helpers/define-app"; +import addAuthHeader from "./common/add-auth-header"; +import auth from "./auth" +import triggers from "./triggers" + +export default defineApp({ + name: 'Stripe', + key: 'stripe', + iconUrl: '{BASE_URL}/apps/stripe/assets/favicon.svg', + authDocUrl: 'https://automatisch.io/docs/apps/stripe/connection', + supportsConnections: true, + baseUrl: 'https://stripe.com', + apiBaseUrl: 'https://api.stripe.com', + primaryColor: '635bff', + beforeRequest: [addAuthHeader], + auth, + triggers, + actions: [], +}) \ No newline at end of file diff --git a/packages/backend/src/apps/stripe/triggers/balance-transaction/index.ts b/packages/backend/src/apps/stripe/triggers/balance-transaction/index.ts new file mode 100644 index 00000000..8afa282c --- /dev/null +++ b/packages/backend/src/apps/stripe/triggers/balance-transaction/index.ts @@ -0,0 +1,12 @@ +import defineTrigger from "../../../../helpers/define-trigger"; +import getBalanceTransactions from "../../common/get-balance-transactions"; + +export default defineTrigger({ + name: 'Balance Transaction', + key: 'balanceTransaction', + description: 'Triggers when a new transaction is processed (refund, payout, adjustment, ...)', + pollInterval: 15, + async run($) { + await getBalanceTransactions($) + } +}) \ No newline at end of file diff --git a/packages/backend/src/apps/stripe/triggers/index.ts b/packages/backend/src/apps/stripe/triggers/index.ts new file mode 100644 index 00000000..f1a9d0c8 --- /dev/null +++ b/packages/backend/src/apps/stripe/triggers/index.ts @@ -0,0 +1,4 @@ +import balanceTransaction from "./balance-transaction"; +import payouts from "./payouts"; + +export default [balanceTransaction, payouts]; \ No newline at end of file diff --git a/packages/backend/src/apps/stripe/triggers/payouts/index.ts b/packages/backend/src/apps/stripe/triggers/payouts/index.ts new file mode 100644 index 00000000..a982559e --- /dev/null +++ b/packages/backend/src/apps/stripe/triggers/payouts/index.ts @@ -0,0 +1,12 @@ +import defineTrigger from "../../../../helpers/define-trigger"; +import getPayouts from "../../common/get-payouts"; + +export default defineTrigger({ + name: 'Payout', + key: 'payout', + description: 'Triggers when a payout (Stripe <-> Bank account) has been updated', + pollInterval: 15, + async run($) { + await getPayouts($) + } +}) \ No newline at end of file From f25b67c81c9e200cb79b35a8cbbfa07c4f79cadd Mon Sep 17 00:00:00 2001 From: Pierre Maurice Schwang Date: Mon, 28 Nov 2022 19:24:51 +0100 Subject: [PATCH 2/4] docs: add documentation for stripe connection / triggers --- packages/docs/pages/.vitepress/config.js | 8 ++++++++ packages/docs/pages/apps/stripe/connection.md | 14 ++++++++++++++ packages/docs/pages/apps/stripe/triggers.md | 18 ++++++++++++++++++ packages/docs/pages/guide/available-apps.md | 1 + packages/docs/pages/public/favicons/stripe.svg | 10 ++++++++++ 5 files changed, 51 insertions(+) create mode 100644 packages/docs/pages/apps/stripe/connection.md create mode 100644 packages/docs/pages/apps/stripe/triggers.md create mode 100644 packages/docs/pages/public/favicons/stripe.svg diff --git a/packages/docs/pages/.vitepress/config.js b/packages/docs/pages/.vitepress/config.js index 118ebfd1..1ea35237 100644 --- a/packages/docs/pages/.vitepress/config.js +++ b/packages/docs/pages/.vitepress/config.js @@ -105,6 +105,14 @@ export default defineConfig({ { text: 'Connection', link: '/apps/smtp/connection' }, ], }, + { + text: 'Stripe', + collapsible: true, + items: [ + { text: 'Triggers', link: '/apps/stripe/triggers' }, + { text: 'Connection', link: '/apps/stripe/connection' }, + ], + }, { text: 'Twilio', collapsible: true, diff --git a/packages/docs/pages/apps/stripe/connection.md b/packages/docs/pages/apps/stripe/connection.md new file mode 100644 index 00000000..738520ce --- /dev/null +++ b/packages/docs/pages/apps/stripe/connection.md @@ -0,0 +1,14 @@ +# Stripe + +:::info +This page explains the steps you need to follow to set up the Stripe connection in Automatisch. If any of the steps are outdated, please let us know! +::: + +:::info +You are free to use the **Testing secret key** instead of the productive secret key as well. +::: + +1. Go to the [Stripe Dashboard > Developer > API keys](https://dashboard.stripe.com/apikeys) +2. Click on **Reveal live key** in the table row **Secret key** and copy the now shown secret key 3 +3. Paste the **Secret key** in the named field in Automatisch and assign a display name for the connection. +4. Congrats! You can start using the new Stripe connection! diff --git a/packages/docs/pages/apps/stripe/triggers.md b/packages/docs/pages/apps/stripe/triggers.md new file mode 100644 index 00000000..92466ef9 --- /dev/null +++ b/packages/docs/pages/apps/stripe/triggers.md @@ -0,0 +1,18 @@ +--- +favicon: /favicons/stripe.svg +items: + - name: Payout + desc: Triggers when stripe sent a payout to a third-party bank account or vice versa. + org: Stripe Documentation + orgLink: https://stripe.com/docs/api/payouts/object + - name: Balance Transaction + desc: Triggers when a fund has been moved through your stripe account. + org: Stripe Documentation + orgLink: https://stripe.com/docs/api/balance_transactions/object +--- + + + + diff --git a/packages/docs/pages/guide/available-apps.md b/packages/docs/pages/guide/available-apps.md index 854d92e7..5697771f 100644 --- a/packages/docs/pages/guide/available-apps.md +++ b/packages/docs/pages/guide/available-apps.md @@ -15,5 +15,6 @@ Following integrations are currently supported by Automatisch. - [Scheduler](/apps/scheduler/triggers) - [Slack](/apps/slack/actions) - [SMTP](/apps/smtp/actions) +- [Stripe](/apps/stripe/triggers) - [Twilio](/apps/twilio/triggers) - [Twitter](/apps/twitter/triggers) diff --git a/packages/docs/pages/public/favicons/stripe.svg b/packages/docs/pages/public/favicons/stripe.svg new file mode 100644 index 00000000..25d00aaa --- /dev/null +++ b/packages/docs/pages/public/favicons/stripe.svg @@ -0,0 +1,10 @@ + + + + + + \ No newline at end of file From 34e2c779345c67a628d6532d1b2f955cb494f94b Mon Sep 17 00:00:00 2001 From: Pierre Maurice Schwang Date: Tue, 29 Nov 2022 20:03:16 +0100 Subject: [PATCH 3/4] chore: address review comments --- .../backend/src/apps/stripe/auth/index.ts | 52 +++++++++---------- .../apps/stripe/auth/verify-credentials.ts | 10 ++-- .../src/apps/stripe/common/add-auth-header.ts | 4 +- .../stripe/common/get-balance-transactions.ts | 34 ------------ .../src/apps/stripe/common/get-payouts.ts | 34 ------------ packages/backend/src/apps/stripe/index.ts | 24 ++++----- .../get-balance-transactions.ts | 32 ++++++++++++ .../triggers/balance-transaction/index.ts | 16 +++--- .../stripe/triggers/payouts/get-payouts.ts | 32 ++++++++++++ .../src/apps/stripe/triggers/payouts/index.ts | 16 +++--- packages/docs/pages/apps/stripe/connection.md | 2 +- packages/docs/pages/apps/stripe/triggers.md | 4 +- 12 files changed, 126 insertions(+), 134 deletions(-) delete mode 100644 packages/backend/src/apps/stripe/common/get-balance-transactions.ts delete mode 100644 packages/backend/src/apps/stripe/common/get-payouts.ts create mode 100644 packages/backend/src/apps/stripe/triggers/balance-transaction/get-balance-transactions.ts create mode 100644 packages/backend/src/apps/stripe/triggers/payouts/get-payouts.ts diff --git a/packages/backend/src/apps/stripe/auth/index.ts b/packages/backend/src/apps/stripe/auth/index.ts index d2d74554..f25205f1 100644 --- a/packages/backend/src/apps/stripe/auth/index.ts +++ b/packages/backend/src/apps/stripe/auth/index.ts @@ -2,30 +2,30 @@ import verifyCredentials from "./verify-credentials"; import isStillVerified from "./is-still-verified"; export default { - fields: [ - { - key: 'secretKey', - label: 'Secret Key', - type: 'string' as const, - required: true, - readOnly: false, - value: null, - placeholder: null, - description: null, - clickToCopy: false, - }, - { - key: 'displayName', - label: 'Account Name', - type: 'string' as const, - required: true, - readOnly: false, - value: null, - placeholder: null, - description: 'The display name that identifies this stripe connection - most likely the associated account name', - clickToCopy: false, - }, - ], - verifyCredentials, - isStillVerified + fields: [ + { + key: 'secretKey', + label: 'Secret Key', + type: 'string' as const, + required: true, + readOnly: false, + value: null, + placeholder: null, + description: null, + clickToCopy: false, + }, + { + key: 'displayName', + label: 'Account Name', + type: 'string' as const, + required: true, + readOnly: false, + value: null, + placeholder: null, + description: 'The display name that identifies this stripe connection - most likely the associated account name', + clickToCopy: false, + }, + ], + verifyCredentials, + isStillVerified }; \ No newline at end of file diff --git a/packages/backend/src/apps/stripe/auth/verify-credentials.ts b/packages/backend/src/apps/stripe/auth/verify-credentials.ts index 21320635..1297d9df 100644 --- a/packages/backend/src/apps/stripe/auth/verify-credentials.ts +++ b/packages/backend/src/apps/stripe/auth/verify-credentials.ts @@ -1,13 +1,9 @@ import { IGlobalVariable } from '@automatisch/types'; const verifyCredentials = async ($: IGlobalVariable) => { - try { - await $.http.get( - `/v1/events`, - ); - } catch (e) { - throw new Error('Invalid secret key') - } + await $.http.get( + `/v1/events`, + ); await $.auth.set({ screenName: $.auth.data?.displayName, }); diff --git a/packages/backend/src/apps/stripe/common/add-auth-header.ts b/packages/backend/src/apps/stripe/common/add-auth-header.ts index ba6b13cc..2e393e9c 100644 --- a/packages/backend/src/apps/stripe/common/add-auth-header.ts +++ b/packages/backend/src/apps/stripe/common/add-auth-header.ts @@ -1,8 +1,8 @@ import {TBeforeRequest} from "@automatisch/types"; const addAuthHeader: TBeforeRequest = ($, requestConfig) => { - requestConfig.headers['Authorization'] = `Bearer ${$.auth.data?.secretKey}` - return requestConfig + requestConfig.headers['Authorization'] = `Bearer ${$.auth.data?.secretKey}` + return requestConfig } export default addAuthHeader; \ No newline at end of file diff --git a/packages/backend/src/apps/stripe/common/get-balance-transactions.ts b/packages/backend/src/apps/stripe/common/get-balance-transactions.ts deleted file mode 100644 index 16777cb3..00000000 --- a/packages/backend/src/apps/stripe/common/get-balance-transactions.ts +++ /dev/null @@ -1,34 +0,0 @@ -import {IGlobalVariable, IJSONObject} from "@automatisch/types"; -import {URLSearchParams} from "url"; -import {isEmpty, omitBy} from "lodash"; - -const getBalanceTransactions = async ($: IGlobalVariable) => { - let response; - let lastId = undefined; - - do { - const params: IJSONObject = { - starting_after: lastId, - ending_before: $.flow.lastInternalId - } - const queryParams = new URLSearchParams(omitBy(params, isEmpty)) - const requestPath = `/v1/balance_transactions${ - queryParams.toString() ? `?${queryParams.toString()}` : '' - }`; - - response = (await $.http.get(requestPath)).data - for (const entry of response.data) { - $.pushTriggerItem({ - raw: entry, - meta: { - internalId: entry.id as string - } - }) - lastId = entry.id - } - } while (response.has_more) - - return $.triggerOutput; -}; - -export default getBalanceTransactions; \ No newline at end of file diff --git a/packages/backend/src/apps/stripe/common/get-payouts.ts b/packages/backend/src/apps/stripe/common/get-payouts.ts deleted file mode 100644 index c699b7e6..00000000 --- a/packages/backend/src/apps/stripe/common/get-payouts.ts +++ /dev/null @@ -1,34 +0,0 @@ -import {IGlobalVariable, IJSONObject} from "@automatisch/types"; -import {URLSearchParams} from "url"; -import {isEmpty, omitBy} from "lodash"; - -const getPayouts = async ($: IGlobalVariable) => { - let response; - let lastId = undefined; - - do { - const params: IJSONObject = { - starting_after: lastId, - ending_before: $.flow.lastInternalId - } - const queryParams = new URLSearchParams(omitBy(params, isEmpty)) - const requestPath = `/v1/payouts${ - queryParams.toString() ? `?${queryParams.toString()}` : '' - }`; - - response = (await $.http.get(requestPath)).data - for (const entry of response.data) { - $.pushTriggerItem({ - raw: entry, - meta: { - internalId: entry.id as string - } - }) - lastId = entry.id - } - } while (response.has_more) - - return $.triggerOutput; -}; - -export default getPayouts; \ No newline at end of file diff --git a/packages/backend/src/apps/stripe/index.ts b/packages/backend/src/apps/stripe/index.ts index 3bc30057..505f13bf 100644 --- a/packages/backend/src/apps/stripe/index.ts +++ b/packages/backend/src/apps/stripe/index.ts @@ -4,16 +4,16 @@ import auth from "./auth" import triggers from "./triggers" export default defineApp({ - name: 'Stripe', - key: 'stripe', - iconUrl: '{BASE_URL}/apps/stripe/assets/favicon.svg', - authDocUrl: 'https://automatisch.io/docs/apps/stripe/connection', - supportsConnections: true, - baseUrl: 'https://stripe.com', - apiBaseUrl: 'https://api.stripe.com', - primaryColor: '635bff', - beforeRequest: [addAuthHeader], - auth, - triggers, - actions: [], + name: 'Stripe', + key: 'stripe', + iconUrl: '{BASE_URL}/apps/stripe/assets/favicon.svg', + authDocUrl: 'https://automatisch.io/docs/apps/stripe/connection', + supportsConnections: true, + baseUrl: 'https://stripe.com', + apiBaseUrl: 'https://api.stripe.com', + primaryColor: '635bff', + beforeRequest: [addAuthHeader], + auth, + triggers, + actions: [], }) \ No newline at end of file diff --git a/packages/backend/src/apps/stripe/triggers/balance-transaction/get-balance-transactions.ts b/packages/backend/src/apps/stripe/triggers/balance-transaction/get-balance-transactions.ts new file mode 100644 index 00000000..d70f1bfe --- /dev/null +++ b/packages/backend/src/apps/stripe/triggers/balance-transaction/get-balance-transactions.ts @@ -0,0 +1,32 @@ +import {IGlobalVariable, IJSONObject} from "@automatisch/types"; +import {URLSearchParams} from "url"; +import {isEmpty, omitBy} from "lodash"; + +const getBalanceTransactions = async ($: IGlobalVariable) => { + let response; + let lastId = undefined; + + do { + const params: IJSONObject = { + starting_after: lastId, + ending_before: $.flow.lastInternalId + } + const queryParams = new URLSearchParams(omitBy(params, isEmpty)) + const requestPath = `/v1/balance_transactions${ + queryParams.toString() ? `?${queryParams.toString()}` : '' + }`; + + response = (await $.http.get(requestPath)).data + for (const entry of response.data) { + $.pushTriggerItem({ + raw: entry, + meta: { + internalId: entry.id as string + } + }) + lastId = entry.id + } + } while (response.has_more) +}; + +export default getBalanceTransactions; \ No newline at end of file diff --git a/packages/backend/src/apps/stripe/triggers/balance-transaction/index.ts b/packages/backend/src/apps/stripe/triggers/balance-transaction/index.ts index 8afa282c..3043eecc 100644 --- a/packages/backend/src/apps/stripe/triggers/balance-transaction/index.ts +++ b/packages/backend/src/apps/stripe/triggers/balance-transaction/index.ts @@ -1,12 +1,12 @@ import defineTrigger from "../../../../helpers/define-trigger"; -import getBalanceTransactions from "../../common/get-balance-transactions"; +import getBalanceTransactions from "./get-balance-transactions"; export default defineTrigger({ - name: 'Balance Transaction', - key: 'balanceTransaction', - description: 'Triggers when a new transaction is processed (refund, payout, adjustment, ...)', - pollInterval: 15, - async run($) { - await getBalanceTransactions($) - } + name: 'New Balance Transactions', + key: 'balanceTransaction', + description: 'Triggers when a new transaction is processed (refund, payout, adjustment, ...)', + pollInterval: 15, + async run($) { + await getBalanceTransactions($) + } }) \ No newline at end of file diff --git a/packages/backend/src/apps/stripe/triggers/payouts/get-payouts.ts b/packages/backend/src/apps/stripe/triggers/payouts/get-payouts.ts new file mode 100644 index 00000000..8791f89a --- /dev/null +++ b/packages/backend/src/apps/stripe/triggers/payouts/get-payouts.ts @@ -0,0 +1,32 @@ +import {IGlobalVariable, IJSONObject} from "@automatisch/types"; +import {URLSearchParams} from "url"; +import {isEmpty, omitBy} from "lodash"; + +const getPayouts = async ($: IGlobalVariable) => { + let response; + let lastId = undefined; + + do { + const params: IJSONObject = { + starting_after: lastId, + ending_before: $.flow.lastInternalId + } + const queryParams = new URLSearchParams(omitBy(params, isEmpty)) + const requestPath = `/v1/payouts${ + queryParams.toString() ? `?${queryParams.toString()}` : '' + }`; + + response = (await $.http.get(requestPath)).data + for (const entry of response.data) { + $.pushTriggerItem({ + raw: entry, + meta: { + internalId: entry.id as string + } + }) + lastId = entry.id + } + } while (response.has_more) +}; + +export default getPayouts; \ No newline at end of file diff --git a/packages/backend/src/apps/stripe/triggers/payouts/index.ts b/packages/backend/src/apps/stripe/triggers/payouts/index.ts index a982559e..2226a591 100644 --- a/packages/backend/src/apps/stripe/triggers/payouts/index.ts +++ b/packages/backend/src/apps/stripe/triggers/payouts/index.ts @@ -1,12 +1,12 @@ import defineTrigger from "../../../../helpers/define-trigger"; -import getPayouts from "../../common/get-payouts"; +import getPayouts from "./get-payouts"; export default defineTrigger({ - name: 'Payout', - key: 'payout', - description: 'Triggers when a payout (Stripe <-> Bank account) has been updated', - pollInterval: 15, - async run($) { - await getPayouts($) - } + name: 'New Payouts', + key: 'payout', + description: 'Triggers when a payout (Stripe <-> Bank account) has been updated', + pollInterval: 15, + async run($) { + await getPayouts($) + } }) \ No newline at end of file diff --git a/packages/docs/pages/apps/stripe/connection.md b/packages/docs/pages/apps/stripe/connection.md index 738520ce..0cd174eb 100644 --- a/packages/docs/pages/apps/stripe/connection.md +++ b/packages/docs/pages/apps/stripe/connection.md @@ -9,6 +9,6 @@ You are free to use the **Testing secret key** instead of the productive secret ::: 1. Go to the [Stripe Dashboard > Developer > API keys](https://dashboard.stripe.com/apikeys) -2. Click on **Reveal live key** in the table row **Secret key** and copy the now shown secret key 3 +2. Click on **Reveal live key** in the table row **Secret key** and copy the now shown secret key 3. Paste the **Secret key** in the named field in Automatisch and assign a display name for the connection. 4. Congrats! You can start using the new Stripe connection! diff --git a/packages/docs/pages/apps/stripe/triggers.md b/packages/docs/pages/apps/stripe/triggers.md index 92466ef9..dea401bf 100644 --- a/packages/docs/pages/apps/stripe/triggers.md +++ b/packages/docs/pages/apps/stripe/triggers.md @@ -1,11 +1,11 @@ --- favicon: /favicons/stripe.svg items: - - name: Payout + - name: New Payouts desc: Triggers when stripe sent a payout to a third-party bank account or vice versa. org: Stripe Documentation orgLink: https://stripe.com/docs/api/payouts/object - - name: Balance Transaction + - name: New Balance Transactions desc: Triggers when a fund has been moved through your stripe account. org: Stripe Documentation orgLink: https://stripe.com/docs/api/balance_transactions/object From 1d6ed8d9d0ca3cd6b639b0e6ee66968423b59967 Mon Sep 17 00:00:00 2001 From: Pierre Maurice Schwang Date: Tue, 29 Nov 2022 21:32:20 +0100 Subject: [PATCH 4/4] chore: align trigger key with trigger name --- .../src/apps/stripe/triggers/balance-transaction/index.ts | 2 +- packages/backend/src/apps/stripe/triggers/payouts/index.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/backend/src/apps/stripe/triggers/balance-transaction/index.ts b/packages/backend/src/apps/stripe/triggers/balance-transaction/index.ts index 3043eecc..27f410ea 100644 --- a/packages/backend/src/apps/stripe/triggers/balance-transaction/index.ts +++ b/packages/backend/src/apps/stripe/triggers/balance-transaction/index.ts @@ -3,7 +3,7 @@ import getBalanceTransactions from "./get-balance-transactions"; export default defineTrigger({ name: 'New Balance Transactions', - key: 'balanceTransaction', + key: 'newBalanceTransactions', description: 'Triggers when a new transaction is processed (refund, payout, adjustment, ...)', pollInterval: 15, async run($) { diff --git a/packages/backend/src/apps/stripe/triggers/payouts/index.ts b/packages/backend/src/apps/stripe/triggers/payouts/index.ts index 2226a591..324b09dd 100644 --- a/packages/backend/src/apps/stripe/triggers/payouts/index.ts +++ b/packages/backend/src/apps/stripe/triggers/payouts/index.ts @@ -3,7 +3,7 @@ import getPayouts from "./get-payouts"; export default defineTrigger({ name: 'New Payouts', - key: 'payout', + key: 'newPayouts', description: 'Triggers when a payout (Stripe <-> Bank account) has been updated', pollInterval: 15, async run($) {