Compare commits
314 Commits
d-x
...
shared-con
Author | SHA1 | Date | |
---|---|---|---|
![]() |
8f09681771 | ||
![]() |
3801f9cfa0 | ||
![]() |
b6eea0b5fc | ||
![]() |
099a8ea2cf | ||
![]() |
aefff5c861 | ||
![]() |
a296b5e645 | ||
![]() |
eb486a3a07 | ||
![]() |
062b8521ba | ||
![]() |
1b07f3195a | ||
![]() |
dfa7d4cb8d | ||
![]() |
a14dd9666c | ||
![]() |
b07bd4374f | ||
![]() |
b4e12b0ea8 | ||
![]() |
ee5c17bb85 | ||
![]() |
16c9d3400c | ||
![]() |
4dd994348d | ||
![]() |
f0cbfafc24 | ||
![]() |
d3f38f5488 | ||
![]() |
737090a67a | ||
![]() |
4f66a4d090 | ||
![]() |
df54f909c1 | ||
![]() |
772b195eca | ||
![]() |
87866e34ed | ||
![]() |
c98ac05097 | ||
![]() |
36f991b6f9 | ||
![]() |
a81c5164fc | ||
![]() |
5942482690 | ||
![]() |
4f538ca2fc | ||
![]() |
9f2281a3e2 | ||
![]() |
b0d2f28c78 | ||
![]() |
d4380a4426 | ||
![]() |
ae2738d4cc | ||
![]() |
aa5ae028b2 | ||
![]() |
7ab8c76aa0 | ||
![]() |
8075b65e14 | ||
![]() |
073ce3bf1b | ||
![]() |
80fcbfe01b | ||
![]() |
dba0041e5f | ||
![]() |
b8a44afd25 | ||
![]() |
e2445bf585 | ||
![]() |
50706c524e | ||
![]() |
11e0cb9398 | ||
![]() |
1e82e40802 | ||
![]() |
ff00644e62 | ||
![]() |
97bcd3792b | ||
![]() |
5738a09771 | ||
![]() |
c461cc4878 | ||
![]() |
878fab347a | ||
![]() |
354b331b08 | ||
![]() |
3b9aadb90f | ||
![]() |
7193d018ce | ||
![]() |
d5cea034ac | ||
![]() |
a2760c10b3 | ||
![]() |
5492fae213 | ||
![]() |
490a23ae0a | ||
![]() |
3593cf3808 | ||
![]() |
6ea7400ff4 | ||
![]() |
1a4ba35ef4 | ||
![]() |
2d52cab693 | ||
![]() |
e1fac78aba | ||
![]() |
e79fc9cae4 | ||
![]() |
9200e1011b | ||
![]() |
373d29eeab | ||
![]() |
bc337c588a | ||
![]() |
112b05f7ad | ||
![]() |
9f84af95f6 | ||
![]() |
0873cfa997 | ||
![]() |
94d7162782 | ||
![]() |
5db62679fa | ||
![]() |
a4a0102679 | ||
![]() |
2afcfbb4bc | ||
![]() |
f0e8f070a8 | ||
![]() |
c42374e031 | ||
![]() |
be610c7fa9 | ||
![]() |
4ff824663b | ||
![]() |
1581b5ac0a | ||
![]() |
5fb48ed54b | ||
![]() |
903e9e6093 | ||
![]() |
d30e491817 | ||
![]() |
aa727e3260 | ||
![]() |
1cad3a7149 | ||
![]() |
3b7f6740bb | ||
![]() |
2febc5efad | ||
![]() |
903616bef6 | ||
![]() |
c944193fb4 | ||
![]() |
4f2155ea63 | ||
![]() |
4bda1edda7 | ||
![]() |
1a55cc8604 | ||
![]() |
bf7ab475ee | ||
![]() |
2f39efb935 | ||
![]() |
9f8eb985e4 | ||
![]() |
3549fef71c | ||
![]() |
2cfa64c2a3 | ||
![]() |
7245a0a599 | ||
![]() |
0633da3244 | ||
![]() |
96341976f5 | ||
![]() |
9abfaec4d5 | ||
![]() |
945c52dd6b | ||
![]() |
6567d24760 | ||
![]() |
ffaf9b6e0c | ||
![]() |
463e6908b1 | ||
![]() |
e185ceb385 | ||
![]() |
1b21bbe5b7 | ||
![]() |
14b7053ed8 | ||
![]() |
2760526def | ||
![]() |
d851db22d0 | ||
![]() |
2fa360e400 | ||
![]() |
e4eb146169 | ||
![]() |
86611453b5 | ||
![]() |
65f9d1b6b9 | ||
![]() |
2fceaf2cf4 | ||
![]() |
d82b50fcdb | ||
![]() |
ab6e49bf4f | ||
![]() |
ee90422f56 | ||
![]() |
627184f124 | ||
![]() |
fa02edfefc | ||
![]() |
61afebc827 | ||
![]() |
a4c22799e7 | ||
![]() |
870a110a75 | ||
![]() |
8c859f9408 | ||
![]() |
0a36101da1 | ||
![]() |
c1bf063b12 | ||
![]() |
0da56a800d | ||
![]() |
4d2172d153 | ||
![]() |
d0fab0e1f1 | ||
![]() |
4cedbdbc60 | ||
![]() |
a82d34cbce | ||
![]() |
16d0c243c7 | ||
![]() |
855901bd9e | ||
![]() |
6be8a581d2 | ||
![]() |
655deb12c8 | ||
![]() |
31b1b9457b | ||
![]() |
c4394228f2 | ||
![]() |
98e6dbe141 | ||
![]() |
4fac1ef7c4 | ||
![]() |
034bc6a79e | ||
![]() |
94e64676af | ||
![]() |
3a638220af | ||
![]() |
0772308bf5 | ||
![]() |
9f5ea80731 | ||
![]() |
fb1f520096 | ||
![]() |
dd36609443 | ||
![]() |
4eace3fb7e | ||
![]() |
f13e93e2ce | ||
![]() |
da4f8ab529 | ||
![]() |
b6ff4ec992 | ||
![]() |
25f6cac69a | ||
![]() |
172a8934e3 | ||
![]() |
aead014bcf | ||
![]() |
59770c80db | ||
![]() |
6d6b77148d | ||
![]() |
c1e8f5765f | ||
![]() |
76e442940b | ||
![]() |
b2205097da | ||
![]() |
14886d42e8 | ||
![]() |
2f35403078 | ||
![]() |
961d55a1c6 | ||
![]() |
0fca0ef734 | ||
![]() |
cc3acd81bc | ||
![]() |
69a691c19e | ||
![]() |
e0a4f5c9c9 | ||
![]() |
cabf9b8fb8 | ||
![]() |
61e24da07d | ||
![]() |
648511dfad | ||
![]() |
dfc9efc31a | ||
![]() |
b58a22addc | ||
![]() |
e07a9eeda2 | ||
![]() |
f0de42fa63 | ||
![]() |
0121661ad0 | ||
![]() |
fb6e46bd69 | ||
![]() |
9bd041799b | ||
![]() |
9e191c4ed9 | ||
![]() |
794b4cf26a | ||
![]() |
2d8421943f | ||
![]() |
48dc2312d9 | ||
![]() |
cdf7a1adc4 | ||
![]() |
99ebd12081 | ||
![]() |
859337b5c1 | ||
![]() |
1e601559a0 | ||
![]() |
9314cba724 | ||
![]() |
25224f0308 | ||
![]() |
9a981d5373 | ||
![]() |
c7116361ab | ||
![]() |
1f17236c4f | ||
![]() |
67f415de35 | ||
![]() |
b890150817 | ||
![]() |
4de1fc49df | ||
![]() |
fb80d5d70d | ||
![]() |
eaa25e412a | ||
![]() |
706142f98e | ||
![]() |
36a72d0a32 | ||
![]() |
1d44d387ac | ||
![]() |
f93c41f2d8 | ||
![]() |
5b13f880c8 | ||
![]() |
c4af873036 | ||
![]() |
fe820fb4fe | ||
![]() |
82ad0735d2 | ||
![]() |
8b0a421924 | ||
![]() |
d44cb3d92e | ||
![]() |
5f335ef5b3 | ||
![]() |
5831bf9653 | ||
![]() |
2480dfbb6d | ||
![]() |
162b352ea5 | ||
![]() |
9f30d7d7ba | ||
![]() |
27c296bb89 | ||
![]() |
ef67908451 | ||
![]() |
3dedc3bfc7 | ||
![]() |
65d509c97f | ||
![]() |
11f38c4d3a | ||
![]() |
3bca6497f7 | ||
![]() |
23d79b9265 | ||
![]() |
12c53a3d4d | ||
![]() |
1dfe58ec02 | ||
![]() |
7615e62bbc | ||
![]() |
53189a6487 | ||
![]() |
027b11c3fb | ||
![]() |
453ab7de66 | ||
![]() |
58f8ded161 | ||
![]() |
497ce2e84f | ||
![]() |
3794c6f508 | ||
![]() |
ee6c9fa5d4 | ||
![]() |
1369bb095f | ||
![]() |
c786d7549a | ||
![]() |
b59840cb77 | ||
![]() |
265d57d8b7 | ||
![]() |
5eed84f9e5 | ||
![]() |
0a334dff1d | ||
![]() |
5fff9bdc02 | ||
![]() |
a9fd261bab | ||
![]() |
ef087be4f0 | ||
![]() |
2099978b8f | ||
![]() |
712bee297a | ||
![]() |
57bba90091 | ||
![]() |
d877f5c764 | ||
![]() |
4c66cc1e33 | ||
![]() |
27a3edeb93 | ||
![]() |
f79fc29203 | ||
![]() |
174240a220 | ||
![]() |
60d8af5c16 | ||
![]() |
627a5892f1 | ||
![]() |
7767f6d9cc | ||
![]() |
9729fd6b15 | ||
![]() |
17916f29f6 | ||
![]() |
584b9323ec | ||
![]() |
82c1aadfa9 | ||
![]() |
bd497af89b | ||
![]() |
1683c5630a | ||
![]() |
b5df1a026a | ||
![]() |
b290c32aeb | ||
![]() |
a29b3c6db4 | ||
![]() |
ffb2f4f5db | ||
![]() |
24c95f4801 | ||
![]() |
1aaec2d555 | ||
![]() |
fedb198ae7 | ||
![]() |
add654ccac | ||
![]() |
5a578643a6 | ||
![]() |
f0712bd213 | ||
![]() |
f490632722 | ||
![]() |
2610b96762 | ||
![]() |
8d90cb834d | ||
![]() |
9d92509796 | ||
![]() |
04a78ee0ba | ||
![]() |
3703390268 | ||
![]() |
4ab6415f49 | ||
![]() |
9228722147 | ||
![]() |
0e5529b4ca | ||
![]() |
4d454ec932 | ||
![]() |
a9282ad118 | ||
![]() |
0e959641af | ||
![]() |
13263eea76 | ||
![]() |
1a3418de58 | ||
![]() |
4402995132 | ||
![]() |
4e33f9875b | ||
![]() |
ed2893e37f | ||
![]() |
c35be241ca | ||
![]() |
aad0b4ddfe | ||
![]() |
52f5c7ddb5 | ||
![]() |
a04b933161 | ||
![]() |
c77e12edbb | ||
![]() |
108bd04cf8 | ||
![]() |
a95b500e42 | ||
![]() |
c2744c5569 | ||
![]() |
a1dfd87bbe | ||
![]() |
221aa8687f | ||
![]() |
fa8ac0a8ba | ||
![]() |
cc1f9873cb | ||
![]() |
3cae9ee5d2 | ||
![]() |
f764914adb | ||
![]() |
991250c73f | ||
![]() |
af46cf5ce8 | ||
![]() |
dbb1c42c47 | ||
![]() |
991f593b2e | ||
![]() |
e43c083d50 | ||
![]() |
3cd9bdc1d4 | ||
![]() |
c0b8e6178d | ||
![]() |
410f9d0af5 | ||
![]() |
b1fedf28dc | ||
![]() |
b0df03dcd2 | ||
![]() |
2794e50a19 | ||
![]() |
365ae656f2 | ||
![]() |
98649dcba6 | ||
![]() |
213c8096d2 | ||
![]() |
398938f27e | ||
![]() |
6378e62645 | ||
![]() |
251885d4be | ||
![]() |
f53909355f | ||
![]() |
242b68889a | ||
![]() |
6a66b65f2a | ||
![]() |
f30ead6bcb | ||
![]() |
237ee72ca6 | ||
![]() |
3590d84ad6 | ||
![]() |
2dae8c162d | ||
![]() |
9a192b708e | ||
![]() |
337d22bbf4 |
@@ -7,4 +7,12 @@ module.exports = {
|
||||
'plugin:@typescript-eslint/recommended',
|
||||
'prettier',
|
||||
],
|
||||
overrides: [
|
||||
{
|
||||
files: ['**/*.test.ts', '**/test/**/*.ts'],
|
||||
rules: {
|
||||
'@typescript-eslint/ban-ts-comment': ['off'],
|
||||
},
|
||||
},
|
||||
],
|
||||
};
|
||||
|
48
.github/workflows/backend.yml
vendored
Normal file
48
.github/workflows/backend.yml
vendored
Normal file
@@ -0,0 +1,48 @@
|
||||
name: Automatisch Backend Tests
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- main
|
||||
pull_request:
|
||||
workflow_dispatch:
|
||||
|
||||
jobs:
|
||||
test:
|
||||
timeout-minutes: 60
|
||||
runs-on:
|
||||
- ubuntu-latest
|
||||
services:
|
||||
postgres:
|
||||
image: postgres:14.5-alpine
|
||||
env:
|
||||
POSTGRES_DB: automatisch_test
|
||||
POSTGRES_USER: automatisch_test_user
|
||||
POSTGRES_PASSWORD: automatisch_test_user_password
|
||||
options: >-
|
||||
--health-cmd "pg_isready -U automatisch_test_user -d automatisch_test"
|
||||
--health-interval 10s
|
||||
--health-timeout 5s
|
||||
--health-retries 5
|
||||
ports:
|
||||
- 5432:5432
|
||||
redis:
|
||||
image: redis:7.0.4-alpine
|
||||
options: >-
|
||||
--health-cmd "redis-cli ping"
|
||||
--health-interval 10s
|
||||
--health-timeout 5s
|
||||
--health-retries 5
|
||||
ports:
|
||||
- 6379:6379
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- uses: actions/setup-node@v3
|
||||
with:
|
||||
node-version: 18
|
||||
- name: Install dependencies
|
||||
run: cd packages/backend && yarn
|
||||
- name: Copy .env-example.test file to .env.test
|
||||
run: cd packages/backend && cp .env-example.test .env.test
|
||||
- name: Run tests
|
||||
run: cd packages/backend && yarn test
|
34
.github/workflows/playwright.yml
vendored
34
.github/workflows/playwright.yml
vendored
@@ -17,12 +17,13 @@ env:
|
||||
POSTGRES_PASSWORD: automatisch_password
|
||||
REDIS_HOST: localhost
|
||||
APP_ENV: production
|
||||
LICENSE_KEY: ${{ secrets.E2E_LICENSE_KEY }}
|
||||
LICENSE_KEY: dummy_license_key
|
||||
|
||||
jobs:
|
||||
test:
|
||||
timeout-minutes: 60
|
||||
runs-on: ubuntu-latest
|
||||
runs-on:
|
||||
- ubuntu-latest
|
||||
services:
|
||||
postgres:
|
||||
image: postgres:14.5-alpine
|
||||
@@ -67,22 +68,49 @@ jobs:
|
||||
- name: Seed user
|
||||
working-directory: ./packages/backend
|
||||
run: yarn db:seed:user &
|
||||
- name: Install certutils
|
||||
run: sudo apt install -y libnss3-tools
|
||||
- name: Install mkcert
|
||||
run: |
|
||||
curl -JLO "https://dl.filippo.io/mkcert/latest?for=linux/amd64" \
|
||||
&& chmod +x mkcert-v*-linux-amd64 \
|
||||
&& sudo cp mkcert-v*-linux-amd64 /usr/local/bin/mkcert
|
||||
- name: Install root certificate via mkcert
|
||||
run: mkcert -install
|
||||
- name: Create certificate
|
||||
run: mkcert automatisch.io "*.automatisch.io" localhost 127.0.0.1 ::1
|
||||
working-directory: ./packages/e2e-tests
|
||||
- name: Set CAROOT environment variable
|
||||
run: echo "NODE_EXTRA_CA_CERTS=$(mkcert -CAROOT)/rootCA.pem" >> "$GITHUB_ENV"
|
||||
- name: Override license server with local server
|
||||
run: sudo echo "127.0.0.1 license.automatisch.io" | sudo tee -a /etc/hosts
|
||||
- name: Run local license server
|
||||
working-directory: ./packages/e2e-tests
|
||||
run: sudo yarn start-mock-license-server &
|
||||
- name: Run Automatisch
|
||||
run: yarn start &
|
||||
working-directory: ./packages/backend
|
||||
- name: Run Automatisch worker
|
||||
run: node dist/src/worker.js &
|
||||
working-directory: ./packages/backend
|
||||
- name: Setup upterm session
|
||||
if: false
|
||||
uses: lhotari/action-upterm@v1
|
||||
with:
|
||||
limit-access-to-actor: true
|
||||
limit-access-to-users: barinali
|
||||
- name: Run Playwright tests
|
||||
working-directory: ./packages/e2e-tests
|
||||
env:
|
||||
LOGIN_EMAIL: user@automatisch.io
|
||||
LOGIN_PASSWORD: sample
|
||||
BASE_URL: http://localhost:3000
|
||||
GITHUB_CLIENT_ID: 1c0417daf898adfbd99a
|
||||
GITHUB_CLIENT_SECRET: 3328fa814dd582ccd03dbe785cfd683fb8da92b3
|
||||
run: yarn test
|
||||
- uses: actions/upload-artifact@v3
|
||||
if: always()
|
||||
with:
|
||||
name: playwright-report
|
||||
path: ./packages/e2e-tests/test-results/**/*
|
||||
path: packages/e2e-tests/test-results
|
||||
retention-days: 30
|
||||
|
@@ -4,7 +4,7 @@ WORKDIR /automatisch
|
||||
|
||||
RUN \
|
||||
apk --no-cache add --virtual build-dependencies python3 build-base && \
|
||||
yarn global add @automatisch/cli@0.9.3 --network-timeout 1000000 && \
|
||||
yarn global add @automatisch/cli@0.10.0 --network-timeout 1000000 && \
|
||||
rm -rf /usr/local/share/.cache/ && \
|
||||
apk del build-dependencies
|
||||
|
||||
|
@@ -1,5 +1,5 @@
|
||||
# syntax=docker/dockerfile:1
|
||||
FROM automatischio/automatisch:0.9.3
|
||||
FROM automatischio/automatisch:0.10.0
|
||||
WORKDIR /automatisch
|
||||
|
||||
RUN apk add --no-cache openssl dos2unix
|
||||
|
@@ -2,7 +2,7 @@
|
||||
"packages": [
|
||||
"packages/*"
|
||||
],
|
||||
"version": "0.9.3",
|
||||
"version": "0.10.0",
|
||||
"npmClient": "yarn",
|
||||
"useWorkspaces": true,
|
||||
"command": {
|
||||
|
@@ -3,14 +3,13 @@ HOST=localhost
|
||||
PROTOCOL=http
|
||||
PORT=3000
|
||||
LOG_LEVEL=debug
|
||||
WEBHOOK_SECRET_KEY=secret
|
||||
ENCRYPTION_KEY=sample_encryption_key
|
||||
WEBHOOK_SECRET_KEY=sample_webhook_secret_key
|
||||
APP_SECRET_KEY=sample_app_secret_key
|
||||
POSTGRES_HOST=localhost
|
||||
POSTGRES_DATABASE=automatisch_test
|
||||
POSTGRES_PORT=5432
|
||||
POSTGRES_HOST=localhost
|
||||
POSTGRES_USERNAME=automatisch_test_user
|
||||
POSTGRES_PASSWORD=
|
||||
POSTGRES_ENABLE_SSL=false
|
||||
ENCRYPTION_KEY=secret
|
||||
APP_SECRET_KEY=secret
|
||||
REDIS_PORT=6379
|
||||
REDIS_HOST=127.0.0.1
|
||||
POSTGRES_PASSWORD=automatisch_test_user_password
|
||||
REDIS_HOST=localhost
|
||||
AUTOMATISCH_CLOUD=true
|
||||
|
@@ -1,5 +0,0 @@
|
||||
export default {
|
||||
require: ['ts-node/register', './src/config/app.ts'],
|
||||
files: ['**/*.test.ts'],
|
||||
extensions: ['ts'],
|
||||
};
|
9
packages/backend/jest.config.js
Normal file
9
packages/backend/jest.config.js
Normal file
@@ -0,0 +1,9 @@
|
||||
/** @type {import('ts-jest').JestConfigWithTsJest} */
|
||||
module.exports = {
|
||||
preset: 'ts-jest',
|
||||
testEnvironment: 'node',
|
||||
setupFilesAfterEnv: ['./test/setup/global-hooks.ts'],
|
||||
globalTeardown: './test/setup/global-teardown.ts',
|
||||
collectCoverage: true,
|
||||
collectCoverageFrom: ['src/graphql/queries/*.ts'],
|
||||
};
|
@@ -1,6 +1,7 @@
|
||||
import { knexSnakeCaseMappers } from 'objection';
|
||||
import appConfig from './src/config/app';
|
||||
|
||||
const fileExtension = appConfig.isDev ? 'ts' : 'js';
|
||||
const fileExtension = appConfig.isDev || appConfig.isTest ? 'ts' : 'js';
|
||||
|
||||
const knexConfig = {
|
||||
client: 'pg',
|
||||
@@ -23,6 +24,7 @@ const knexConfig = {
|
||||
seeds: {
|
||||
directory: __dirname + '/src/db/seeds',
|
||||
},
|
||||
...(appConfig.isTest ? knexSnakeCaseMappers() : {}),
|
||||
};
|
||||
|
||||
export default knexConfig;
|
||||
|
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@automatisch/backend",
|
||||
"version": "0.9.3",
|
||||
"version": "0.10.0",
|
||||
"license": "See LICENSE file",
|
||||
"description": "The open source Zapier alternative. Build workflow automation without spending time and money.",
|
||||
"scripts": {
|
||||
@@ -10,7 +10,7 @@
|
||||
"build:watch": "nodemon --watch 'src/**/*.ts' --watch 'bin/**/*.ts' --exec yarn build --ext ts",
|
||||
"start": "node dist/src/server.js",
|
||||
"pretest": "APP_ENV=test ts-node ./test/setup/prepare-test-env.ts",
|
||||
"test": "APP_ENV=test ava",
|
||||
"test": "APP_ENV=test jest --verbose",
|
||||
"lint": "eslint . --ignore-path ../../.eslintignore",
|
||||
"db:create": "ts-node ./bin/database/create.ts",
|
||||
"db:seed:user": "ts-node ./bin/database/seed-user.ts",
|
||||
@@ -23,7 +23,7 @@
|
||||
"prebuild": "rm -rf ./dist"
|
||||
},
|
||||
"dependencies": {
|
||||
"@automatisch/web": "^0.9.3",
|
||||
"@automatisch/web": "^0.10.0",
|
||||
"@bull-board/express": "^3.10.1",
|
||||
"@casl/ability": "^6.5.0",
|
||||
"@graphql-tools/graphql-file-loader": "^7.3.4",
|
||||
@@ -38,7 +38,7 @@
|
||||
"@types/xmlrpc": "^1.3.7",
|
||||
"accounting": "^0.4.1",
|
||||
"ajv-formats": "^2.1.1",
|
||||
"axios": "0.24.0",
|
||||
"axios": "1.6.0",
|
||||
"bcrypt": "^5.0.1",
|
||||
"bullmq": "^3.0.0",
|
||||
"copyfiles": "^2.4.1",
|
||||
@@ -59,7 +59,8 @@
|
||||
"http-proxy-agent": "^7.0.0",
|
||||
"https-proxy-agent": "^7.0.1",
|
||||
"jsonwebtoken": "^9.0.0",
|
||||
"knex": "^2.4.0",
|
||||
"libphonenumber-js": "^1.10.48",
|
||||
"knex": "^2.5.1",
|
||||
"lodash.get": "^4.4.2",
|
||||
"luxon": "2.5.2",
|
||||
"memory-cache": "^0.2.0",
|
||||
@@ -68,11 +69,12 @@
|
||||
"node-html-markdown": "^1.3.0",
|
||||
"nodemailer": "6.7.0",
|
||||
"oauth-1.0a": "^2.2.6",
|
||||
"objection": "^3.0.0",
|
||||
"objection": "^3.1.1",
|
||||
"passport": "^0.6.0",
|
||||
"pg": "^8.7.1",
|
||||
"php-serialize": "^4.0.2",
|
||||
"pluralize": "^8.0.0",
|
||||
"raw-body": "^2.5.2",
|
||||
"showdown": "^2.1.0",
|
||||
"stripe": "^11.13.0",
|
||||
"winston": "^3.7.1",
|
||||
@@ -114,13 +116,15 @@
|
||||
"url": "https://github.com/automatisch/automatisch/issues"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@automatisch/types": "^0.9.3",
|
||||
"@automatisch/types": "^0.10.0",
|
||||
"@faker-js/faker": "^8.1.0",
|
||||
"@types/bcrypt": "^5.0.0",
|
||||
"@types/bull": "^3.15.8",
|
||||
"@types/cors": "^2.8.12",
|
||||
"@types/crypto-js": "^4.0.2",
|
||||
"@types/express": "^4.17.15",
|
||||
"@types/http-errors": "^1.8.1",
|
||||
"@types/jest": "^29.5.5",
|
||||
"@types/jsonwebtoken": "^8.5.8",
|
||||
"@types/lodash.get": "^4.4.6",
|
||||
"@types/memory-cache": "^0.2.2",
|
||||
@@ -132,9 +136,12 @@
|
||||
"@types/pino": "^7.0.5",
|
||||
"@types/pluralize": "^0.0.30",
|
||||
"@types/showdown": "^2.0.1",
|
||||
"ava": "^5.3.1",
|
||||
"@types/supertest": "^2.0.14",
|
||||
"jest": "^29.7.0",
|
||||
"nodemon": "^2.0.13",
|
||||
"sinon": "^11.1.2",
|
||||
"supertest": "^6.3.3",
|
||||
"ts-jest": "^29.1.1",
|
||||
"ts-node": "^10.2.1",
|
||||
"ts-node-dev": "^1.1.8"
|
||||
},
|
||||
|
@@ -33,6 +33,7 @@ injectBullBoardHandler(app, serverAdapter);
|
||||
appAssetsHandler(app);
|
||||
|
||||
app.use(morgan);
|
||||
|
||||
app.use(
|
||||
express.json({
|
||||
limit: appConfig.requestBodySizeLimit,
|
||||
|
@@ -0,0 +1,35 @@
|
||||
import defineAction from '../../../../helpers/define-action';
|
||||
|
||||
export default defineAction({
|
||||
name: 'Add Template',
|
||||
key: 'addTemplate',
|
||||
description:
|
||||
'Creates an attachment of a specified object by given parent ID.',
|
||||
arguments: [
|
||||
{
|
||||
label: 'Templete Data',
|
||||
key: 'templateData',
|
||||
type: 'string' as const,
|
||||
required: true,
|
||||
variables: true,
|
||||
description: 'The content of your new Template in XML/HTML format.',
|
||||
},
|
||||
],
|
||||
|
||||
async run($) {
|
||||
const templateData = $.step.parameters.templateData as string;
|
||||
|
||||
const base64Data = Buffer.from(templateData).toString('base64');
|
||||
const dataURI = `data:application/xml;base64,${base64Data}`;
|
||||
|
||||
const body = JSON.stringify({ template: dataURI });
|
||||
|
||||
const response = await $.http.post('/template', body, {
|
||||
headers: {
|
||||
'Content-Type': 'application/json',
|
||||
},
|
||||
});
|
||||
|
||||
$.setActionItem({ raw: response.data });
|
||||
},
|
||||
});
|
3
packages/backend/src/apps/carbone/actions/index.ts
Normal file
3
packages/backend/src/apps/carbone/actions/index.ts
Normal file
@@ -0,0 +1,3 @@
|
||||
import addTemplate from './add-template';
|
||||
|
||||
export default [addTemplate];
|
444
packages/backend/src/apps/carbone/assets/favicon.svg
Normal file
444
packages/backend/src/apps/carbone/assets/favicon.svg
Normal file
@@ -0,0 +1,444 @@
|
||||
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||
width="100%" viewBox="0 0 1173 1173" enable-background="new 0 0 1173 1173" xml:space="preserve">
|
||||
<path fill="#73348B" opacity="1.000000" stroke="none"
|
||||
d="
|
||||
M1174.000000,208.000000
|
||||
C1174.000000,529.969421 1174.000000,851.938782 1174.000000,1173.954102
|
||||
C783.067810,1173.954102 392.135559,1173.954102 1.101677,1173.954102
|
||||
C1.101677,783.104980 1.101677,392.209930 1.101677,1.000000
|
||||
C322.697510,1.000000 644.395142,1.000000 966.516235,1.467920
|
||||
C966.918274,68.235474 966.895691,134.535110 966.877258,200.834747
|
||||
C966.875183,208.314804 966.885986,208.322311 974.623108,208.322571
|
||||
C1038.924072,208.324631 1103.225098,208.326889 1167.526123,208.310104
|
||||
C1169.684082,208.309540 1171.842041,208.107910 1174.000000,208.000000
|
||||
M824.469116,403.972260
|
||||
C830.640320,396.844513 836.811584,389.716736 843.084839,382.471130
|
||||
C813.026611,353.649353 780.256958,329.661011 741.486328,314.979523
|
||||
C680.713013,291.966217 618.102173,287.454407 554.867737,301.133331
|
||||
C463.817413,320.829376 397.312988,373.276550 356.951416,457.320282
|
||||
C326.804779,520.093689 319.957764,586.465027 335.155365,654.111511
|
||||
C358.404633,757.597168 419.946594,829.052856 520.224731,865.190979
|
||||
C575.706055,885.185242 632.887451,885.395691 690.185303,873.820862
|
||||
C753.158081,861.099548 803.501465,826.733521 847.328979,780.124756
|
||||
C825.522522,758.991638 803.799194,737.939087 781.866882,716.683960
|
||||
C775.039185,722.581055 767.314697,729.376404 759.459290,736.016846
|
||||
C716.790833,772.086792 668.088501,791.050049 611.649048,788.182129
|
||||
C555.974548,785.353088 510.796692,761.934998 476.366638,718.347046
|
||||
C450.585236,685.708313 437.160706,648.031494 433.752258,606.690613
|
||||
C430.193268,563.523926 437.309692,522.406311 457.904602,484.052490
|
||||
C496.945190,411.347198 573.378845,374.580780 654.712402,388.765686
|
||||
C691.388062,395.162079 723.361389,411.383057 752.404175,434.001740
|
||||
C761.432556,441.033173 770.043213,448.601013 779.130859,456.160980
|
||||
C794.123657,438.910675 809.069336,421.714569 824.469116,403.972260
|
||||
M401.126434,1003.500000
|
||||
C401.122375,996.333740 401.039398,989.166199 401.152191,982.001770
|
||||
C401.198700,979.046997 400.149170,977.760315 397.091583,977.847290
|
||||
C392.096008,977.989441 387.061035,978.231079 382.102264,977.778320
|
||||
C376.825531,977.296387 375.754608,979.441406 375.775360,984.315125
|
||||
C375.949005,1025.145630 375.873474,1065.977417 375.874237,1106.808716
|
||||
C375.874329,1113.141724 375.994049,1119.477539 375.836487,1125.806519
|
||||
C375.755646,1129.053101 376.993805,1130.258667 380.217560,1130.162231
|
||||
C385.712311,1129.997559 391.222198,1129.953491 396.712982,1130.175049
|
||||
C400.378265,1130.322998 401.327179,1128.650757 401.160339,1125.375610
|
||||
C400.987305,1121.979004 401.121826,1118.566772 401.121826,1114.051758
|
||||
C403.029083,1115.849609 404.038116,1116.655273 404.875366,1117.611572
|
||||
C423.297913,1138.649780 456.085083,1135.565308 472.987305,1118.665161
|
||||
C494.109619,1097.545654 495.745544,1057.582886 476.289124,1034.845947
|
||||
C458.642456,1014.223816 423.619873,1010.312439 404.695007,1033.663574
|
||||
C403.933044,1034.603882 402.896790,1035.321899 401.126709,1036.922485
|
||||
C401.126709,1025.377563 401.126709,1014.938782 401.126434,1003.500000
|
||||
M1021.364685,1102.039429
|
||||
C1034.668091,1125.202515 1054.950562,1134.733032 1081.114746,1132.114380
|
||||
C1116.971191,1128.525757 1140.394165,1093.509888 1130.352783,1058.871704
|
||||
C1120.842163,1026.064697 1084.911865,1009.039368 1051.827393,1021.662964
|
||||
C1020.072083,1033.779419 1006.094421,1069.964478 1021.364685,1102.039429
|
||||
M513.859009,1053.461792
|
||||
C508.981232,1065.614258 508.319275,1078.089722 511.612946,1090.667114
|
||||
C518.928467,1118.602539 545.601379,1135.665771 576.077942,1132.138428
|
||||
C615.868713,1127.533081 639.243103,1085.250000 621.290771,1049.613525
|
||||
C609.925598,1027.053101 590.627502,1017.015625 565.767517,1017.961548
|
||||
C541.582703,1018.881775 524.357849,1030.779541 513.859009,1053.461792
|
||||
M853.945312,1105.526489
|
||||
C844.979370,1111.390137 835.234131,1113.082764 824.789001,1110.928833
|
||||
C812.187134,1108.330078 801.815186,1096.424561 801.983032,1084.128296
|
||||
C803.915649,1084.128296 805.872803,1084.128418 807.829956,1084.128296
|
||||
C827.828918,1084.128174 847.827942,1084.128174 867.826904,1084.128052
|
||||
C883.022278,1084.128052 883.416565,1084.089355 881.911011,1068.743774
|
||||
C877.873352,1027.588623 845.873840,1010.303040 812.589294,1020.461792
|
||||
C788.140564,1027.923828 771.315674,1053.597778 776.625183,1086.417480
|
||||
C782.995667,1125.795166 822.767029,1141.211426 855.517578,1128.350586
|
||||
C864.166870,1124.953979 871.321899,1119.494873 877.282959,1111.812744
|
||||
C872.197815,1107.281738 867.508911,1103.103882 862.714783,1098.832153
|
||||
C859.777344,1101.088501 857.158447,1103.100098 853.945312,1105.526489
|
||||
M183.035294,1022.439941
|
||||
C178.726364,1024.044678 174.417435,1025.649414 169.759094,1027.384277
|
||||
C172.080597,1034.339355 174.168320,1040.594116 176.396927,1047.270874
|
||||
C178.710007,1046.498047 180.428452,1045.982422 182.104675,1045.354126
|
||||
C192.414581,1041.489502 203.049866,1039.981567 214.012650,1041.017212
|
||||
C228.197418,1042.357178 237.230057,1053.265137 234.370621,1065.622192
|
||||
C233.945877,1065.733521 233.456528,1066.014160 233.019272,1065.948486
|
||||
C231.544067,1065.726807 230.081848,1065.406616 228.624466,1065.080322
|
||||
C213.432663,1061.679199 198.251007,1060.834473 183.260117,1065.925537
|
||||
C168.246078,1071.024536 160.203674,1082.376099 160.159256,1097.991577
|
||||
C160.116211,1113.124634 168.617416,1125.277100 183.512024,1129.868774
|
||||
C201.272339,1135.343872 217.762161,1132.975952 231.922165,1119.980591
|
||||
C232.681229,1119.283936 233.598526,1118.759888 234.998825,1117.756470
|
||||
C234.998825,1120.660034 235.167923,1122.828491 234.961670,1124.960815
|
||||
C234.595810,1128.743408 235.836517,1130.435547 239.938004,1130.198853
|
||||
C245.253296,1129.892090 250.601852,1130.021362 255.931290,1130.154541
|
||||
C258.904449,1130.228760 260.057526,1129.146118 260.038300,1126.091797
|
||||
C259.899628,1104.095337 260.293976,1082.087280 259.708466,1060.104492
|
||||
C259.149353,1039.110596 247.823425,1025.003418 228.752792,1020.447083
|
||||
C213.662979,1016.841919 198.651810,1018.154236 183.035294,1022.439941
|
||||
M652.674988,1084.500000
|
||||
C652.676819,1097.990356 652.774353,1111.481812 652.619568,1124.970337
|
||||
C652.575684,1128.797485 653.756165,1130.430420 657.763428,1130.184448
|
||||
C662.243225,1129.909424 666.753052,1130.130493 671.249817,1130.123413
|
||||
C677.988098,1130.112915 677.994995,1130.108398 677.998840,1123.280029
|
||||
C678.009644,1104.127197 677.813293,1084.971313 678.088196,1065.822388
|
||||
C678.289795,1051.782104 687.650574,1041.728882 700.475464,1040.969238
|
||||
C714.725037,1040.125244 723.562256,1047.280884 725.706665,1061.495361
|
||||
C726.002808,1063.458374 725.985596,1065.479614 725.987732,1067.474121
|
||||
C726.007690,1086.627075 726.075562,1105.780396 725.937012,1124.932373
|
||||
C725.910034,1128.659790 726.763428,1130.436401 730.909912,1130.197876
|
||||
C736.388123,1129.882690 741.898499,1130.048462 747.393127,1130.132080
|
||||
C750.111389,1130.173340 751.333618,1129.085205 751.318970,1126.315796
|
||||
C751.187561,1101.504028 751.651367,1076.672607 750.778564,1051.887817
|
||||
C750.329590,1039.136963 743.986084,1028.674927 732.321106,1022.254761
|
||||
C716.863159,1013.746887 695.690918,1017.041931 683.479919,1029.807129
|
||||
C681.911743,1031.446533 680.418274,1033.157227 677.994934,1035.817871
|
||||
C677.994934,1031.179810 677.847046,1027.753906 678.037964,1024.347046
|
||||
C678.215881,1021.172424 677.140076,1019.820496 673.800659,1019.952393
|
||||
C668.645813,1020.156006 663.460022,1020.260315 658.319153,1019.922363
|
||||
C653.942261,1019.634521 652.544373,1021.128174 652.590515,1025.542358
|
||||
C652.792175,1044.859741 652.675354,1064.180542 652.674988,1084.500000
|
||||
M119.317238,1046.101074
|
||||
C122.268578,1048.446411 125.219917,1050.791626 127.387344,1052.514038
|
||||
C132.109711,1048.247925 136.374313,1044.289062 140.759842,1040.468872
|
||||
C144.010681,1037.637085 143.275986,1035.555298 140.351669,1032.810791
|
||||
C125.930077,1019.275879 108.562424,1015.442383 89.835030,1018.619995
|
||||
C58.671745,1023.907654 39.333969,1050.496826 43.188984,1083.193359
|
||||
C45.926426,1106.411377 59.195229,1122.338257 81.478561,1129.875244
|
||||
C103.477272,1137.315918 128.440613,1130.652588 142.387802,1114.456543
|
||||
C144.090958,1112.478760 144.008331,1111.254517 142.279175,1109.447876
|
||||
C138.256943,1105.245117 134.418365,1100.866577 130.299011,1096.332031
|
||||
C121.771889,1103.853394 113.867172,1109.740845 103.144859,1110.191895
|
||||
C92.244728,1110.650269 83.239876,1107.153076 76.138634,1098.826416
|
||||
C65.223991,1086.028564 65.297775,1064.157593 76.319031,1051.184937
|
||||
C87.046638,1038.557983 103.476791,1036.430054 119.317238,1046.101074
|
||||
M353.950317,1043.008423
|
||||
C354.006683,1036.186401 353.906464,1029.358154 354.180176,1022.544922
|
||||
C354.335571,1018.677124 352.771240,1017.653687 349.151764,1017.919495
|
||||
C335.330078,1018.934265 325.588013,1026.116211 318.604279,1037.643921
|
||||
C317.750885,1039.052734 316.890594,1040.457275 316.033447,1041.863770
|
||||
C315.121674,1035.918945 314.900055,1030.423950 315.194824,1024.956665
|
||||
C315.413696,1020.897034 313.799438,1019.733093 309.981384,1019.938782
|
||||
C305.168030,1020.198242 300.312347,1020.256714 295.507935,1019.924500
|
||||
C291.198883,1019.626587 289.697205,1020.959900 289.777374,1025.465820
|
||||
C290.040833,1040.276245 289.874969,1055.094116 289.875153,1069.909180
|
||||
C289.875397,1088.219849 289.984222,1106.531616 289.796387,1124.840332
|
||||
C289.753448,1129.024658 291.144775,1130.494019 295.243988,1130.181030
|
||||
C298.884857,1129.903076 302.564056,1130.154053 306.225861,1130.119141
|
||||
C316.127838,1130.024902 314.970276,1131.203003 315.137146,1121.384644
|
||||
C315.383026,1106.919067 314.932556,1092.386353 316.201233,1078.007690
|
||||
C317.784821,1060.059814 328.779388,1048.418091 344.942749,1045.376465
|
||||
C347.832062,1044.832642 350.733795,1044.354858 353.950317,1043.008423
|
||||
M970.561462,1130.149170
|
||||
C976.347717,1130.149170 982.133972,1130.149170 988.190430,1130.149170
|
||||
C988.190430,1093.234131 988.190430,1056.859741 988.190430,1020.333618
|
||||
C979.702515,1020.333618 971.488037,1020.333618 963.325317,1020.333618
|
||||
C963.325317,1057.058838 963.325317,1093.449585 963.325317,1130.149170
|
||||
C965.622131,1130.149170 967.600586,1130.149170 970.561462,1130.149170
|
||||
M931.087708,1129.856323
|
||||
C931.087708,1120.373291 931.087708,1110.890259 931.087708,1101.511963
|
||||
C922.010315,1101.511963 913.093201,1101.511963 904.095581,1101.511963
|
||||
C904.095581,1111.126099 904.095581,1120.382812 904.095581,1130.103516
|
||||
C912.953064,1130.103516 921.562012,1130.103516 931.087708,1129.856323
|
||||
M989.143494,1000.348511
|
||||
C989.143494,993.401855 989.143494,986.455139 989.143494,979.396606
|
||||
C979.834900,979.396606 970.989380,979.396606 962.400879,979.396606
|
||||
C962.400879,987.527710 962.400879,995.258179 962.400879,1003.146362
|
||||
C970.452820,1003.146362 978.106445,1003.221008 985.755371,1003.064941
|
||||
C986.887451,1003.041870 987.997314,1001.928955 989.143494,1000.348511
|
||||
z"/>
|
||||
<path fill="#B497C6" opacity="1.000000" stroke="none"
|
||||
d="
|
||||
M1174.000000,207.750000
|
||||
C1171.842041,208.107910 1169.684082,208.309540 1167.526123,208.310104
|
||||
C1103.225098,208.326889 1038.924072,208.324631 974.623108,208.322571
|
||||
C966.885986,208.322311 966.875183,208.314804 966.877258,200.834747
|
||||
C966.895691,134.535110 966.918274,68.235474 966.969849,1.467920
|
||||
C967.000000,1.000000 967.500000,1.000000 967.892212,1.300326
|
||||
C968.620972,1.969603 968.943176,2.352815 969.295898,2.705561
|
||||
C1036.645020,70.060425 1103.995605,137.413895 1171.356201,204.757263
|
||||
C1172.170776,205.571564 1173.115845,206.255310 1174.000000,207.000000
|
||||
C1174.000000,207.000000 1174.000000,207.500000 1174.000000,207.750000
|
||||
z"/>
|
||||
<path fill="#FFFFFF" opacity="1.000000" stroke="none"
|
||||
d="
|
||||
M1174.000000,206.533020
|
||||
C1173.115845,206.255310 1172.170776,205.571564 1171.356201,204.757263
|
||||
C1103.995605,137.413895 1036.645020,70.060425 969.295898,2.705561
|
||||
C968.943176,2.352815 968.620972,1.969603 968.142212,1.300326
|
||||
C1036.594238,1.000000 1105.188599,1.000000 1174.000000,1.000000
|
||||
C1174.000000,69.355194 1174.000000,137.710617 1174.000000,206.533020
|
||||
z"/>
|
||||
<path fill="#FFFFFF" opacity="1.000000" stroke="none"
|
||||
d="
|
||||
M824.242065,404.245361
|
||||
C809.069336,421.714569 794.123657,438.910675 779.130859,456.160980
|
||||
C770.043213,448.601013 761.432556,441.033173 752.404175,434.001740
|
||||
C723.361389,411.383057 691.388062,395.162079 654.712402,388.765686
|
||||
C573.378845,374.580780 496.945190,411.347198 457.904602,484.052490
|
||||
C437.309692,522.406311 430.193268,563.523926 433.752258,606.690613
|
||||
C437.160706,648.031494 450.585236,685.708313 476.366638,718.347046
|
||||
C510.796692,761.934998 555.974548,785.353088 611.649048,788.182129
|
||||
C668.088501,791.050049 716.790833,772.086792 759.459290,736.016846
|
||||
C767.314697,729.376404 775.039185,722.581055 781.866882,716.683960
|
||||
C803.799194,737.939087 825.522522,758.991638 847.328979,780.124756
|
||||
C803.501465,826.733521 753.158081,861.099548 690.185303,873.820862
|
||||
C632.887451,885.395691 575.706055,885.185242 520.224731,865.190979
|
||||
C419.946594,829.052856 358.404633,757.597168 335.155365,654.111511
|
||||
C319.957764,586.465027 326.804779,520.093689 356.951416,457.320282
|
||||
C397.312988,373.276550 463.817413,320.829376 554.867737,301.133331
|
||||
C618.102173,287.454407 680.713013,291.966217 741.486328,314.979523
|
||||
C780.256958,329.661011 813.026611,353.649353 843.084839,382.471130
|
||||
C836.811584,389.716736 830.640320,396.844513 824.242065,404.245361
|
||||
z"/>
|
||||
<path fill="#B496C6" opacity="1.000000" stroke="none"
|
||||
d="
|
||||
M401.126587,1004.000000
|
||||
C401.126709,1014.938782 401.126709,1025.377563 401.126709,1036.922485
|
||||
C402.896790,1035.321899 403.933044,1034.603882 404.695007,1033.663574
|
||||
C423.619873,1010.312439 458.642456,1014.223816 476.289124,1034.845947
|
||||
C495.745544,1057.582886 494.109619,1097.545654 472.987305,1118.665161
|
||||
C456.085083,1135.565308 423.297913,1138.649780 404.875366,1117.611572
|
||||
C404.038116,1116.655273 403.029083,1115.849609 401.121826,1114.051758
|
||||
C401.121826,1118.566772 400.987305,1121.979004 401.160339,1125.375610
|
||||
C401.327179,1128.650757 400.378265,1130.322998 396.712982,1130.175049
|
||||
C391.222198,1129.953491 385.712311,1129.997559 380.217560,1130.162231
|
||||
C376.993805,1130.258667 375.755646,1129.053101 375.836487,1125.806519
|
||||
C375.994049,1119.477539 375.874329,1113.141724 375.874237,1106.808716
|
||||
C375.873474,1065.977417 375.949005,1025.145630 375.775360,984.315125
|
||||
C375.754608,979.441406 376.825531,977.296387 382.102264,977.778320
|
||||
C387.061035,978.231079 392.096008,977.989441 397.091583,977.847290
|
||||
C400.149170,977.760315 401.198700,979.046997 401.152191,982.001770
|
||||
C401.039398,989.166199 401.122375,996.333740 401.126587,1004.000000
|
||||
M401.102875,1069.011719
|
||||
C400.098053,1078.886963 401.329559,1088.256470 407.101685,1096.684570
|
||||
C420.591766,1116.381714 449.957458,1114.592529 459.843262,1092.900513
|
||||
C462.811829,1086.386719 463.929352,1078.394409 463.659058,1071.163086
|
||||
C462.954895,1052.325073 448.612427,1039.179199 431.024689,1039.892334
|
||||
C416.229248,1040.492432 405.168213,1050.977661 401.102875,1069.011719
|
||||
z"/>
|
||||
<path fill="#FEFDFE" opacity="1.000000" stroke="none"
|
||||
d="
|
||||
M1021.202576,1101.701294
|
||||
C1006.094421,1069.964478 1020.072083,1033.779419 1051.827393,1021.662964
|
||||
C1084.911865,1009.039368 1120.842163,1026.064697 1130.352783,1058.871704
|
||||
C1140.394165,1093.509888 1116.971191,1128.525757 1081.114746,1132.114380
|
||||
C1054.950562,1134.733032 1034.668091,1125.202515 1021.202576,1101.701294
|
||||
M1063.986572,1041.223145
|
||||
C1048.638306,1046.359863 1041.596069,1057.693604 1040.531982,1073.203491
|
||||
C1038.714111,1099.699341 1064.766113,1118.165283 1088.315552,1107.193970
|
||||
C1103.746460,1100.005005 1111.074951,1080.915771 1105.178711,1063.268677
|
||||
C1099.385498,1045.930298 1083.597778,1037.239746 1063.986572,1041.223145
|
||||
z"/>
|
||||
<path fill="#B396C5" opacity="1.000000" stroke="none"
|
||||
d="
|
||||
M513.996948,1053.104736
|
||||
C524.357849,1030.779541 541.582703,1018.881775 565.767517,1017.961548
|
||||
C590.627502,1017.015625 609.925598,1027.053101 621.290771,1049.613525
|
||||
C639.243103,1085.250000 615.868713,1127.533081 576.077942,1132.138428
|
||||
C545.601379,1135.665771 518.928467,1118.602539 511.612946,1090.667114
|
||||
C508.319275,1078.089722 508.981232,1065.614258 513.996948,1053.104736
|
||||
M562.260620,1040.444092
|
||||
C546.615784,1043.979858 537.547485,1054.070801 535.297913,1070.447632
|
||||
C533.121765,1086.289917 541.953796,1102.308838 555.941284,1107.888672
|
||||
C570.341492,1113.633301 586.898376,1109.268066 595.135681,1096.926514
|
||||
C603.733704,1084.044556 604.355286,1070.265991 596.774170,1056.799438
|
||||
C589.497620,1043.873901 577.771179,1038.791748 562.260620,1040.444092
|
||||
z"/>
|
||||
<path fill="#B396C5" opacity="1.000000" stroke="none"
|
||||
d="
|
||||
M854.242432,1105.319092
|
||||
C857.158447,1103.100098 859.777344,1101.088501 862.714783,1098.832153
|
||||
C867.508911,1103.103882 872.197815,1107.281738 877.282959,1111.812744
|
||||
C871.321899,1119.494873 864.166870,1124.953979 855.517578,1128.350586
|
||||
C822.767029,1141.211426 782.995667,1125.795166 776.625183,1086.417480
|
||||
C771.315674,1053.597778 788.140564,1027.923828 812.589294,1020.461792
|
||||
C845.873840,1010.303040 877.873352,1027.588623 881.911011,1068.743774
|
||||
C883.416565,1084.089355 883.022278,1084.128052 867.826904,1084.128052
|
||||
C847.827942,1084.128174 827.828918,1084.128174 807.829956,1084.128296
|
||||
C805.872803,1084.128418 803.915649,1084.128296 801.983032,1084.128296
|
||||
C801.815186,1096.424561 812.187134,1108.330078 824.789001,1110.928833
|
||||
C835.234131,1113.082764 844.979370,1111.390137 854.242432,1105.319092
|
||||
M807.682800,1067.153442
|
||||
C823.922729,1067.153442 840.162659,1067.153442 856.360352,1067.153442
|
||||
C857.024231,1051.490723 843.821167,1038.060181 828.868347,1038.415405
|
||||
C814.209839,1038.763672 800.809204,1052.746582 801.885498,1066.903320
|
||||
C803.478333,1066.985229 805.112427,1067.069336 807.682800,1067.153442
|
||||
z"/>
|
||||
<path fill="#B396C6" opacity="1.000000" stroke="none"
|
||||
d="
|
||||
M183.418549,1022.317383
|
||||
C198.651810,1018.154236 213.662979,1016.841919 228.752792,1020.447083
|
||||
C247.823425,1025.003418 259.149353,1039.110596 259.708466,1060.104492
|
||||
C260.293976,1082.087280 259.899628,1104.095337 260.038300,1126.091797
|
||||
C260.057526,1129.146118 258.904449,1130.228760 255.931290,1130.154541
|
||||
C250.601852,1130.021362 245.253296,1129.892090 239.938004,1130.198853
|
||||
C235.836517,1130.435547 234.595810,1128.743408 234.961670,1124.960815
|
||||
C235.167923,1122.828491 234.998825,1120.660034 234.998825,1117.756470
|
||||
C233.598526,1118.759888 232.681229,1119.283936 231.922165,1119.980591
|
||||
C217.762161,1132.975952 201.272339,1135.343872 183.512024,1129.868774
|
||||
C168.617416,1125.277100 160.116211,1113.124634 160.159256,1097.991577
|
||||
C160.203674,1082.376099 168.246078,1071.024536 183.260117,1065.925537
|
||||
C198.251007,1060.834473 213.432663,1061.679199 228.624466,1065.080322
|
||||
C230.081848,1065.406616 231.544067,1065.726807 233.019272,1065.948486
|
||||
C233.456528,1066.014160 233.945877,1065.733521 234.370621,1065.622192
|
||||
C237.230057,1053.265137 228.197418,1042.357178 214.012650,1041.017212
|
||||
C203.049866,1039.981567 192.414581,1041.489502 182.104675,1045.354126
|
||||
C180.428452,1045.982422 178.710007,1046.498047 176.396927,1047.270874
|
||||
C174.168320,1040.594116 172.080597,1034.339355 169.759094,1027.384277
|
||||
C174.417435,1025.649414 178.726364,1024.044678 183.418549,1022.317383
|
||||
M222.614487,1110.282959
|
||||
C232.280441,1105.292969 236.480362,1097.197876 235.760620,1086.535889
|
||||
C235.661087,1085.061401 234.448975,1082.775879 233.263031,1082.397217
|
||||
C220.997086,1078.481323 208.516418,1076.766968 196.064621,1081.398193
|
||||
C188.557663,1084.190308 184.559586,1090.745972 185.061066,1098.121948
|
||||
C185.541321,1105.185791 190.386749,1110.687134 198.052612,1112.792114
|
||||
C206.277649,1115.050659 214.217789,1113.966431 222.614487,1110.282959
|
||||
z"/>
|
||||
<path fill="#B497C6" opacity="1.000000" stroke="none"
|
||||
d="
|
||||
M652.674561,1084.000000
|
||||
C652.675354,1064.180542 652.792175,1044.859741 652.590515,1025.542358
|
||||
C652.544373,1021.128174 653.942261,1019.634521 658.319153,1019.922363
|
||||
C663.460022,1020.260315 668.645813,1020.156006 673.800659,1019.952393
|
||||
C677.140076,1019.820496 678.215881,1021.172424 678.037964,1024.347046
|
||||
C677.847046,1027.753906 677.994934,1031.179810 677.994934,1035.817871
|
||||
C680.418274,1033.157227 681.911743,1031.446533 683.479919,1029.807129
|
||||
C695.690918,1017.041931 716.863159,1013.746887 732.321106,1022.254761
|
||||
C743.986084,1028.674927 750.329590,1039.136963 750.778564,1051.887817
|
||||
C751.651367,1076.672607 751.187561,1101.504028 751.318970,1126.315796
|
||||
C751.333618,1129.085205 750.111389,1130.173340 747.393127,1130.132080
|
||||
C741.898499,1130.048462 736.388123,1129.882690 730.909912,1130.197876
|
||||
C726.763428,1130.436401 725.910034,1128.659790 725.937012,1124.932373
|
||||
C726.075562,1105.780396 726.007690,1086.627075 725.987732,1067.474121
|
||||
C725.985596,1065.479614 726.002808,1063.458374 725.706665,1061.495361
|
||||
C723.562256,1047.280884 714.725037,1040.125244 700.475464,1040.969238
|
||||
C687.650574,1041.728882 678.289795,1051.782104 678.088196,1065.822388
|
||||
C677.813293,1084.971313 678.009644,1104.127197 677.998840,1123.280029
|
||||
C677.994995,1130.108398 677.988098,1130.112915 671.249817,1130.123413
|
||||
C666.753052,1130.130493 662.243225,1129.909424 657.763428,1130.184448
|
||||
C653.756165,1130.430420 652.575684,1128.797485 652.619568,1124.970337
|
||||
C652.774353,1111.481812 652.676819,1097.990356 652.674561,1084.000000
|
||||
z"/>
|
||||
<path fill="#B396C5" opacity="1.000000" stroke="none"
|
||||
d="
|
||||
M119.017403,1045.897461
|
||||
C103.476791,1036.430054 87.046638,1038.557983 76.319031,1051.184937
|
||||
C65.297775,1064.157593 65.223991,1086.028564 76.138634,1098.826416
|
||||
C83.239876,1107.153076 92.244728,1110.650269 103.144859,1110.191895
|
||||
C113.867172,1109.740845 121.771889,1103.853394 130.299011,1096.332031
|
||||
C134.418365,1100.866577 138.256943,1105.245117 142.279175,1109.447876
|
||||
C144.008331,1111.254517 144.090958,1112.478760 142.387802,1114.456543
|
||||
C128.440613,1130.652588 103.477272,1137.315918 81.478561,1129.875244
|
||||
C59.195229,1122.338257 45.926426,1106.411377 43.188984,1083.193359
|
||||
C39.333969,1050.496826 58.671745,1023.907654 89.835030,1018.619995
|
||||
C108.562424,1015.442383 125.930077,1019.275879 140.351669,1032.810791
|
||||
C143.275986,1035.555298 144.010681,1037.637085 140.759842,1040.468872
|
||||
C136.374313,1044.289062 132.109711,1048.247925 127.387344,1052.514038
|
||||
C125.219917,1050.791626 122.268578,1048.446411 119.017403,1045.897461
|
||||
z"/>
|
||||
<path fill="#B497C6" opacity="1.000000" stroke="none"
|
||||
d="
|
||||
M353.790070,1043.427490
|
||||
C350.733795,1044.354858 347.832062,1044.832642 344.942749,1045.376465
|
||||
C328.779388,1048.418091 317.784821,1060.059814 316.201233,1078.007690
|
||||
C314.932556,1092.386353 315.383026,1106.919067 315.137146,1121.384644
|
||||
C314.970276,1131.203003 316.127838,1130.024902 306.225861,1130.119141
|
||||
C302.564056,1130.154053 298.884857,1129.903076 295.243988,1130.181030
|
||||
C291.144775,1130.494019 289.753448,1129.024658 289.796387,1124.840332
|
||||
C289.984222,1106.531616 289.875397,1088.219849 289.875153,1069.909180
|
||||
C289.874969,1055.094116 290.040833,1040.276245 289.777374,1025.465820
|
||||
C289.697205,1020.959900 291.198883,1019.626587 295.507935,1019.924500
|
||||
C300.312347,1020.256714 305.168030,1020.198242 309.981384,1019.938782
|
||||
C313.799438,1019.733093 315.413696,1020.897034 315.194824,1024.956665
|
||||
C314.900055,1030.423950 315.121674,1035.918945 316.033447,1041.863770
|
||||
C316.890594,1040.457275 317.750885,1039.052734 318.604279,1037.643921
|
||||
C325.588013,1026.116211 335.330078,1018.934265 349.151764,1017.919495
|
||||
C352.771240,1017.653687 354.335571,1018.677124 354.180176,1022.544922
|
||||
C353.906464,1029.358154 354.006683,1036.186401 353.790070,1043.427490
|
||||
z"/>
|
||||
<path fill="#FFFFFF" opacity="1.000000" stroke="none"
|
||||
d="
|
||||
M970.070190,1130.149170
|
||||
C967.600586,1130.149170 965.622131,1130.149170 963.325317,1130.149170
|
||||
C963.325317,1093.449585 963.325317,1057.058838 963.325317,1020.333618
|
||||
C971.488037,1020.333618 979.702515,1020.333618 988.190430,1020.333618
|
||||
C988.190430,1056.859741 988.190430,1093.234131 988.190430,1130.149170
|
||||
C982.133972,1130.149170 976.347717,1130.149170 970.070190,1130.149170
|
||||
z"/>
|
||||
<path fill="#FCFBFD" opacity="1.000000" stroke="none"
|
||||
d="
|
||||
M930.629333,1129.979980
|
||||
C921.562012,1130.103516 912.953064,1130.103516 904.095581,1130.103516
|
||||
C904.095581,1120.382812 904.095581,1111.126099 904.095581,1101.511963
|
||||
C913.093201,1101.511963 922.010315,1101.511963 931.087708,1101.511963
|
||||
C931.087708,1110.890259 931.087708,1120.373291 930.629333,1129.979980
|
||||
z"/>
|
||||
<path fill="#FFFFFF" opacity="1.000000" stroke="none"
|
||||
d="
|
||||
M989.130493,1000.834351
|
||||
C987.997314,1001.928955 986.887451,1003.041870 985.755371,1003.064941
|
||||
C978.106445,1003.221008 970.452820,1003.146362 962.400879,1003.146362
|
||||
C962.400879,995.258179 962.400879,987.527710 962.400879,979.396606
|
||||
C970.989380,979.396606 979.834900,979.396606 989.143494,979.396606
|
||||
C989.143494,986.455139 989.143494,993.401855 989.130493,1000.834351
|
||||
z"/>
|
||||
<path fill="#73358B" opacity="1.000000" stroke="none"
|
||||
d="
|
||||
M401.167480,1068.572754
|
||||
C405.168213,1050.977661 416.229248,1040.492432 431.024689,1039.892334
|
||||
C448.612427,1039.179199 462.954895,1052.325073 463.659058,1071.163086
|
||||
C463.929352,1078.394409 462.811829,1086.386719 459.843262,1092.900513
|
||||
C449.957458,1114.592529 420.591766,1116.381714 407.101685,1096.684570
|
||||
C401.329559,1088.256470 400.098053,1078.886963 401.167480,1068.572754
|
||||
z"/>
|
||||
<path fill="#74368C" opacity="1.000000" stroke="none"
|
||||
d="
|
||||
M1064.389893,1041.130493
|
||||
C1083.597778,1037.239746 1099.385498,1045.930298 1105.178711,1063.268677
|
||||
C1111.074951,1080.915771 1103.746460,1100.005005 1088.315552,1107.193970
|
||||
C1064.766113,1118.165283 1038.714111,1099.699341 1040.531982,1073.203491
|
||||
C1041.596069,1057.693604 1048.638306,1046.359863 1064.389893,1041.130493
|
||||
z"/>
|
||||
<path fill="#73358B" opacity="1.000000" stroke="none"
|
||||
d="
|
||||
M562.688843,1040.359863
|
||||
C577.771179,1038.791748 589.497620,1043.873901 596.774170,1056.799438
|
||||
C604.355286,1070.265991 603.733704,1084.044556 595.135681,1096.926514
|
||||
C586.898376,1109.268066 570.341492,1113.633301 555.941284,1107.888672
|
||||
C541.953796,1102.308838 533.121765,1086.289917 535.297913,1070.447632
|
||||
C537.547485,1054.070801 546.615784,1043.979858 562.688843,1040.359863
|
||||
z"/>
|
||||
<path fill="#74358C" opacity="1.000000" stroke="none"
|
||||
d="
|
||||
M807.214600,1067.153320
|
||||
C805.112427,1067.069336 803.478333,1066.985229 801.885498,1066.903320
|
||||
C800.809204,1052.746582 814.209839,1038.763672 828.868347,1038.415405
|
||||
C843.821167,1038.060181 857.024231,1051.490723 856.360352,1067.153442
|
||||
C840.162659,1067.153442 823.922729,1067.153442 807.214600,1067.153320
|
||||
z"/>
|
||||
<path fill="#74358C" opacity="1.000000" stroke="none"
|
||||
d="
|
||||
M222.282150,1110.464844
|
||||
C214.217789,1113.966431 206.277649,1115.050659 198.052612,1112.792114
|
||||
C190.386749,1110.687134 185.541321,1105.185791 185.061066,1098.121948
|
||||
C184.559586,1090.745972 188.557663,1084.190308 196.064621,1081.398193
|
||||
C208.516418,1076.766968 220.997086,1078.481323 233.263031,1082.397217
|
||||
C234.448975,1082.775879 235.661087,1085.061401 235.760620,1086.535889
|
||||
C236.480362,1097.197876 232.280441,1105.292969 222.282150,1110.464844
|
||||
z"/>
|
||||
</svg>
|
After Width: | Height: | Size: 26 KiB |
33
packages/backend/src/apps/carbone/auth/index.ts
Normal file
33
packages/backend/src/apps/carbone/auth/index.ts
Normal file
@@ -0,0 +1,33 @@
|
||||
import verifyCredentials from './verify-credentials';
|
||||
import isStillVerified from './is-still-verified';
|
||||
|
||||
export default {
|
||||
fields: [
|
||||
{
|
||||
key: 'screenName',
|
||||
label: 'Screen Name',
|
||||
type: 'string' as const,
|
||||
required: true,
|
||||
readOnly: false,
|
||||
value: null,
|
||||
placeholder: null,
|
||||
description:
|
||||
'Screen name of your connection to be used on Automatisch UI.',
|
||||
clickToCopy: false,
|
||||
},
|
||||
{
|
||||
key: 'apiKey',
|
||||
label: 'API Key',
|
||||
type: 'string' as const,
|
||||
required: true,
|
||||
readOnly: false,
|
||||
value: null,
|
||||
placeholder: null,
|
||||
description: 'Carbone API key of your account.',
|
||||
clickToCopy: false,
|
||||
},
|
||||
],
|
||||
|
||||
verifyCredentials,
|
||||
isStillVerified,
|
||||
};
|
@@ -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;
|
12
packages/backend/src/apps/carbone/auth/verify-credentials.ts
Normal file
12
packages/backend/src/apps/carbone/auth/verify-credentials.ts
Normal file
@@ -0,0 +1,12 @@
|
||||
import { IGlobalVariable } from '@automatisch/types';
|
||||
|
||||
const verifyCredentials = async ($: IGlobalVariable) => {
|
||||
await $.http.get('/templates');
|
||||
|
||||
await $.auth.set({
|
||||
screenName: $.auth.data.screenName,
|
||||
apiKey: $.auth.data.apiKey,
|
||||
});
|
||||
};
|
||||
|
||||
export default verifyCredentials;
|
12
packages/backend/src/apps/carbone/common/add-auth-header.ts
Normal file
12
packages/backend/src/apps/carbone/common/add-auth-header.ts
Normal file
@@ -0,0 +1,12 @@
|
||||
import { TBeforeRequest } from '@automatisch/types';
|
||||
|
||||
const addAuthHeader: TBeforeRequest = ($, requestConfig) => {
|
||||
if ($.auth.data?.apiKey) {
|
||||
requestConfig.headers.Authorization = `Bearer ${$.auth.data.apiKey}`;
|
||||
requestConfig.headers['carbone-version'] = '4';
|
||||
}
|
||||
|
||||
return requestConfig;
|
||||
};
|
||||
|
||||
export default addAuthHeader;
|
0
packages/backend/src/apps/carbone/index.d.ts
vendored
Normal file
0
packages/backend/src/apps/carbone/index.d.ts
vendored
Normal file
18
packages/backend/src/apps/carbone/index.ts
Normal file
18
packages/backend/src/apps/carbone/index.ts
Normal file
@@ -0,0 +1,18 @@
|
||||
import defineApp from '../../helpers/define-app';
|
||||
import addAuthHeader from './common/add-auth-header';
|
||||
import auth from './auth';
|
||||
import actions from './actions';
|
||||
|
||||
export default defineApp({
|
||||
name: 'Carbone',
|
||||
key: 'carbone',
|
||||
iconUrl: '{BASE_URL}/apps/carbone/assets/favicon.svg',
|
||||
authDocUrl: 'https://automatisch.io/docs/apps/carbone/connection',
|
||||
supportsConnections: true,
|
||||
baseUrl: 'https://carbone.io',
|
||||
apiBaseUrl: 'https://api.carbone.io',
|
||||
primaryColor: '6f42c1',
|
||||
beforeRequest: [addAuthHeader],
|
||||
auth,
|
||||
actions,
|
||||
});
|
@@ -0,0 +1,102 @@
|
||||
import defineAction from '../../../../helpers/define-action';
|
||||
|
||||
export default defineAction({
|
||||
name: 'Create a scheduled event',
|
||||
key: 'createScheduledEvent',
|
||||
description: 'Creates a scheduled event',
|
||||
arguments: [
|
||||
{
|
||||
label: 'Type',
|
||||
key: 'entityType',
|
||||
type: 'dropdown' as const,
|
||||
required: true,
|
||||
variables: true,
|
||||
options: [
|
||||
{ label: 'Stage channel', value: 1 },
|
||||
{ label: 'Voice channel', value: 2 },
|
||||
{ label: 'External', value: 3 }
|
||||
],
|
||||
additionalFields: {
|
||||
type: 'query',
|
||||
name: 'getDynamicFields',
|
||||
arguments: [
|
||||
{
|
||||
name: 'key',
|
||||
value: 'listExternalScheduledEventFields',
|
||||
},
|
||||
{
|
||||
name: 'parameters.entityType',
|
||||
value: '{parameters.entityType}',
|
||||
},
|
||||
],
|
||||
},
|
||||
},
|
||||
{
|
||||
label: 'Name',
|
||||
key: 'name',
|
||||
type: 'string' as const,
|
||||
required: true,
|
||||
variables: true,
|
||||
},
|
||||
{
|
||||
label: 'Description',
|
||||
key: 'description',
|
||||
type: 'string' as const,
|
||||
required: false,
|
||||
variables: true,
|
||||
},
|
||||
{
|
||||
label: 'Image',
|
||||
key: 'image',
|
||||
type: 'string' as const,
|
||||
required: false,
|
||||
description: 'Image as DataURI scheme [data:image/<jpeg/png/gif>;base64,BASE64_ENCODED_<JPEG/PNG/GIF>_IMAGE_DATA]',
|
||||
variables: true,
|
||||
},
|
||||
],
|
||||
|
||||
async run($) {
|
||||
type entity_metadata = {
|
||||
location: string
|
||||
}
|
||||
|
||||
type guild_event = {
|
||||
channel_id: number,
|
||||
name: string,
|
||||
privacy_level: number,
|
||||
scheduled_start_time: string,
|
||||
scheduled_end_time?: string,
|
||||
description?: string,
|
||||
entity_type?: number,
|
||||
entity_metadata?: entity_metadata,
|
||||
image?: string, //data:image/jpeg;base64,BASE64_ENCODED_JPEG_IMAGE_DATA
|
||||
}
|
||||
|
||||
|
||||
const data: guild_event = {
|
||||
channel_id: $.step.parameters.channel_id as number,
|
||||
name: $.step.parameters.name as string,
|
||||
privacy_level: 2,
|
||||
scheduled_start_time: $.step.parameters.scheduledStartTime as string,
|
||||
scheduled_end_time: $.step.parameters.scheduledEndTime as string,
|
||||
description: $.step.parameters.description as string,
|
||||
entity_type: $.step.parameters.entityType as number,
|
||||
image: $.step.parameters.image as string,
|
||||
};
|
||||
|
||||
const isExternal = $.step.parameters.entityType === 3;
|
||||
if (isExternal) {
|
||||
data.entity_metadata = {
|
||||
location: $.step.parameters.location as string,
|
||||
};
|
||||
data.channel_id = null;
|
||||
}
|
||||
|
||||
const response = await $.http?.post(
|
||||
`/guilds/${$.auth.data.guildId}/scheduled-events`,
|
||||
data
|
||||
);
|
||||
|
||||
$.setActionItem({ raw: response.data });
|
||||
},
|
||||
});
|
@@ -1,3 +1,4 @@
|
||||
import sendMessageToChannel from './send-message-to-channel';
|
||||
import createScheduledEvent from './create-scheduled-event';
|
||||
|
||||
export default [sendMessageToChannel];
|
||||
export default [sendMessageToChannel, createScheduledEvent];
|
||||
|
@@ -1,3 +1,4 @@
|
||||
import listChannels from './list-channels';
|
||||
import listVoiceChannels from './list-voice-channels';
|
||||
|
||||
export default [listChannels];
|
||||
export default [listChannels, listVoiceChannels];
|
||||
|
@@ -0,0 +1,34 @@
|
||||
import { IGlobalVariable, IJSONObject } from '@automatisch/types';
|
||||
|
||||
export default {
|
||||
name: 'List voice channels',
|
||||
key: 'listVoiceChannels',
|
||||
|
||||
async run($: IGlobalVariable) {
|
||||
const channels: {
|
||||
data: IJSONObject[];
|
||||
error: IJSONObject | null;
|
||||
} = {
|
||||
data: [],
|
||||
error: null,
|
||||
};
|
||||
|
||||
const response = await $.http.get(
|
||||
`/guilds/${$.auth.data.guildId}/channels`
|
||||
);
|
||||
|
||||
channels.data = response.data
|
||||
.filter((channel: IJSONObject) => {
|
||||
// filter in voice and stage channels only
|
||||
return channel.type === 2 || channel.type === 13;
|
||||
})
|
||||
.map((channel: IJSONObject) => {
|
||||
return {
|
||||
value: channel.id,
|
||||
name: channel.name,
|
||||
};
|
||||
});
|
||||
|
||||
return channels;
|
||||
},
|
||||
};
|
@@ -0,0 +1,3 @@
|
||||
import listExternalScheduledEventFields from './list-external-scheduled-event-fields';
|
||||
|
||||
export default [listExternalScheduledEventFields];
|
@@ -0,0 +1,83 @@
|
||||
import { IGlobalVariable } from '@automatisch/types';
|
||||
export default {
|
||||
name: 'List external scheduled event fields',
|
||||
key: 'listExternalScheduledEventFields',
|
||||
|
||||
async run($: IGlobalVariable) {
|
||||
const isExternal = $.step.parameters.entityType === 3;
|
||||
|
||||
if (isExternal) {
|
||||
return [
|
||||
{
|
||||
label: 'Location',
|
||||
key: 'location',
|
||||
type: 'string' as const,
|
||||
required: true,
|
||||
description: 'The location of the event (1-100 characters). This will be omitted if type is NOT EXTERNAL',
|
||||
variables: true,
|
||||
},
|
||||
{
|
||||
label: 'Start-Time',
|
||||
key: 'scheduledStartTime',
|
||||
type: 'string' as const,
|
||||
required: true,
|
||||
description: 'The time the event will start [ISO8601]',
|
||||
variables: true,
|
||||
},
|
||||
{
|
||||
label: 'End-Time',
|
||||
key: 'scheduledEndTime',
|
||||
type: 'string' as const,
|
||||
required: true,
|
||||
description: 'The time the event will end [ISO8601]. This will be omitted if type is NOT EXTERNAL',
|
||||
variables: true,
|
||||
},
|
||||
];
|
||||
}
|
||||
|
||||
return [
|
||||
{
|
||||
label: 'Channel',
|
||||
key: 'channel_id',
|
||||
type: 'dropdown' as const,
|
||||
required: true,
|
||||
description: 'Pick a voice or stage channel to link the event to. This will be omitted if type is EXTERNAL',
|
||||
variables: true,
|
||||
source: {
|
||||
type: 'query',
|
||||
name: 'getDynamicData',
|
||||
arguments: [
|
||||
{
|
||||
name: 'key',
|
||||
value: 'listVoiceChannels',
|
||||
},
|
||||
],
|
||||
},
|
||||
},
|
||||
{
|
||||
label: 'Location',
|
||||
key: 'location',
|
||||
type: 'string' as const,
|
||||
required: false,
|
||||
description: 'The location of the event (1-100 characters). This will be omitted if type is NOT EXTERNAL',
|
||||
variables: true,
|
||||
},
|
||||
{
|
||||
label: 'Start-Time',
|
||||
key: 'scheduledStartTime',
|
||||
type: 'string' as const,
|
||||
required: true,
|
||||
description: 'The time the event will start [ISO8601]',
|
||||
variables: true,
|
||||
},
|
||||
{
|
||||
label: 'End-Time',
|
||||
key: 'scheduledEndTime',
|
||||
type: 'string' as const,
|
||||
required: false,
|
||||
description: 'The time the event will end [ISO8601]. This will be omitted if type is NOT EXTERNAL',
|
||||
variables: true,
|
||||
},
|
||||
];
|
||||
},
|
||||
};
|
@@ -4,6 +4,7 @@ import auth from './auth';
|
||||
import dynamicData from './dynamic-data';
|
||||
import actions from './actions';
|
||||
import triggers from './triggers';
|
||||
import dynamicFields from './dynamic-fields';
|
||||
|
||||
export default defineApp({
|
||||
name: 'Discord',
|
||||
@@ -17,6 +18,7 @@ export default defineApp({
|
||||
beforeRequest: [addAuthHeader],
|
||||
auth,
|
||||
dynamicData,
|
||||
dynamicFields,
|
||||
triggers,
|
||||
actions,
|
||||
});
|
||||
|
@@ -1,3 +1,4 @@
|
||||
import Crypto from 'crypto';
|
||||
import isEmpty from 'lodash/isEmpty';
|
||||
import defineTrigger from '../../../../helpers/define-trigger';
|
||||
import webhookFilters from '../../common/webhook-filters';
|
||||
@@ -19,6 +20,17 @@ export default defineTrigger({
|
||||
},
|
||||
],
|
||||
|
||||
async run($) {
|
||||
const dataItem = {
|
||||
raw: $.request.body,
|
||||
meta: {
|
||||
internalId: Crypto.randomUUID(),
|
||||
},
|
||||
};
|
||||
|
||||
$.pushTriggerItem(dataItem);
|
||||
},
|
||||
|
||||
async testRun($) {
|
||||
const lastExecutionStep = await $.getLastExecutionStep();
|
||||
|
||||
|
@@ -3,11 +3,13 @@ import defineAction from '../../../../helpers/define-action';
|
||||
import performMathOperation from './transformers/perform-math-operation';
|
||||
import randomNumber from './transformers/random-number';
|
||||
import formatNumber from './transformers/format-number';
|
||||
import formatPhoneNumber from './transformers/format-phone-number';
|
||||
|
||||
const transformers = {
|
||||
performMathOperation,
|
||||
randomNumber,
|
||||
formatNumber,
|
||||
formatPhoneNumber,
|
||||
};
|
||||
|
||||
export default defineAction({
|
||||
@@ -26,6 +28,7 @@ export default defineAction({
|
||||
{ label: 'Perform Math Operation', value: 'performMathOperation' },
|
||||
{ label: 'Random Number', value: 'randomNumber' },
|
||||
{ label: 'Format Number', value: 'formatNumber' },
|
||||
{ label: 'Format Phone Number', value: 'formatPhoneNumber' },
|
||||
],
|
||||
additionalFields: {
|
||||
type: 'query',
|
||||
|
@@ -0,0 +1,24 @@
|
||||
import { IGlobalVariable } from '@automatisch/types';
|
||||
import parsePhoneNumber, { CountryCode } from 'libphonenumber-js';
|
||||
|
||||
const formatPhoneNumber = ($: IGlobalVariable) => {
|
||||
const phoneNumber = $.step.parameters.phoneNumber as string;
|
||||
const toFormat = $.step.parameters.toFormat as string;
|
||||
const phoneNumberCountryCode = ($.step.parameters.phoneNumberCountryCode ||
|
||||
'US') as CountryCode;
|
||||
|
||||
const parsedPhoneNumber = parsePhoneNumber(
|
||||
phoneNumber,
|
||||
phoneNumberCountryCode
|
||||
);
|
||||
|
||||
if (toFormat === 'e164') {
|
||||
return parsedPhoneNumber.format('E.164');
|
||||
} else if (toFormat === 'international') {
|
||||
return parsedPhoneNumber.formatInternational();
|
||||
} else if (toFormat === 'national') {
|
||||
return parsedPhoneNumber.formatNational();
|
||||
}
|
||||
};
|
||||
|
||||
export default formatPhoneNumber;
|
@@ -0,0 +1,249 @@
|
||||
const phoneNumberCountryCodes = [
|
||||
{ label: 'Ascension Island', value: 'AC' },
|
||||
{ label: 'Andorra', value: 'AD' },
|
||||
{ label: 'United Arab Emirates', value: 'AE' },
|
||||
{ label: 'Afghanistan', value: 'AF' },
|
||||
{ label: 'Antigua & Barbuda', value: 'AG' },
|
||||
{ label: 'Anguilla', value: 'AI' },
|
||||
{ label: 'Albania', value: 'AL' },
|
||||
{ label: 'Armenia', value: 'AM' },
|
||||
{ label: 'Angola', value: 'AO' },
|
||||
{ label: 'Argentina', value: 'AR' },
|
||||
{ label: 'American Samoa', value: 'AS' },
|
||||
{ label: 'Austria', value: 'AT' },
|
||||
{ label: 'Australia', value: 'AU' },
|
||||
{ label: 'Aruba', value: 'AW' },
|
||||
{ label: 'Åland Islands', value: 'AX' },
|
||||
{ label: 'Azerbaijan', value: 'AZ' },
|
||||
{ label: 'Bosnia & Herzegovina', value: 'BA' },
|
||||
{ label: 'Barbados', value: 'BB' },
|
||||
{ label: 'Bangladesh', value: 'BD' },
|
||||
{ label: 'Belgium', value: 'BE' },
|
||||
{ label: 'Burkina Faso', value: 'BF' },
|
||||
{ label: 'Bulgaria', value: 'BG' },
|
||||
{ label: 'Bahrain', value: 'BH' },
|
||||
{ label: 'Burundi', value: 'BI' },
|
||||
{ label: 'Benin', value: 'BJ' },
|
||||
{ label: 'St. Barthélemy', value: 'BL' },
|
||||
{ label: 'Bermuda', value: 'BM' },
|
||||
{ label: 'Brunei', value: 'BN' },
|
||||
{ label: 'Bolivia', value: 'BO' },
|
||||
{ label: 'Caribbean Netherlands', value: 'BQ' },
|
||||
{ label: 'Brazil', value: 'BR' },
|
||||
{ label: 'Bahamas', value: 'BS' },
|
||||
{ label: 'Bhutan', value: 'BT' },
|
||||
{ label: 'Botswana', value: 'BW' },
|
||||
{ label: 'Belarus', value: 'BY' },
|
||||
{ label: 'Belize', value: 'BZ' },
|
||||
{ label: 'Canada', value: 'CA' },
|
||||
{ label: 'Cocos (Keeling) Islands', value: 'CC' },
|
||||
{ label: 'Congo - Kinshasa', value: 'CD' },
|
||||
{ label: 'Central African Republic', value: 'CF' },
|
||||
{ label: 'Congo - Brazzaville', value: 'CG' },
|
||||
{ label: 'Switzerland', value: 'CH' },
|
||||
{ label: 'Côte d’Ivoire', value: 'CI' },
|
||||
{ label: 'Cook Islands', value: 'CK' },
|
||||
{ label: 'Chile', value: 'CL' },
|
||||
{ label: 'Cameroon', value: 'CM' },
|
||||
{ label: 'China', value: 'CN' },
|
||||
{ label: 'Colombia', value: 'CO' },
|
||||
{ label: 'Costa Rica', value: 'CR' },
|
||||
{ label: 'Cuba', value: 'CU' },
|
||||
{ label: 'Cape Verde', value: 'CV' },
|
||||
{ label: 'Curaçao', value: 'CW' },
|
||||
{ label: 'Christmas Island', value: 'CX' },
|
||||
{ label: 'Cyprus', value: 'CY' },
|
||||
{ label: 'Czechia', value: 'CZ' },
|
||||
{ label: 'Germany', value: 'DE' },
|
||||
{ label: 'Djibouti', value: 'DJ' },
|
||||
{ label: 'Denmark', value: 'DK' },
|
||||
{ label: 'Dominica', value: 'DM' },
|
||||
{ label: 'Dominican Republic', value: 'DO' },
|
||||
{ label: 'Algeria', value: 'DZ' },
|
||||
{ label: 'Ecuador', value: 'EC' },
|
||||
{ label: 'Estonia', value: 'EE' },
|
||||
{ label: 'Egypt', value: 'EG' },
|
||||
{ label: 'Western Sahara', value: 'EH' },
|
||||
{ label: 'Eritrea', value: 'ER' },
|
||||
{ label: 'Spain', value: 'ES' },
|
||||
{ label: 'Ethiopia', value: 'ET' },
|
||||
{ label: 'Finland', value: 'FI' },
|
||||
{ label: 'Fiji', value: 'FJ' },
|
||||
{ label: 'Falkland Islands (Islas Malvinas)', value: 'FK' },
|
||||
{ label: 'Micronesia', value: 'FM' },
|
||||
{ label: 'Faroe Islands', value: 'FO' },
|
||||
{ label: 'France', value: 'FR' },
|
||||
{ label: 'Gabon', value: 'GA' },
|
||||
{ label: 'United Kingdom', value: 'GB' },
|
||||
{ label: 'Grenada', value: 'GD' },
|
||||
{ label: 'Georgia', value: 'GE' },
|
||||
{ label: 'French Guiana', value: 'GF' },
|
||||
{ label: 'Guernsey', value: 'GG' },
|
||||
{ label: 'Ghana', value: 'GH' },
|
||||
{ label: 'Gibraltar', value: 'GI' },
|
||||
{ label: 'Greenland', value: 'GL' },
|
||||
{ label: 'Gambia', value: 'GM' },
|
||||
{ label: 'Guinea', value: 'GN' },
|
||||
{ label: 'Guadeloupe', value: 'GP' },
|
||||
{ label: 'Equatorial Guinea', value: 'GQ' },
|
||||
{ label: 'Greece', value: 'GR' },
|
||||
{ label: 'Guatemala', value: 'GT' },
|
||||
{ label: 'Guam', value: 'GU' },
|
||||
{ label: 'Guinea-Bissau', value: 'GW' },
|
||||
{ label: 'Guyana', value: 'GY' },
|
||||
{ label: 'Hong Kong', value: 'HK' },
|
||||
{ label: 'Honduras', value: 'HN' },
|
||||
{ label: 'Croatia', value: 'HR' },
|
||||
{ label: 'Haiti', value: 'HT' },
|
||||
{ label: 'Hungary', value: 'HU' },
|
||||
{ label: 'Indonesia', value: 'ID' },
|
||||
{ label: 'Ireland', value: 'IE' },
|
||||
{ label: 'Israel', value: 'IL' },
|
||||
{ label: 'Isle of Man', value: 'IM' },
|
||||
{ label: 'India', value: 'IN' },
|
||||
{ label: 'British Indian Ocean Territory', value: 'IO' },
|
||||
{ label: 'Iraq', value: 'IQ' },
|
||||
{ label: 'Iran', value: 'IR' },
|
||||
{ label: 'Iceland', value: 'IS' },
|
||||
{ label: 'Italy', value: 'IT' },
|
||||
{ label: 'Jersey', value: 'JE' },
|
||||
{ label: 'Jamaica', value: 'JM' },
|
||||
{ label: 'Jordan', value: 'JO' },
|
||||
{ label: 'Japan', value: 'JP' },
|
||||
{ label: 'Kenya', value: 'KE' },
|
||||
{ label: 'Kyrgyzstan', value: 'KG' },
|
||||
{ label: 'Cambodia', value: 'KH' },
|
||||
{ label: 'Kiribati', value: 'KI' },
|
||||
{ label: 'Comoros', value: 'KM' },
|
||||
{ label: 'St. Kitts & Nevis', value: 'KN' },
|
||||
{ label: 'North Korea', value: 'KP' },
|
||||
{ label: 'South Korea', value: 'KR' },
|
||||
{ label: 'Kuwait', value: 'KW' },
|
||||
{ label: 'Cayman Islands', value: 'KY' },
|
||||
{ label: 'Kazakhstan', value: 'KZ' },
|
||||
{ label: 'Laos', value: 'LA' },
|
||||
{ label: 'Lebanon', value: 'LB' },
|
||||
{ label: 'St. Lucia', value: 'LC' },
|
||||
{ label: 'Liechtenstein', value: 'LI' },
|
||||
{ label: 'Sri Lanka', value: 'LK' },
|
||||
{ label: 'Liberia', value: 'LR' },
|
||||
{ label: 'Lesotho', value: 'LS' },
|
||||
{ label: 'Lithuania', value: 'LT' },
|
||||
{ label: 'Luxembourg', value: 'LU' },
|
||||
{ label: 'Latvia', value: 'LV' },
|
||||
{ label: 'Libya', value: 'LY' },
|
||||
{ label: 'Morocco', value: 'MA' },
|
||||
{ label: 'Monaco', value: 'MC' },
|
||||
{ label: 'Moldova', value: 'MD' },
|
||||
{ label: 'Montenegro', value: 'ME' },
|
||||
{ label: 'St. Martin', value: 'MF' },
|
||||
{ label: 'Madagascar', value: 'MG' },
|
||||
{ label: 'Marshall Islands', value: 'MH' },
|
||||
{ label: 'North Macedonia', value: 'MK' },
|
||||
{ label: 'Mali', value: 'ML' },
|
||||
{ label: 'Myanmar (Burma)', value: 'MM' },
|
||||
{ label: 'Mongolia', value: 'MN' },
|
||||
{ label: 'Macao', value: 'MO' },
|
||||
{ label: 'Northern Mariana Islands', value: 'MP' },
|
||||
{ label: 'Martinique', value: 'MQ' },
|
||||
{ label: 'Mauritania', value: 'MR' },
|
||||
{ label: 'Montserrat', value: 'MS' },
|
||||
{ label: 'Malta', value: 'MT' },
|
||||
{ label: 'Mauritius', value: 'MU' },
|
||||
{ label: 'Maldives', value: 'MV' },
|
||||
{ label: 'Malawi', value: 'MW' },
|
||||
{ label: 'Mexico', value: 'MX' },
|
||||
{ label: 'Malaysia', value: 'MY' },
|
||||
{ label: 'Mozambique', value: 'MZ' },
|
||||
{ label: 'Namibia', value: 'NA' },
|
||||
{ label: 'New Caledonia', value: 'NC' },
|
||||
{ label: 'Niger', value: 'NE' },
|
||||
{ label: 'Norfolk Island', value: 'NF' },
|
||||
{ label: 'Nigeria', value: 'NG' },
|
||||
{ label: 'Nicaragua', value: 'NI' },
|
||||
{ label: 'Netherlands', value: 'NL' },
|
||||
{ label: 'Norway', value: 'NO' },
|
||||
{ label: 'Nepal', value: 'NP' },
|
||||
{ label: 'Nauru', value: 'NR' },
|
||||
{ label: 'Niue', value: 'NU' },
|
||||
{ label: 'New Zealand', value: 'NZ' },
|
||||
{ label: 'Oman', value: 'OM' },
|
||||
{ label: 'Panama', value: 'PA' },
|
||||
{ label: 'Peru', value: 'PE' },
|
||||
{ label: 'French Polynesia', value: 'PF' },
|
||||
{ label: 'Papua New Guinea', value: 'PG' },
|
||||
{ label: 'Philippines', value: 'PH' },
|
||||
{ label: 'Pakistan', value: 'PK' },
|
||||
{ label: 'Poland', value: 'PL' },
|
||||
{ label: 'St. Pierre & Miquelon', value: 'PM' },
|
||||
{ label: 'Puerto Rico', value: 'PR' },
|
||||
{ label: 'Palestine', value: 'PS' },
|
||||
{ label: 'Portugal', value: 'PT' },
|
||||
{ label: 'Palau', value: 'PW' },
|
||||
{ label: 'Paraguay', value: 'PY' },
|
||||
{ label: 'Qatar', value: 'QA' },
|
||||
{ label: 'Réunion', value: 'RE' },
|
||||
{ label: 'Romania', value: 'RO' },
|
||||
{ label: 'Serbia', value: 'RS' },
|
||||
{ label: 'Russia', value: 'RU' },
|
||||
{ label: 'Rwanda', value: 'RW' },
|
||||
{ label: 'Saudi Arabia', value: 'SA' },
|
||||
{ label: 'Solomon Islands', value: 'SB' },
|
||||
{ label: 'Seychelles', value: 'SC' },
|
||||
{ label: 'Sudan', value: 'SD' },
|
||||
{ label: 'Sweden', value: 'SE' },
|
||||
{ label: 'Singapore', value: 'SG' },
|
||||
{ label: 'St. Helena', value: 'SH' },
|
||||
{ label: 'Slovenia', value: 'SI' },
|
||||
{ label: 'Svalbard & Jan Mayen', value: 'SJ' },
|
||||
{ label: 'Slovakia', value: 'SK' },
|
||||
{ label: 'Sierra Leone', value: 'SL' },
|
||||
{ label: 'San Marino', value: 'SM' },
|
||||
{ label: 'Senegal', value: 'SN' },
|
||||
{ label: 'Somalia', value: 'SO' },
|
||||
{ label: 'Suriname', value: 'SR' },
|
||||
{ label: 'South Sudan', value: 'SS' },
|
||||
{ label: 'São Tomé & Príncipe', value: 'ST' },
|
||||
{ label: 'El Salvador', value: 'SV' },
|
||||
{ label: 'Sint Maarten', value: 'SX' },
|
||||
{ label: 'Syria', value: 'SY' },
|
||||
{ label: 'Eswatini', value: 'SZ' },
|
||||
{ label: 'Tristan da Cunha', value: 'TA' },
|
||||
{ label: 'Turks & Caicos Islands', value: 'TC' },
|
||||
{ label: 'Chad', value: 'TD' },
|
||||
{ label: 'Togo', value: 'TG' },
|
||||
{ label: 'Thailand', value: 'TH' },
|
||||
{ label: 'Tajikistan', value: 'TJ' },
|
||||
{ label: 'Tokelau', value: 'TK' },
|
||||
{ label: 'Timor-Leste', value: 'TL' },
|
||||
{ label: 'Turkmenistan', value: 'TM' },
|
||||
{ label: 'Tunisia', value: 'TN' },
|
||||
{ label: 'Tonga', value: 'TO' },
|
||||
{ label: 'Türkiye', value: 'TR' },
|
||||
{ label: 'Trinidad & Tobago', value: 'TT' },
|
||||
{ label: 'Tuvalu', value: 'TV' },
|
||||
{ label: 'Taiwan', value: 'TW' },
|
||||
{ label: 'Tanzania', value: 'TZ' },
|
||||
{ label: 'Ukraine', value: 'UA' },
|
||||
{ label: 'Uganda', value: 'UG' },
|
||||
{ label: 'United States', value: 'US' },
|
||||
{ label: 'Uruguay', value: 'UY' },
|
||||
{ label: 'Uzbekistan', value: 'UZ' },
|
||||
{ label: 'Vatican City', value: 'VA' },
|
||||
{ label: 'St. Vincent & Grenadines', value: 'VC' },
|
||||
{ label: 'Venezuela', value: 'VE' },
|
||||
{ label: 'British Virgin Islands', value: 'VG' },
|
||||
{ label: 'U.S. Virgin Islands', value: 'VI' },
|
||||
{ label: 'Vietnam', value: 'VN' },
|
||||
{ label: 'Vanuatu', value: 'VU' },
|
||||
{ label: 'Wallis & Futuna', value: 'WF' },
|
||||
{ label: 'Samoa', value: 'WS' },
|
||||
{ label: 'Kosovo', value: 'XK' },
|
||||
{ label: 'Yemen', value: 'YE' },
|
||||
{ label: 'Mayotte', value: 'YT' },
|
||||
{ label: 'South Africa', value: 'ZA' },
|
||||
{ label: 'Zambia', value: 'ZM' },
|
||||
{ label: 'Zimbabwe', value: 'ZW' },
|
||||
];
|
||||
|
||||
export default phoneNumberCountryCodes;
|
@@ -12,6 +12,7 @@ import useDefaultValue from './text/use-default-value';
|
||||
import performMathOperation from './numbers/perform-math-operation';
|
||||
import randomNumber from './numbers/random-number';
|
||||
import formatNumber from './numbers/format-number';
|
||||
import formatPhoneNumber from './numbers/format-phone-number';
|
||||
import formatDateTime from './date-time/format-date-time';
|
||||
|
||||
const options: IJSONObject = {
|
||||
@@ -28,6 +29,7 @@ const options: IJSONObject = {
|
||||
performMathOperation,
|
||||
randomNumber,
|
||||
formatNumber,
|
||||
formatPhoneNumber,
|
||||
formatDateTime,
|
||||
};
|
||||
|
||||
|
@@ -0,0 +1,36 @@
|
||||
import phoneNumberCountryCodes from '../../../common/phone-number-country-codes';
|
||||
|
||||
const formatPhoneNumber = [
|
||||
{
|
||||
label: 'Phone Number',
|
||||
key: 'phoneNumber',
|
||||
type: 'string' as const,
|
||||
required: true,
|
||||
description: 'The phone number you want to format.',
|
||||
variables: true,
|
||||
},
|
||||
{
|
||||
label: 'To Format',
|
||||
key: 'toFormat',
|
||||
type: 'dropdown' as const,
|
||||
required: true,
|
||||
description: 'The format you want to convert the number to.',
|
||||
variables: true,
|
||||
options: [
|
||||
{ label: '+491632223344 (E164)', value: 'e164' },
|
||||
{ label: '+49 163 2223344 (International)', value: 'international' },
|
||||
{ label: '0163 2223344 (National)', value: 'national' },
|
||||
],
|
||||
},
|
||||
{
|
||||
label: 'Phone Number Country Code',
|
||||
key: 'phoneNumberCountryCode',
|
||||
type: 'dropdown' as const,
|
||||
required: true,
|
||||
description: 'The country code of the phone number. The default is US.',
|
||||
variables: true,
|
||||
options: phoneNumberCountryCodes,
|
||||
},
|
||||
];
|
||||
|
||||
export default formatPhoneNumber;
|
60
packages/backend/src/apps/ghost/assets/favicon.svg
Normal file
60
packages/backend/src/apps/ghost/assets/favicon.svg
Normal file
@@ -0,0 +1,60 @@
|
||||
<?xml version="1.0" standalone="no"?>
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20010904//EN"
|
||||
"http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">
|
||||
<svg version="1.0" xmlns="http://www.w3.org/2000/svg"
|
||||
width="400.000000pt" height="400.000000pt" viewBox="0 0 400.000000 400.000000"
|
||||
preserveAspectRatio="xMidYMid meet">
|
||||
|
||||
<g transform="translate(0.000000,400.000000) scale(0.100000,-0.100000)"
|
||||
fill="#000000" stroke="none">
|
||||
<path d="M1829 3850 c-287 -26 -616 -144 -862 -308 -135 -89 -408 -322 -475
|
||||
-405 -165 -201 -294 -475 -339 -717 -21 -117 -24 -472 -5 -630 36 -288 104
|
||||
-524 220 -753 106 -210 196 -343 306 -452 106 -105 195 -159 348 -213 57 -19
|
||||
135 -56 173 -80 217 -139 452 -205 725 -205 150 0 238 15 378 65 214 75 380
|
||||
175 522 314 89 87 101 95 175 120 161 54 277 127 419 263 217 210 362 458 437
|
||||
749 67 261 49 465 -78 862 -100 313 -183 445 -468 739 -202 208 -366 324 -650
|
||||
462 -328 159 -565 213 -826 189z m206 -29 c12 -5 -13 -10 -70 -14 -203 -13
|
||||
-587 -89 -701 -137 -26 -11 -49 -19 -51 -16 -5 5 128 61 217 91 81 28 235 64
|
||||
315 75 78 10 265 11 290 1z m-62 -142 c233 -14 324 -28 142 -22 -258 10 -585
|
||||
-22 -805 -77 -63 -16 -116 -28 -117 -26 -6 6 167 85 217 100 120 35 289 42
|
||||
563 25z m-773 -34 c0 -2 -13 -11 -30 -20 -38 -19 -40 -11 -2 9 31 17 32 18 32
|
||||
11z m1120 -68 c217 -49 376 -104 575 -203 199 -99 255 -141 363 -274 253 -311
|
||||
380 -563 411 -815 19 -158 15 -239 -23 -389 -42 -164 -94 -275 -208 -436 -44
|
||||
-63 -121 -173 -171 -245 -108 -156 -188 -258 -269 -344 -47 -49 -80 -72 -143
|
||||
-102 -98 -46 -457 -169 -494 -169 -14 0 -86 31 -161 69 -144 74 -183 88 -355
|
||||
127 -78 17 -138 39 -210 75 -439 223 -697 460 -867 798 -56 112 -64 114 -13 4
|
||||
68 -147 187 -314 301 -424 136 -130 382 -300 565 -390 46 -23 131 -69 189
|
||||
-103 127 -75 183 -99 297 -130 60 -15 89 -28 91 -39 6 -31 -34 -54 -144 -81
|
||||
-60 -14 -115 -33 -123 -41 -23 -23 -8 -20 212 34 l198 50 110 -12 c60 -6 109
|
||||
-14 109 -18 0 -6 -116 -62 -191 -92 -133 -54 -382 -104 -564 -113 -104 -5
|
||||
-108 -4 -82 11 15 9 27 17 27 19 0 2 -42 -6 -92 -16 -89 -19 -97 -19 -178 -3
|
||||
-203 39 -488 226 -664 435 -172 204 -336 516 -409 780 -49 176 -61 269 -62
|
||||
485 0 195 1 203 33 330 78 301 191 585 277 690 l24 30 -20 -63 c-29 -96 -22
|
||||
-109 9 -17 52 155 125 242 300 356 59 39 116 62 300 123 394 130 430 136 717
|
||||
132 191 -3 235 -7 335 -29z m-1941 -729 c-88 -175 -129 -307 -164 -523 -21
|
||||
-135 -22 -138 -30 -91 -10 64 1 226 20 297 21 81 70 194 115 271 37 62 86 128
|
||||
96 128 2 0 -14 -37 -37 -82z m100 -28 c-43 -99 -99 -284 -123 -400 -28 -138
|
||||
-46 -386 -36 -495 13 -146 38 -303 65 -413 29 -119 185 -437 300 -612 75 -116
|
||||
86 -140 62 -140 -40 0 -208 164 -283 276 -71 106 -93 173 -98 293 -4 83 -10
|
||||
110 -45 201 -46 116 -56 166 -70 348 -16 194 13 437 74 617 44 132 174 415
|
||||
190 415 1 0 -15 -41 -36 -90z m3340 -622 c83 -383 16 -750 -195 -1076 -98
|
||||
-150 -283 -323 -435 -406 -60 -33 -169 -76 -191 -76 -19 0 86 111 228 241 172
|
||||
157 253 254 313 376 24 48 67 125 96 169 69 105 108 184 141 281 35 103 43
|
||||
263 20 412 -18 115 -21 216 -7 191 5 -8 18 -59 30 -112z m-152 -310 c-3 -8 -6
|
||||
-5 -6 6 -1 11 2 17 5 13 3 -3 4 -12 1 -19z m-22 -167 c-42 -233 -142 -442
|
||||
-285 -594 -60 -65 -204 -180 -285 -228 l-40 -24 31 40 c18 22 94 130 171 240
|
||||
77 110 173 248 214 306 89 126 148 237 180 339 20 61 25 69 27 45 2 -16 -4
|
||||
-72 -13 -124z m-2954 -986 c77 -64 259 -248 259 -262 0 -26 -70 5 -166 73 -88
|
||||
62 -174 176 -174 231 0 18 22 7 81 -42z m1310 -11 c26 -8 55 -24 64 -34 18
|
||||
-19 17 -20 -8 -20 -25 0 -118 31 -146 49 -7 5 -11 13 -7 19 7 11 25 8 97 -14z
|
||||
m805 -33 c-3 -4 -30 -27 -60 -50 -52 -40 -57 -42 -117 -39 l-62 3 119 47 c138
|
||||
54 127 50 120 39z m-1515 -324 c49 -23 89 -45 89 -49 0 -21 -187 27 -235 61
|
||||
-37 26 -135 136 -135 152 0 4 43 -22 97 -58 53 -35 136 -83 184 -106z m1501
|
||||
125 c-147 -175 -408 -321 -672 -377 -92 -19 -292 -19 -403 0 -190 33 -394 119
|
||||
-371 156 4 6 41 8 97 4 98 -7 299 6 487 31 274 37 429 79 600 162 92 45 127
|
||||
54 288 71 8 0 -4 -21 -26 -47z"/>
|
||||
<path d="M632 2890 c0 -14 2 -19 5 -12 2 6 2 18 0 25 -3 6 -5 1 -5 -13z"/>
|
||||
<path d="M622 2825 c0 -16 2 -22 5 -12 2 9 2 23 0 30 -3 6 -5 -1 -5 -18z"/>
|
||||
<path d="M691 1840 c0 -8 4 -22 9 -30 12 -18 12 -2 0 25 -6 13 -9 15 -9 5z"/>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 3.9 KiB |
32
packages/backend/src/apps/ghost/auth/index.ts
Normal file
32
packages/backend/src/apps/ghost/auth/index.ts
Normal file
@@ -0,0 +1,32 @@
|
||||
import verifyCredentials from './verify-credentials';
|
||||
import isStillVerified from './is-still-verified';
|
||||
|
||||
export default {
|
||||
fields: [
|
||||
{
|
||||
key: 'instanceUrl',
|
||||
label: 'Instance URL',
|
||||
type: 'string' as const,
|
||||
required: true,
|
||||
readOnly: false,
|
||||
value: null,
|
||||
placeholder: null,
|
||||
description: null,
|
||||
clickToCopy: false,
|
||||
},
|
||||
{
|
||||
key: 'apiKey',
|
||||
label: 'Admin API Key',
|
||||
type: 'string' as const,
|
||||
required: true,
|
||||
readOnly: false,
|
||||
value: null,
|
||||
placeholder: null,
|
||||
description: null,
|
||||
clickToCopy: false,
|
||||
},
|
||||
],
|
||||
|
||||
verifyCredentials,
|
||||
isStillVerified,
|
||||
};
|
@@ -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;
|
16
packages/backend/src/apps/ghost/auth/verify-credentials.ts
Normal file
16
packages/backend/src/apps/ghost/auth/verify-credentials.ts
Normal file
@@ -0,0 +1,16 @@
|
||||
import { IGlobalVariable } from '@automatisch/types';
|
||||
|
||||
const verifyCredentials = async ($: IGlobalVariable) => {
|
||||
const site = await $.http.get('/admin/site/');
|
||||
const screenName = [site.data.site.title, site.data.site.url]
|
||||
.filter(Boolean)
|
||||
.join(' @ ');
|
||||
|
||||
await $.auth.set({
|
||||
screenName,
|
||||
});
|
||||
|
||||
await $.http.get('/admin/pages/');
|
||||
};
|
||||
|
||||
export default verifyCredentials;
|
23
packages/backend/src/apps/ghost/common/add-auth-header.ts
Normal file
23
packages/backend/src/apps/ghost/common/add-auth-header.ts
Normal file
@@ -0,0 +1,23 @@
|
||||
import { TBeforeRequest } from '@automatisch/types';
|
||||
import jwt from 'jsonwebtoken';
|
||||
|
||||
const addAuthHeader: TBeforeRequest = ($, requestConfig) => {
|
||||
const key = $.auth.data?.apiKey as string;
|
||||
|
||||
if (key) {
|
||||
const [id, secret] = key.split(':');
|
||||
|
||||
const token = jwt.sign({}, Buffer.from(secret, 'hex'), {
|
||||
keyid: id,
|
||||
algorithm: 'HS256',
|
||||
expiresIn: '1h',
|
||||
audience: `/admin/`,
|
||||
});
|
||||
|
||||
requestConfig.headers.Authorization = `Ghost ${token}`;
|
||||
}
|
||||
|
||||
return requestConfig;
|
||||
};
|
||||
|
||||
export default addAuthHeader;
|
12
packages/backend/src/apps/ghost/common/set-base-url.ts
Normal file
12
packages/backend/src/apps/ghost/common/set-base-url.ts
Normal file
@@ -0,0 +1,12 @@
|
||||
import { TBeforeRequest } from '@automatisch/types';
|
||||
|
||||
const setBaseUrl: TBeforeRequest = ($, requestConfig) => {
|
||||
const instanceUrl = $.auth.data.instanceUrl as string;
|
||||
if (instanceUrl) {
|
||||
requestConfig.baseURL = `${instanceUrl}/ghost/api`;
|
||||
}
|
||||
|
||||
return requestConfig;
|
||||
};
|
||||
|
||||
export default setBaseUrl;
|
0
packages/backend/src/apps/ghost/index.d.ts
vendored
Normal file
0
packages/backend/src/apps/ghost/index.d.ts
vendored
Normal file
19
packages/backend/src/apps/ghost/index.ts
Normal file
19
packages/backend/src/apps/ghost/index.ts
Normal file
@@ -0,0 +1,19 @@
|
||||
import defineApp from '../../helpers/define-app';
|
||||
import addAuthHeader from './common/add-auth-header';
|
||||
import setBaseUrl from './common/set-base-url';
|
||||
import auth from './auth';
|
||||
import triggers from './triggers';
|
||||
|
||||
export default defineApp({
|
||||
name: 'Ghost',
|
||||
key: 'ghost',
|
||||
baseUrl: 'https://ghost.org',
|
||||
apiBaseUrl: '',
|
||||
iconUrl: '{BASE_URL}/apps/ghost/assets/favicon.svg',
|
||||
authDocUrl: 'https://automatisch.io/docs/apps/ghost/connection',
|
||||
primaryColor: '15171A',
|
||||
supportsConnections: true,
|
||||
beforeRequest: [setBaseUrl, addAuthHeader],
|
||||
auth,
|
||||
triggers,
|
||||
});
|
3
packages/backend/src/apps/ghost/triggers/index.ts
Normal file
3
packages/backend/src/apps/ghost/triggers/index.ts
Normal file
@@ -0,0 +1,3 @@
|
||||
import newPostPublished from './new-post-published';
|
||||
|
||||
export default [newPostPublished];
|
@@ -0,0 +1,55 @@
|
||||
import Crypto from 'crypto';
|
||||
import isEmpty from 'lodash/isEmpty';
|
||||
import defineTrigger from '../../../../helpers/define-trigger';
|
||||
|
||||
export default defineTrigger({
|
||||
name: 'New post published',
|
||||
key: 'newPostPublished',
|
||||
type: 'webhook',
|
||||
description: 'Triggers when a new post is published.',
|
||||
|
||||
async run($) {
|
||||
const dataItem = {
|
||||
raw: $.request.body,
|
||||
meta: {
|
||||
internalId: Crypto.randomUUID(),
|
||||
},
|
||||
};
|
||||
|
||||
$.pushTriggerItem(dataItem);
|
||||
},
|
||||
|
||||
async testRun($) {
|
||||
const lastExecutionStep = await $.getLastExecutionStep();
|
||||
|
||||
if (!isEmpty(lastExecutionStep?.dataOut)) {
|
||||
$.pushTriggerItem({
|
||||
raw: lastExecutionStep.dataOut,
|
||||
meta: {
|
||||
internalId: '',
|
||||
},
|
||||
});
|
||||
}
|
||||
},
|
||||
|
||||
async registerHook($) {
|
||||
const payload = {
|
||||
webhooks: [
|
||||
{
|
||||
event: 'post.published',
|
||||
target_url: $.webhookUrl,
|
||||
name: `Flow ID: ${$.flow.id}`,
|
||||
},
|
||||
],
|
||||
};
|
||||
|
||||
const response = await $.http.post('/admin/webhooks/', payload);
|
||||
const id = response.data.webhooks[0].id;
|
||||
|
||||
await $.flow.setRemoteWebhookId(id);
|
||||
},
|
||||
|
||||
async unregisterHook($) {
|
||||
await $.http.delete(`/admin/webhooks/${$.flow.remoteWebhookId}/`);
|
||||
},
|
||||
});
|
@@ -3,6 +3,7 @@ import defineTrigger from '../../../../helpers/define-trigger';
|
||||
import { GITLAB_EVENT_TYPE } from '../types';
|
||||
import {
|
||||
getRegisterHookFn,
|
||||
getRunFn,
|
||||
getTestRunFn,
|
||||
projectArgumentDescriptor,
|
||||
unregisterHook,
|
||||
@@ -19,6 +20,7 @@ export const triggerDescriptor: IRawTrigger = {
|
||||
key: GITLAB_EVENT_TYPE.confidential_issues_events,
|
||||
type: 'webhook',
|
||||
arguments: [projectArgumentDescriptor],
|
||||
run: ($) => getRunFn($),
|
||||
testRun: getTestRunFn(data),
|
||||
registerHook: getRegisterHookFn(GITLAB_EVENT_TYPE.confidential_issues_events),
|
||||
unregisterHook,
|
||||
|
@@ -3,6 +3,7 @@ import defineTrigger from '../../../../helpers/define-trigger';
|
||||
import { GITLAB_EVENT_TYPE } from '../types';
|
||||
import {
|
||||
getRegisterHookFn,
|
||||
getRunFn,
|
||||
getTestRunFn,
|
||||
projectArgumentDescriptor,
|
||||
unregisterHook,
|
||||
@@ -19,6 +20,7 @@ export const triggerDescriptor: IRawTrigger = {
|
||||
key: GITLAB_EVENT_TYPE.confidential_note_events,
|
||||
type: 'webhook',
|
||||
arguments: [projectArgumentDescriptor],
|
||||
run: ($) => getRunFn($),
|
||||
testRun: getTestRunFn(data),
|
||||
registerHook: getRegisterHookFn(GITLAB_EVENT_TYPE.confidential_note_events),
|
||||
unregisterHook,
|
||||
|
@@ -3,6 +3,7 @@ import defineTrigger from '../../../../helpers/define-trigger';
|
||||
import { GITLAB_EVENT_TYPE } from '../types';
|
||||
import {
|
||||
getRegisterHookFn,
|
||||
getRunFn,
|
||||
getTestRunFn,
|
||||
projectArgumentDescriptor,
|
||||
unregisterHook,
|
||||
@@ -18,6 +19,7 @@ export const triggerDescriptor: IRawTrigger = {
|
||||
key: GITLAB_EVENT_TYPE.deployment_events,
|
||||
type: 'webhook',
|
||||
arguments: [projectArgumentDescriptor],
|
||||
run: ($) => getRunFn($),
|
||||
testRun: getTestRunFn(data),
|
||||
registerHook: getRegisterHookFn(GITLAB_EVENT_TYPE.deployment_events),
|
||||
unregisterHook,
|
||||
|
@@ -3,6 +3,7 @@ import defineTrigger from '../../../../helpers/define-trigger';
|
||||
import { GITLAB_EVENT_TYPE } from '../types';
|
||||
import {
|
||||
getRegisterHookFn,
|
||||
getRunFn,
|
||||
getTestRunFn,
|
||||
projectArgumentDescriptor,
|
||||
unregisterHook,
|
||||
@@ -18,6 +19,7 @@ export const triggerDescriptor: IRawTrigger = {
|
||||
key: GITLAB_EVENT_TYPE.feature_flag_events,
|
||||
type: 'webhook',
|
||||
arguments: [projectArgumentDescriptor],
|
||||
run: ($) => getRunFn($),
|
||||
testRun: getTestRunFn(data),
|
||||
registerHook: getRegisterHookFn(GITLAB_EVENT_TYPE.feature_flag_events),
|
||||
unregisterHook,
|
||||
|
@@ -3,6 +3,7 @@ import defineTrigger from '../../../../helpers/define-trigger';
|
||||
import { GITLAB_EVENT_TYPE } from '../types';
|
||||
import {
|
||||
getRegisterHookFn,
|
||||
getRunFn,
|
||||
getTestRunFn,
|
||||
projectArgumentDescriptor,
|
||||
unregisterHook,
|
||||
@@ -18,6 +19,7 @@ export const triggerDescriptor: IRawTrigger = {
|
||||
key: GITLAB_EVENT_TYPE.issues_events,
|
||||
type: 'webhook',
|
||||
arguments: [projectArgumentDescriptor],
|
||||
run: ($) => getRunFn($),
|
||||
testRun: getTestRunFn(data),
|
||||
registerHook: getRegisterHookFn(GITLAB_EVENT_TYPE.issues_events),
|
||||
unregisterHook,
|
||||
|
@@ -3,6 +3,7 @@ import defineTrigger from '../../../../helpers/define-trigger';
|
||||
import { GITLAB_EVENT_TYPE } from '../types';
|
||||
import {
|
||||
getRegisterHookFn,
|
||||
getRunFn,
|
||||
getTestRunFn,
|
||||
projectArgumentDescriptor,
|
||||
unregisterHook,
|
||||
@@ -17,6 +18,7 @@ export const triggerDescriptor: IRawTrigger = {
|
||||
key: GITLAB_EVENT_TYPE.job_events,
|
||||
type: 'webhook',
|
||||
arguments: [projectArgumentDescriptor],
|
||||
run: ($) => getRunFn($),
|
||||
testRun: getTestRunFn(data),
|
||||
registerHook: getRegisterHookFn(GITLAB_EVENT_TYPE.job_events),
|
||||
unregisterHook,
|
||||
|
@@ -22,6 +22,17 @@ export const projectArgumentDescriptor = {
|
||||
},
|
||||
};
|
||||
|
||||
export const getRunFn = async ($: IGlobalVariable) => {
|
||||
const dataItem = {
|
||||
raw: $.request.body,
|
||||
meta: {
|
||||
internalId: Crypto.randomUUID(),
|
||||
},
|
||||
};
|
||||
|
||||
$.pushTriggerItem(dataItem);
|
||||
};
|
||||
|
||||
export const getTestRunFn =
|
||||
(eventData: IJSONObject) => ($: IGlobalVariable) => {
|
||||
/*
|
||||
|
@@ -3,6 +3,7 @@ import defineTrigger from '../../../../helpers/define-trigger';
|
||||
import { GITLAB_EVENT_TYPE } from '../types';
|
||||
import {
|
||||
getRegisterHookFn,
|
||||
getRunFn,
|
||||
getTestRunFn,
|
||||
projectArgumentDescriptor,
|
||||
unregisterHook,
|
||||
@@ -18,6 +19,7 @@ export const triggerDescriptor: IRawTrigger = {
|
||||
key: GITLAB_EVENT_TYPE.merge_requests_events,
|
||||
type: 'webhook',
|
||||
arguments: [projectArgumentDescriptor],
|
||||
run: ($) => getRunFn($),
|
||||
testRun: getTestRunFn(data),
|
||||
registerHook: getRegisterHookFn(GITLAB_EVENT_TYPE.merge_requests_events),
|
||||
unregisterHook,
|
||||
|
@@ -3,6 +3,7 @@ import defineTrigger from '../../../../helpers/define-trigger';
|
||||
import { GITLAB_EVENT_TYPE } from '../types';
|
||||
import {
|
||||
getRegisterHookFn,
|
||||
getRunFn,
|
||||
getTestRunFn,
|
||||
projectArgumentDescriptor,
|
||||
unregisterHook,
|
||||
@@ -18,6 +19,7 @@ export const triggerDescriptor: IRawTrigger = {
|
||||
key: GITLAB_EVENT_TYPE.note_events,
|
||||
type: 'webhook',
|
||||
arguments: [projectArgumentDescriptor],
|
||||
run: ($) => getRunFn($),
|
||||
testRun: getTestRunFn(data),
|
||||
registerHook: getRegisterHookFn(GITLAB_EVENT_TYPE.note_events),
|
||||
unregisterHook,
|
||||
|
@@ -3,6 +3,7 @@ import defineTrigger from '../../../../helpers/define-trigger';
|
||||
import { GITLAB_EVENT_TYPE } from '../types';
|
||||
import {
|
||||
getRegisterHookFn,
|
||||
getRunFn,
|
||||
getTestRunFn,
|
||||
projectArgumentDescriptor,
|
||||
unregisterHook,
|
||||
@@ -18,6 +19,7 @@ export const triggerDescriptor: IRawTrigger = {
|
||||
key: GITLAB_EVENT_TYPE.pipeline_events,
|
||||
type: 'webhook',
|
||||
arguments: [projectArgumentDescriptor],
|
||||
run: ($) => getRunFn($),
|
||||
testRun: getTestRunFn(data),
|
||||
registerHook: getRegisterHookFn(GITLAB_EVENT_TYPE.pipeline_events),
|
||||
unregisterHook,
|
||||
|
@@ -3,6 +3,7 @@ import defineTrigger from '../../../../helpers/define-trigger';
|
||||
import { GITLAB_EVENT_TYPE } from '../types';
|
||||
import {
|
||||
getRegisterHookFn,
|
||||
getRunFn,
|
||||
getTestRunFn,
|
||||
projectArgumentDescriptor,
|
||||
unregisterHook,
|
||||
@@ -54,6 +55,7 @@ export const triggerDescriptor: IRawTrigger = {
|
||||
branchFilterStrategyArgumentDescriptor,
|
||||
pushEventsBranchFilterArgumentDescriptor,
|
||||
],
|
||||
run: ($) => getRunFn($),
|
||||
testRun: getTestRunFn(data),
|
||||
registerHook: getRegisterHookFn(GITLAB_EVENT_TYPE.push_events),
|
||||
unregisterHook,
|
||||
|
@@ -3,6 +3,7 @@ import defineTrigger from '../../../../helpers/define-trigger';
|
||||
import { GITLAB_EVENT_TYPE } from '../types';
|
||||
import {
|
||||
getRegisterHookFn,
|
||||
getRunFn,
|
||||
getTestRunFn,
|
||||
projectArgumentDescriptor,
|
||||
unregisterHook,
|
||||
@@ -17,6 +18,7 @@ export const triggerDescriptor: IRawTrigger = {
|
||||
key: GITLAB_EVENT_TYPE.releases_events,
|
||||
type: 'webhook',
|
||||
arguments: [projectArgumentDescriptor],
|
||||
run: ($) => getRunFn($),
|
||||
testRun: getTestRunFn(data),
|
||||
registerHook: getRegisterHookFn(GITLAB_EVENT_TYPE.releases_events),
|
||||
unregisterHook,
|
||||
|
@@ -3,6 +3,7 @@ import defineTrigger from '../../../../helpers/define-trigger';
|
||||
import { GITLAB_EVENT_TYPE } from '../types';
|
||||
import {
|
||||
getRegisterHookFn,
|
||||
getRunFn,
|
||||
getTestRunFn,
|
||||
projectArgumentDescriptor,
|
||||
unregisterHook,
|
||||
@@ -18,6 +19,7 @@ export const triggerDescriptor: IRawTrigger = {
|
||||
key: GITLAB_EVENT_TYPE.tag_push_events,
|
||||
type: 'webhook',
|
||||
arguments: [projectArgumentDescriptor],
|
||||
run: ($) => getRunFn($),
|
||||
testRun: getTestRunFn(data),
|
||||
registerHook: getRegisterHookFn(GITLAB_EVENT_TYPE.tag_push_events),
|
||||
unregisterHook,
|
||||
|
@@ -3,6 +3,7 @@ import defineTrigger from '../../../../helpers/define-trigger';
|
||||
import { GITLAB_EVENT_TYPE } from '../types';
|
||||
import {
|
||||
getRegisterHookFn,
|
||||
getRunFn,
|
||||
getTestRunFn,
|
||||
projectArgumentDescriptor,
|
||||
unregisterHook,
|
||||
@@ -18,6 +19,7 @@ export const triggerDescriptor: IRawTrigger = {
|
||||
key: GITLAB_EVENT_TYPE.wiki_page_events,
|
||||
type: 'webhook',
|
||||
arguments: [projectArgumentDescriptor],
|
||||
run: ($) => getRunFn($),
|
||||
testRun: getTestRunFn(data),
|
||||
registerHook: getRegisterHookFn(GITLAB_EVENT_TYPE.wiki_page_events),
|
||||
unregisterHook,
|
||||
|
27
packages/backend/src/apps/google-calendar/assets/favicon.svg
Normal file
27
packages/backend/src/apps/google-calendar/assets/favicon.svg
Normal file
@@ -0,0 +1,27 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<svg version="1.1" id="Livello_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||
viewBox="0 0 200 200" enable-background="new 0 0 200 200" xml:space="preserve">
|
||||
<g>
|
||||
<g transform="translate(3.75 3.75)">
|
||||
<path fill="#FFFFFF" d="M148.882,43.618l-47.368-5.263l-57.895,5.263L38.355,96.25l5.263,52.632l52.632,6.579l52.632-6.579
|
||||
l5.263-53.947L148.882,43.618z"/>
|
||||
<path fill="#1A73E8" d="M65.211,125.276c-3.934-2.658-6.658-6.539-8.145-11.671l9.132-3.763c0.829,3.158,2.276,5.605,4.342,7.342
|
||||
c2.053,1.737,4.553,2.592,7.474,2.592c2.987,0,5.553-0.908,7.697-2.724s3.224-4.132,3.224-6.934c0-2.868-1.132-5.211-3.395-7.026
|
||||
s-5.105-2.724-8.5-2.724h-5.276v-9.039H76.5c2.921,0,5.382-0.789,7.382-2.368c2-1.579,3-3.737,3-6.487
|
||||
c0-2.447-0.895-4.395-2.684-5.855s-4.053-2.197-6.803-2.197c-2.684,0-4.816,0.711-6.395,2.145s-2.724,3.197-3.447,5.276
|
||||
l-9.039-3.763c1.197-3.395,3.395-6.395,6.618-8.987c3.224-2.592,7.342-3.895,12.342-3.895c3.697,0,7.026,0.711,9.974,2.145
|
||||
c2.947,1.434,5.263,3.421,6.934,5.947c1.671,2.539,2.5,5.382,2.5,8.539c0,3.224-0.776,5.947-2.329,8.184
|
||||
c-1.553,2.237-3.461,3.947-5.724,5.145v0.539c2.987,1.25,5.421,3.158,7.342,5.724c1.908,2.566,2.868,5.632,2.868,9.211
|
||||
s-0.908,6.776-2.724,9.579c-1.816,2.803-4.329,5.013-7.513,6.618c-3.197,1.605-6.789,2.421-10.776,2.421
|
||||
C73.408,129.263,69.145,127.934,65.211,125.276z"/>
|
||||
<path fill="#1A73E8" d="M121.25,79.961l-9.974,7.25l-5.013-7.605l17.987-12.974h6.895v61.197h-9.895L121.25,79.961z"/>
|
||||
<path fill="#EA4335" d="M148.882,196.25l47.368-47.368l-23.684-10.526l-23.684,10.526l-10.526,23.684L148.882,196.25z"/>
|
||||
<path fill="#34A853" d="M33.092,172.566l10.526,23.684h105.263v-47.368H43.618L33.092,172.566z"/>
|
||||
<path fill="#4285F4" d="M12.039-3.75C3.316-3.75-3.75,3.316-3.75,12.039v136.842l23.684,10.526l23.684-10.526V43.618h105.263
|
||||
l10.526-23.684L148.882-3.75H12.039z"/>
|
||||
<path fill="#188038" d="M-3.75,148.882v31.579c0,8.724,7.066,15.789,15.789,15.789h31.579v-47.368H-3.75z"/>
|
||||
<path fill="#FBBC04" d="M148.882,43.618v105.263h47.368V43.618l-23.684-10.526L148.882,43.618z"/>
|
||||
<path fill="#1967D2" d="M196.25,43.618V12.039c0-8.724-7.066-15.789-15.789-15.789h-31.579v47.368H196.25z"/>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 2.2 KiB |
@@ -0,0 +1,24 @@
|
||||
import { IField, IGlobalVariable } from '@automatisch/types';
|
||||
import { URLSearchParams } from 'url';
|
||||
import authScope from '../common/auth-scope';
|
||||
|
||||
export default async function generateAuthUrl($: IGlobalVariable) {
|
||||
const oauthRedirectUrlField = $.app.auth.fields.find(
|
||||
(field: IField) => field.key == 'oAuthRedirectUrl'
|
||||
);
|
||||
const redirectUri = oauthRedirectUrlField.value as string;
|
||||
const searchParams = new URLSearchParams({
|
||||
client_id: $.auth.data.clientId as string,
|
||||
redirect_uri: redirectUri,
|
||||
prompt: 'select_account',
|
||||
scope: authScope.join(' '),
|
||||
response_type: 'code',
|
||||
access_type: 'offline',
|
||||
});
|
||||
|
||||
const url = `https://accounts.google.com/o/oauth2/v2/auth?${searchParams.toString()}`;
|
||||
|
||||
await $.auth.set({
|
||||
url,
|
||||
});
|
||||
}
|
48
packages/backend/src/apps/google-calendar/auth/index.ts
Normal file
48
packages/backend/src/apps/google-calendar/auth/index.ts
Normal file
@@ -0,0 +1,48 @@
|
||||
import generateAuthUrl from './generate-auth-url';
|
||||
import verifyCredentials from './verify-credentials';
|
||||
import refreshToken from './refresh-token';
|
||||
import isStillVerified from './is-still-verified';
|
||||
|
||||
export default {
|
||||
fields: [
|
||||
{
|
||||
key: 'oAuthRedirectUrl',
|
||||
label: 'OAuth Redirect URL',
|
||||
type: 'string' as const,
|
||||
required: true,
|
||||
readOnly: true,
|
||||
value: '{WEB_APP_URL}/app/google-calendar/connections/add',
|
||||
placeholder: null,
|
||||
description:
|
||||
'When asked to input a redirect URL in Google Cloud, enter the URL above.',
|
||||
clickToCopy: true,
|
||||
},
|
||||
{
|
||||
key: 'clientId',
|
||||
label: 'Client ID',
|
||||
type: 'string' as const,
|
||||
required: true,
|
||||
readOnly: false,
|
||||
value: null,
|
||||
placeholder: null,
|
||||
description: null,
|
||||
clickToCopy: false,
|
||||
},
|
||||
{
|
||||
key: 'clientSecret',
|
||||
label: 'Client Secret',
|
||||
type: 'string' as const,
|
||||
required: true,
|
||||
readOnly: false,
|
||||
value: null,
|
||||
placeholder: null,
|
||||
description: null,
|
||||
clickToCopy: false,
|
||||
},
|
||||
],
|
||||
|
||||
generateAuthUrl,
|
||||
verifyCredentials,
|
||||
isStillVerified,
|
||||
refreshToken,
|
||||
};
|
@@ -0,0 +1,9 @@
|
||||
import { IGlobalVariable } from '@automatisch/types';
|
||||
import getCurrentUser from '../common/get-current-user';
|
||||
|
||||
const isStillVerified = async ($: IGlobalVariable) => {
|
||||
const currentUser = await getCurrentUser($);
|
||||
return !!currentUser.resourceName;
|
||||
};
|
||||
|
||||
export default isStillVerified;
|
@@ -0,0 +1,26 @@
|
||||
import { URLSearchParams } from 'node:url';
|
||||
import { IGlobalVariable } from '@automatisch/types';
|
||||
import authScope from '../common/auth-scope';
|
||||
|
||||
const refreshToken = async ($: IGlobalVariable) => {
|
||||
const params = new URLSearchParams({
|
||||
client_id: $.auth.data.clientId as string,
|
||||
client_secret: $.auth.data.clientSecret as string,
|
||||
grant_type: 'refresh_token',
|
||||
refresh_token: $.auth.data.refreshToken as string,
|
||||
});
|
||||
|
||||
const { data } = await $.http.post(
|
||||
'https://oauth2.googleapis.com/token',
|
||||
params.toString()
|
||||
);
|
||||
|
||||
await $.auth.set({
|
||||
accessToken: data.access_token,
|
||||
expiresIn: data.expires_in,
|
||||
scope: authScope.join(' '),
|
||||
tokenType: data.token_type,
|
||||
});
|
||||
};
|
||||
|
||||
export default refreshToken;
|
@@ -0,0 +1,57 @@
|
||||
import { IField, IGlobalVariable } from '@automatisch/types';
|
||||
import getCurrentUser from '../common/get-current-user';
|
||||
|
||||
type TUser = {
|
||||
displayName: string;
|
||||
metadata: {
|
||||
primary: boolean;
|
||||
};
|
||||
};
|
||||
|
||||
type TEmailAddress = {
|
||||
value: string;
|
||||
metadata: {
|
||||
primary: boolean;
|
||||
};
|
||||
};
|
||||
|
||||
const verifyCredentials = async ($: IGlobalVariable) => {
|
||||
const oauthRedirectUrlField = $.app.auth.fields.find(
|
||||
(field: IField) => field.key == 'oAuthRedirectUrl'
|
||||
);
|
||||
const redirectUri = oauthRedirectUrlField.value as string;
|
||||
const { data } = await $.http.post(`https://oauth2.googleapis.com/token`, {
|
||||
client_id: $.auth.data.clientId,
|
||||
client_secret: $.auth.data.clientSecret,
|
||||
code: $.auth.data.code,
|
||||
grant_type: 'authorization_code',
|
||||
redirect_uri: redirectUri,
|
||||
});
|
||||
|
||||
await $.auth.set({
|
||||
accessToken: data.access_token,
|
||||
tokenType: data.token_type,
|
||||
});
|
||||
|
||||
const currentUser = await getCurrentUser($);
|
||||
|
||||
const { displayName } = currentUser.names.find(
|
||||
(name: TUser) => name.metadata.primary
|
||||
);
|
||||
const { value: email } = currentUser.emailAddresses.find(
|
||||
(emailAddress: TEmailAddress) => emailAddress.metadata.primary
|
||||
);
|
||||
|
||||
await $.auth.set({
|
||||
clientId: $.auth.data.clientId,
|
||||
clientSecret: $.auth.data.clientSecret,
|
||||
scope: $.auth.data.scope,
|
||||
idToken: data.id_token,
|
||||
expiresIn: data.expires_in,
|
||||
refreshToken: data.refresh_token,
|
||||
resourceName: currentUser.resourceName,
|
||||
screenName: `${displayName} - ${email}`,
|
||||
});
|
||||
};
|
||||
|
||||
export default verifyCredentials;
|
@@ -0,0 +1,11 @@
|
||||
import { TBeforeRequest } from '@automatisch/types';
|
||||
|
||||
const addAuthHeader: TBeforeRequest = ($, requestConfig) => {
|
||||
if ($.auth.data?.accessToken) {
|
||||
requestConfig.headers.Authorization = `${$.auth.data.tokenType} ${$.auth.data.accessToken}`;
|
||||
}
|
||||
|
||||
return requestConfig;
|
||||
};
|
||||
|
||||
export default addAuthHeader;
|
@@ -0,0 +1,7 @@
|
||||
const authScope: string[] = [
|
||||
'https://www.googleapis.com/auth/calendar',
|
||||
'https://www.googleapis.com/auth/userinfo.email',
|
||||
'https://www.googleapis.com/auth/userinfo.profile',
|
||||
];
|
||||
|
||||
export default authScope;
|
@@ -0,0 +1,10 @@
|
||||
import { IGlobalVariable } from '@automatisch/types';
|
||||
|
||||
const getCurrentUser = async ($: IGlobalVariable) => {
|
||||
const { data: currentUser } = await $.http.get(
|
||||
'https://people.googleapis.com/v1/people/me?personFields=names,emailAddresses'
|
||||
);
|
||||
return currentUser;
|
||||
};
|
||||
|
||||
export default getCurrentUser;
|
@@ -0,0 +1,3 @@
|
||||
import listCalendars from './list-calendars';
|
||||
|
||||
export default [listCalendars];
|
@@ -0,0 +1,36 @@
|
||||
import { IGlobalVariable, IJSONObject } from '@automatisch/types';
|
||||
|
||||
export default {
|
||||
name: 'List calendars',
|
||||
key: 'listCalendars',
|
||||
|
||||
async run($: IGlobalVariable) {
|
||||
const drives: {
|
||||
data: IJSONObject[];
|
||||
} = {
|
||||
data: [],
|
||||
};
|
||||
|
||||
const params = {
|
||||
pageToken: undefined as unknown as string,
|
||||
};
|
||||
|
||||
do {
|
||||
const { data } = await $.http.get(`/v3/users/me/calendarList`, {
|
||||
params,
|
||||
});
|
||||
params.pageToken = data.nextPageToken;
|
||||
|
||||
if (data.items) {
|
||||
for (const calendar of data.items) {
|
||||
drives.data.push({
|
||||
value: calendar.id,
|
||||
name: calendar.summary,
|
||||
});
|
||||
}
|
||||
}
|
||||
} while (params.pageToken);
|
||||
|
||||
return drives;
|
||||
},
|
||||
};
|
0
packages/backend/src/apps/google-calendar/index.d.ts
vendored
Normal file
0
packages/backend/src/apps/google-calendar/index.d.ts
vendored
Normal file
20
packages/backend/src/apps/google-calendar/index.ts
Normal file
20
packages/backend/src/apps/google-calendar/index.ts
Normal file
@@ -0,0 +1,20 @@
|
||||
import defineApp from '../../helpers/define-app';
|
||||
import addAuthHeader from './common/add-auth-header';
|
||||
import auth from './auth';
|
||||
import triggers from './triggers';
|
||||
import dynamicData from './dynamic-data';
|
||||
|
||||
export default defineApp({
|
||||
name: 'Google Calendar',
|
||||
key: 'google-calendar',
|
||||
baseUrl: 'https://calendar.google.com',
|
||||
apiBaseUrl: 'https://www.googleapis.com/calendar',
|
||||
iconUrl: '{BASE_URL}/apps/google-calendar/assets/favicon.svg',
|
||||
authDocUrl: 'https://automatisch.io/docs/apps/google-calendar/connection',
|
||||
primaryColor: '448AFF',
|
||||
supportsConnections: true,
|
||||
beforeRequest: [addAuthHeader],
|
||||
auth,
|
||||
triggers,
|
||||
dynamicData,
|
||||
});
|
@@ -0,0 +1,4 @@
|
||||
import newCalendar from './new-calendar';
|
||||
import newEvent from './new-event';
|
||||
|
||||
export default [newCalendar, newEvent];
|
@@ -0,0 +1,34 @@
|
||||
import defineTrigger from '../../../../helpers/define-trigger';
|
||||
|
||||
export default defineTrigger({
|
||||
name: 'New calendar',
|
||||
key: 'newCalendar',
|
||||
pollInterval: 15,
|
||||
description: 'Triggers when a new calendar is created.',
|
||||
arguments: [],
|
||||
|
||||
async run($) {
|
||||
const params: Record<string, unknown> = {
|
||||
pageToken: undefined as unknown as string,
|
||||
maxResults: 250,
|
||||
};
|
||||
|
||||
do {
|
||||
const { data } = await $.http.get('/v3/users/me/calendarList', {
|
||||
params,
|
||||
});
|
||||
params.pageToken = data.nextPageToken;
|
||||
|
||||
if (data.items?.length) {
|
||||
for (const calendar of data.items.reverse()) {
|
||||
$.pushTriggerItem({
|
||||
raw: calendar,
|
||||
meta: {
|
||||
internalId: calendar.etag,
|
||||
},
|
||||
});
|
||||
}
|
||||
}
|
||||
} while (params.pageToken);
|
||||
},
|
||||
});
|
@@ -0,0 +1,55 @@
|
||||
import defineTrigger from '../../../../helpers/define-trigger';
|
||||
|
||||
export default defineTrigger({
|
||||
name: 'New event',
|
||||
key: 'newEvent',
|
||||
pollInterval: 15,
|
||||
description: 'Triggers when a new event is created.',
|
||||
arguments: [
|
||||
{
|
||||
label: 'Calendar',
|
||||
key: 'calendarId',
|
||||
type: 'dropdown' as const,
|
||||
required: true,
|
||||
description: '',
|
||||
variables: false,
|
||||
source: {
|
||||
type: 'query',
|
||||
name: 'getDynamicData',
|
||||
arguments: [
|
||||
{
|
||||
name: 'key',
|
||||
value: 'listCalendars',
|
||||
},
|
||||
],
|
||||
},
|
||||
},
|
||||
],
|
||||
|
||||
async run($) {
|
||||
const calendarId = $.step.parameters.calendarId;
|
||||
|
||||
const params: Record<string, unknown> = {
|
||||
pageToken: undefined as unknown as string,
|
||||
orderBy: 'updated',
|
||||
};
|
||||
|
||||
do {
|
||||
const { data } = await $.http.get(`/v3/calendars/${calendarId}/events`, {
|
||||
params,
|
||||
});
|
||||
params.pageToken = data.nextPageToken;
|
||||
|
||||
if (data.items?.length) {
|
||||
for (const event of data.items.reverse()) {
|
||||
$.pushTriggerItem({
|
||||
raw: event,
|
||||
meta: {
|
||||
internalId: event.etag,
|
||||
},
|
||||
});
|
||||
}
|
||||
}
|
||||
} while (params.pageToken);
|
||||
},
|
||||
});
|
@@ -0,0 +1,639 @@
|
||||
export const fields = [
|
||||
{
|
||||
label: 'Client Name',
|
||||
key: 'clientName',
|
||||
type: 'string' as const,
|
||||
required: false,
|
||||
description: '',
|
||||
variables: true,
|
||||
},
|
||||
{
|
||||
label: 'Contact First Name',
|
||||
key: 'contactFirstName',
|
||||
type: 'string' as const,
|
||||
required: false,
|
||||
description: '',
|
||||
variables: true,
|
||||
},
|
||||
{
|
||||
label: 'Contact Last Name',
|
||||
key: 'contactLastName',
|
||||
type: 'string' as const,
|
||||
required: false,
|
||||
description: '',
|
||||
variables: true,
|
||||
},
|
||||
{
|
||||
label: 'Contact Email',
|
||||
key: 'contactEmail',
|
||||
type: 'string' as const,
|
||||
required: false,
|
||||
description: '',
|
||||
variables: true,
|
||||
},
|
||||
{
|
||||
label: 'Contact Phone',
|
||||
key: 'contactPhone',
|
||||
type: 'string' as const,
|
||||
required: false,
|
||||
description: '',
|
||||
variables: true,
|
||||
},
|
||||
{
|
||||
label: 'Language Code',
|
||||
key: 'languageCode',
|
||||
type: 'dropdown' as const,
|
||||
required: false,
|
||||
description: '',
|
||||
variables: true,
|
||||
options: [
|
||||
{ value: 1, label: 'English - United States' },
|
||||
{ value: 2, label: 'Italian' },
|
||||
{ value: 3, label: 'German' },
|
||||
{ value: 4, label: 'French' },
|
||||
{ value: 5, label: 'Portuguese - Brazilian' },
|
||||
{ value: 6, label: 'Dutch' },
|
||||
{ value: 7, label: 'Spanish' },
|
||||
{ value: 8, label: 'Norwegian' },
|
||||
{ value: 9, label: 'Danish' },
|
||||
{ value: 10, label: 'Japanese' },
|
||||
{ value: 11, label: 'Swedish' },
|
||||
{ value: 12, label: 'Spanish - Spain' },
|
||||
{ value: 13, label: 'French - Canada' },
|
||||
{ value: 14, label: 'Lithuanian' },
|
||||
{ value: 15, label: 'Polish' },
|
||||
{ value: 16, label: 'Czech' },
|
||||
{ value: 17, label: 'Croatian' },
|
||||
{ value: 18, label: 'Albanian' },
|
||||
{ value: 19, label: 'Greek' },
|
||||
{ value: 20, label: 'English - United Kingdom' },
|
||||
{ value: 21, label: 'Portuguese - Portugal' },
|
||||
{ value: 22, label: 'Slovenian' },
|
||||
{ value: 23, label: 'Finnish' },
|
||||
{ value: 24, label: 'Romanian' },
|
||||
{ value: 25, label: 'Turkish - Turkey' },
|
||||
{ value: 26, label: 'Thai' },
|
||||
{ value: 27, label: 'Macedonian' },
|
||||
{ value: 28, label: 'Chinese - Taiwan' },
|
||||
{ value: 29, label: 'Russian (Russia)' },
|
||||
{ value: 30, label: 'Arabic' },
|
||||
{ value: 31, label: 'Persian' },
|
||||
{ value: 32, label: 'Latvian' },
|
||||
{ value: 33, label: 'Serbian' },
|
||||
{ value: 34, label: 'Slovak' },
|
||||
{ value: 35, label: 'Estonian' },
|
||||
{ value: 36, label: 'Bulgarian' },
|
||||
{ value: 37, label: 'Hebrew' },
|
||||
{ value: 38, label: 'Khmer' },
|
||||
{ value: 39, label: 'Hungarian' },
|
||||
{ value: 40, label: 'French - Swiss' },
|
||||
],
|
||||
},
|
||||
{
|
||||
label: 'Currency Code',
|
||||
key: 'currencyCode',
|
||||
type: 'dropdown' as const,
|
||||
required: false,
|
||||
description: '',
|
||||
variables: true,
|
||||
options: [
|
||||
{ value: 1, label: 'US Dollar' },
|
||||
{ value: 2, label: 'British Pound' },
|
||||
{ value: 3, label: 'Euro' },
|
||||
{ value: 4, label: 'South African Rand' },
|
||||
{ value: 5, label: 'Danish Krone' },
|
||||
{ value: 6, label: 'Israeli Shekel' },
|
||||
{ value: 7, label: 'Swedish Krona' },
|
||||
{ value: 8, label: 'Kenyan Shilling' },
|
||||
{ value: 9, label: 'Canadian Dollar' },
|
||||
{ value: 10, label: 'Philippine Peso' },
|
||||
{ value: 11, label: 'Indian Rupee' },
|
||||
{ value: 12, label: 'Australian Dollar' },
|
||||
{ value: 13, label: 'Singapore Dollar' },
|
||||
{ value: 14, label: 'Norske Kroner' },
|
||||
{ value: 15, label: 'New Zealand Dollar' },
|
||||
{ value: 16, label: 'Vietnamese Dong' },
|
||||
{ value: 17, label: 'Swiss Franc' },
|
||||
{ value: 18, label: 'Guatemalan Quetzal' },
|
||||
{ value: 19, label: 'Malaysian Ringgit' },
|
||||
{ value: 20, label: 'Brazilian Real' },
|
||||
{ value: 21, label: 'Thai Baht' },
|
||||
{ value: 22, label: 'Nigerian Naira' },
|
||||
{ value: 23, label: 'Argentine Peso' },
|
||||
{ value: 24, label: 'Bangladeshi Taka' },
|
||||
{ value: 25, label: 'United Arab Emirates Dirham' },
|
||||
{ value: 26, label: 'Hong Kong Dollar' },
|
||||
{ value: 27, label: 'Indonesian Rupiah' },
|
||||
{ value: 28, label: 'Mexican Peso' },
|
||||
{ value: 29, label: 'Egyptian Pound' },
|
||||
{ value: 30, label: 'Colombian Peso' },
|
||||
{ value: 31, label: 'West African Franc' },
|
||||
{ value: 32, label: 'Chinese Renminbi' },
|
||||
{ value: 33, label: 'Rwandan Franc' },
|
||||
{ value: 34, label: 'Tanzanian Shilling' },
|
||||
{ value: 35, label: 'Netherlands Antillean Guilder' },
|
||||
{ value: 36, label: 'Trinidad and Tobago Dollar' },
|
||||
{ value: 37, label: 'East Caribbean Dollar' },
|
||||
{ value: 38, label: 'Ghanaian Cedi' },
|
||||
{ value: 39, label: 'Bulgarian Lev' },
|
||||
{ value: 40, label: 'Aruban Florin' },
|
||||
{ value: 41, label: 'Turkish Lira' },
|
||||
{ value: 42, label: 'Romanian New Leu' },
|
||||
{ value: 43, label: 'Croatian Kuna' },
|
||||
{ value: 44, label: 'Saudi Riyal' },
|
||||
{ value: 45, label: 'Japanese Yen' },
|
||||
{ value: 46, label: 'Maldivian Rufiyaa' },
|
||||
{ value: 47, label: 'Costa Rican Colón' },
|
||||
{ value: 48, label: 'Pakistani Rupee' },
|
||||
{ value: 49, label: 'Polish Zloty' },
|
||||
{ value: 50, label: 'Sri Lankan Rupee' },
|
||||
{ value: 51, label: 'Czech Koruna' },
|
||||
{ value: 52, label: 'Uruguayan Peso' },
|
||||
{ value: 53, label: 'Namibian Dollar' },
|
||||
{ value: 54, label: 'Tunisian Dinar' },
|
||||
{ value: 55, label: 'Russian Ruble' },
|
||||
{ value: 56, label: 'Mozambican Metical' },
|
||||
{ value: 57, label: 'Omani Rial' },
|
||||
{ value: 58, label: 'Ukrainian Hryvnia' },
|
||||
{ value: 59, label: 'Macanese Pataca' },
|
||||
{ value: 60, label: 'Taiwan New Dollar' },
|
||||
{ value: 61, label: 'Dominican Peso' },
|
||||
{ value: 62, label: 'Chilean Peso' },
|
||||
{ value: 63, label: 'Icelandic Króna' },
|
||||
{ value: 64, label: 'Papua New Guinean Kina' },
|
||||
{ value: 65, label: 'Jordanian Dinar' },
|
||||
{ value: 66, label: 'Myanmar Kyat' },
|
||||
{ value: 67, label: 'Peruvian Sol' },
|
||||
{ value: 68, label: 'Botswana Pula' },
|
||||
{ value: 69, label: 'Hungarian Forint' },
|
||||
{ value: 70, label: 'Ugandan Shilling' },
|
||||
{ value: 71, label: 'Barbadian Dollar' },
|
||||
{ value: 72, label: 'Brunei Dollar' },
|
||||
{ value: 73, label: 'Georgian Lari' },
|
||||
{ value: 74, label: 'Qatari Riyal' },
|
||||
{ value: 75, label: 'Honduran Lempira' },
|
||||
{ value: 76, label: 'Surinamese Dollar' },
|
||||
{ value: 77, label: 'Bahraini Dinar' },
|
||||
{ value: 78, label: 'Venezuelan Bolivars' },
|
||||
{ value: 79, label: 'South Korean Won' },
|
||||
{ value: 80, label: 'Moroccan Dirham' },
|
||||
{ value: 81, label: 'Jamaican Dollar' },
|
||||
{ value: 82, label: 'Angolan Kwanza' },
|
||||
{ value: 83, label: 'Haitian Gourde' },
|
||||
{ value: 84, label: 'Zambian Kwacha' },
|
||||
{ value: 85, label: 'Nepalese Rupee' },
|
||||
{ value: 86, label: 'CFP Franc' },
|
||||
{ value: 87, label: 'Mauritian Rupee' },
|
||||
{ value: 88, label: 'Cape Verdean Escudo' },
|
||||
{ value: 89, label: 'Kuwaiti Dinar' },
|
||||
{ value: 90, label: 'Algerian Dinar' },
|
||||
{ value: 91, label: 'Macedonian Denar' },
|
||||
{ value: 92, label: 'Fijian Dollar' },
|
||||
{ value: 93, label: 'Bolivian Boliviano' },
|
||||
{ value: 94, label: 'Albanian Lek' },
|
||||
{ value: 95, label: 'Serbian Dinar' },
|
||||
{ value: 96, label: 'Lebanese Pound' },
|
||||
{ value: 97, label: 'Armenian Dram' },
|
||||
{ value: 98, label: 'Azerbaijan Manat' },
|
||||
{ value: 99, label: 'Bosnia and Herzegovina Convertible Mark' },
|
||||
{ value: 100, label: 'Belarusian Ruble' },
|
||||
{ value: 101, label: 'Gibraltar Pound' },
|
||||
{ value: 102, label: 'Moldovan Leu' },
|
||||
{ value: 103, label: 'Kazakhstani Tenge' },
|
||||
{ value: 104, label: 'Ethiopian Birr' },
|
||||
{ value: 105, label: 'Gambia Dalasi' },
|
||||
{ value: 106, label: 'Paraguayan Guarani' },
|
||||
{ value: 107, label: 'Malawi Kwacha' },
|
||||
{ value: 108, label: 'Zimbabwean Dollar' },
|
||||
{ value: 109, label: 'Cambodian Riel' },
|
||||
{ value: 110, label: 'Vanuatu Vatu' },
|
||||
{ value: 111, label: 'Cuban Peso' },
|
||||
{ value: 112, label: 'Cayman Island Dollar' },
|
||||
{ value: 113, label: 'Swazi lilangeni' },
|
||||
{ value: 114, label: 'BZ Dollar' },
|
||||
{ value: 115, label: 'Libyan Dinar' },
|
||||
{ value: 116, label: 'Silver Troy Ounce' },
|
||||
{ value: 117, label: 'Gold Troy Ounce' },
|
||||
{ value: 118, label: 'Nicaraguan Córdoba' },
|
||||
],
|
||||
},
|
||||
{
|
||||
label: 'Id Number',
|
||||
key: 'idNumber',
|
||||
type: 'string' as const,
|
||||
required: false,
|
||||
description: '',
|
||||
variables: true,
|
||||
},
|
||||
{
|
||||
label: 'Vat Number',
|
||||
key: 'vatNumber',
|
||||
type: 'string' as const,
|
||||
required: false,
|
||||
description: '',
|
||||
variables: true,
|
||||
},
|
||||
{
|
||||
label: 'Street Address',
|
||||
key: 'streetAddress',
|
||||
type: 'string' as const,
|
||||
required: false,
|
||||
description: '',
|
||||
variables: true,
|
||||
},
|
||||
{
|
||||
label: 'Apt/Suite',
|
||||
key: 'aptSuite',
|
||||
type: 'string' as const,
|
||||
required: false,
|
||||
description: '',
|
||||
variables: true,
|
||||
},
|
||||
{
|
||||
label: 'City',
|
||||
key: 'city',
|
||||
type: 'string' as const,
|
||||
required: false,
|
||||
description: '',
|
||||
variables: true,
|
||||
},
|
||||
{
|
||||
label: 'State/Province',
|
||||
key: 'stateProvince',
|
||||
type: 'string' as const,
|
||||
required: false,
|
||||
description: '',
|
||||
variables: true,
|
||||
},
|
||||
{
|
||||
label: 'Postal Code',
|
||||
key: 'postalCode',
|
||||
type: 'string' as const,
|
||||
required: false,
|
||||
description: '',
|
||||
variables: true,
|
||||
},
|
||||
{
|
||||
label: 'Country Code',
|
||||
key: 'countryCode',
|
||||
type: 'dropdown' as const,
|
||||
required: false,
|
||||
description: '',
|
||||
variables: true,
|
||||
options: [
|
||||
{ value: 4, label: 'Afghanistan' },
|
||||
{ value: 8, label: 'Albania' },
|
||||
{ value: 12, label: 'Algeria' },
|
||||
{ value: 16, label: 'American Samoa' },
|
||||
{ value: 20, label: 'Andorra' },
|
||||
{ value: 24, label: 'Angola' },
|
||||
{ value: 660, label: 'Anguilla' },
|
||||
{ value: 10, label: 'Antarctica' },
|
||||
{ value: 28, label: 'Antigua and Barbuda' },
|
||||
{ value: 32, label: 'Argentina' },
|
||||
{ value: 51, label: 'Armenia' },
|
||||
{ value: 533, label: 'Aruba' },
|
||||
{ value: 36, label: 'Australia' },
|
||||
{ value: 40, label: 'Austria' },
|
||||
{ value: 31, label: 'Azerbaijan' },
|
||||
{ value: 44, label: 'Bahamas' },
|
||||
{ value: 48, label: 'Bahrain' },
|
||||
{ value: 50, label: 'Bangladesh' },
|
||||
{ value: 52, label: 'Barbados' },
|
||||
{ value: 112, label: 'Belarus' },
|
||||
{ value: 56, label: 'Belgium' },
|
||||
{ value: 84, label: 'Belize' },
|
||||
{ value: 204, label: 'Benin' },
|
||||
{ value: 60, label: 'Bermuda' },
|
||||
{ value: 64, label: 'Bhutan' },
|
||||
{ value: 68, label: 'Bolivia, Plurinational State of' },
|
||||
{ value: 535, label: 'Bonaire, Sint Eustatius and Saba' },
|
||||
{ value: 70, label: 'Bosnia and Herzegovina' },
|
||||
{ value: 72, label: 'Botswana' },
|
||||
{ value: 74, label: 'Bouvet Island' },
|
||||
{ value: 76, label: 'Brazil' },
|
||||
{ value: 86, label: 'British Indian Ocean Territory' },
|
||||
{ value: 96, label: 'Brunei Darussalam' },
|
||||
{ value: 100, label: 'Bulgaria' },
|
||||
{ value: 854, label: 'Burkina Faso' },
|
||||
{ value: 108, label: 'Burundi' },
|
||||
{ value: 116, label: 'Cambodia' },
|
||||
{ value: 120, label: 'Cameroon' },
|
||||
{ value: 124, label: 'Canada' },
|
||||
{ value: 132, label: 'Cape Verde' },
|
||||
{ value: 136, label: 'Cayman Islands' },
|
||||
{ value: 140, label: 'Central African Republic' },
|
||||
{ value: 148, label: 'Chad' },
|
||||
{ value: 152, label: 'Chile' },
|
||||
{ value: 156, label: 'China' },
|
||||
{ value: 162, label: 'Christmas Island' },
|
||||
{ value: 166, label: 'Cocos (Keeling) Islands' },
|
||||
{ value: 170, label: 'Colombia' },
|
||||
{ value: 174, label: 'Comoros' },
|
||||
{ value: 178, label: 'Congo' },
|
||||
{ value: 180, label: 'Congo, the Democratic Republic of the' },
|
||||
{ value: 184, label: 'Cook Islands' },
|
||||
{ value: 188, label: 'Costa Rica' },
|
||||
{ value: 191, label: 'Croatia' },
|
||||
{ value: 192, label: 'Cuba' },
|
||||
{ value: 531, label: 'Curaçao' },
|
||||
{ value: 196, label: 'Cyprus' },
|
||||
{ value: 203, label: 'Czech Republic' },
|
||||
{ value: 384, label: "Côte d'Ivoire" },
|
||||
{ value: 208, label: 'Denmark' },
|
||||
{ value: 262, label: 'Djibouti' },
|
||||
{ value: 212, label: 'Dominica' },
|
||||
{ value: 214, label: 'Dominican Republic' },
|
||||
{ value: 218, label: 'Ecuador' },
|
||||
{ value: 818, label: 'Egypt' },
|
||||
{ value: 222, label: 'El Salvador' },
|
||||
{ value: 226, label: 'Equatorial Guinea' },
|
||||
{ value: 232, label: 'Eritrea' },
|
||||
{ value: 233, label: 'Estonia' },
|
||||
{ value: 231, label: 'Ethiopia' },
|
||||
{ value: 238, label: 'Falkland Islands (Malvinas)' },
|
||||
{ value: 234, label: 'Faroe Islands' },
|
||||
{ value: 242, label: 'Fiji' },
|
||||
{ value: 246, label: 'Finland' },
|
||||
{ value: 250, label: 'France' },
|
||||
{ value: 254, label: 'French Guiana' },
|
||||
{ value: 258, label: 'French Polynesia' },
|
||||
{ value: 260, label: 'French Southern Territories' },
|
||||
{ value: 266, label: 'Gabon' },
|
||||
{ value: 270, label: 'Gambia' },
|
||||
{ value: 268, label: 'Georgia' },
|
||||
{ value: 276, label: 'Germany' },
|
||||
{ value: 288, label: 'Ghana' },
|
||||
{ value: 292, label: 'Gibraltar' },
|
||||
{ value: 300, label: 'Greece' },
|
||||
{ value: 304, label: 'Greenland' },
|
||||
{ value: 308, label: 'Grenada' },
|
||||
{ value: 312, label: 'Guadeloupe' },
|
||||
{ value: 316, label: 'Guam' },
|
||||
{ value: 320, label: 'Guatemala' },
|
||||
{ value: 831, label: 'Guernsey' },
|
||||
{ value: 324, label: 'Guinea' },
|
||||
{ value: 624, label: 'Guinea-Bissau' },
|
||||
{ value: 328, label: 'Guyana' },
|
||||
{ value: 332, label: 'Haiti' },
|
||||
{ value: 334, label: 'Heard Island and McDonald Islands' },
|
||||
{ value: 336, label: 'Holy See (Vatican City State)' },
|
||||
{ value: 340, label: 'Honduras' },
|
||||
{ value: 344, label: 'Hong Kong' },
|
||||
{ value: 348, label: 'Hungary' },
|
||||
{ value: 352, label: 'Iceland' },
|
||||
{ value: 356, label: 'India' },
|
||||
{ value: 360, label: 'Indonesia' },
|
||||
{ value: 364, label: 'Iran, Islamic Republic of' },
|
||||
{ value: 368, label: 'Iraq' },
|
||||
{ value: 372, label: 'Ireland' },
|
||||
{ value: 833, label: 'Isle of Man' },
|
||||
{ value: 376, label: 'Israel' },
|
||||
{ value: 380, label: 'Italy' },
|
||||
{ value: 388, label: 'Jamaica' },
|
||||
{ value: 392, label: 'Japan' },
|
||||
{ value: 832, label: 'Jersey' },
|
||||
{ value: 400, label: 'Jordan' },
|
||||
{ value: 398, label: 'Kazakhstan' },
|
||||
{ value: 404, label: 'Kenya' },
|
||||
{ value: 296, label: 'Kiribati' },
|
||||
{ value: 408, label: "Korea, Democratic People's Republic of" },
|
||||
{ value: 410, label: 'Korea, Republic of' },
|
||||
{ value: 414, label: 'Kuwait' },
|
||||
{ value: 417, label: 'Kyrgyzstan' },
|
||||
{ value: 418, label: "Lao People's Democratic Republic" },
|
||||
{ value: 428, label: 'Latvia' },
|
||||
{ value: 422, label: 'Lebanon' },
|
||||
{ value: 426, label: 'Lesotho' },
|
||||
{ value: 430, label: 'Liberia' },
|
||||
{ value: 434, label: 'Libya' },
|
||||
{ value: 438, label: 'Liechtenstein' },
|
||||
{ value: 440, label: 'Lithuania' },
|
||||
{ value: 442, label: 'Luxembourg' },
|
||||
{ value: 446, label: 'Macao' },
|
||||
{ value: 807, label: 'Macedonia, the former Yugoslav Republic of' },
|
||||
{ value: 450, label: 'Madagascar' },
|
||||
{ value: 454, label: 'Malawi' },
|
||||
{ value: 458, label: 'Malaysia' },
|
||||
{ value: 462, label: 'Maldives' },
|
||||
{ value: 466, label: 'Mali' },
|
||||
{ value: 470, label: 'Malta' },
|
||||
{ value: 584, label: 'Marshall Islands' },
|
||||
{ value: 474, label: 'Martinique' },
|
||||
{ value: 478, label: 'Mauritania' },
|
||||
{ value: 480, label: 'Mauritius' },
|
||||
{ value: 175, label: 'Mayotte' },
|
||||
{ value: 484, label: 'Mexico' },
|
||||
{ value: 583, label: 'Micronesia, Federated States of' },
|
||||
{ value: 498, label: 'Moldova, Republic of' },
|
||||
{ value: 492, label: 'Monaco' },
|
||||
{ value: 496, label: 'Mongolia' },
|
||||
{ value: 499, label: 'Montenegro' },
|
||||
{ value: 500, label: 'Montserrat' },
|
||||
{ value: 504, label: 'Morocco' },
|
||||
{ value: 508, label: 'Mozambique' },
|
||||
{ value: 104, label: 'Myanmar' },
|
||||
{ value: 516, label: 'Namibia' },
|
||||
{ value: 520, label: 'Nauru' },
|
||||
{ value: 524, label: 'Nepal' },
|
||||
{ value: 528, label: 'Netherlands' },
|
||||
{ value: 540, label: 'New Caledonia' },
|
||||
{ value: 554, label: 'New Zealand' },
|
||||
{ value: 558, label: 'Nicaragua' },
|
||||
{ value: 562, label: 'Niger' },
|
||||
{ value: 566, label: 'Nigeria' },
|
||||
{ value: 570, label: 'Niue' },
|
||||
{ value: 574, label: 'Norfolk Island' },
|
||||
{ value: 580, label: 'Northern Mariana Islands' },
|
||||
{ value: 578, label: 'Norway' },
|
||||
{ value: 512, label: 'Oman' },
|
||||
{ value: 586, label: 'Pakistan' },
|
||||
{ value: 585, label: 'Palau' },
|
||||
{ value: 275, label: 'Palestine' },
|
||||
{ value: 591, label: 'Panama' },
|
||||
{ value: 598, label: 'Papua New Guinea' },
|
||||
{ value: 600, label: 'Paraguay' },
|
||||
{ value: 604, label: 'Peru' },
|
||||
{ value: 608, label: 'Philippines' },
|
||||
{ value: 612, label: 'Pitcairn' },
|
||||
{ value: 616, label: 'Poland' },
|
||||
{ value: 620, label: 'Portugal' },
|
||||
{ value: 630, label: 'Puerto Rico' },
|
||||
{ value: 634, label: 'Qatar' },
|
||||
{ value: 642, label: 'Romania' },
|
||||
{ value: 643, label: 'Russian Federation' },
|
||||
{ value: 646, label: 'Rwanda' },
|
||||
{ value: 638, label: 'Réunion' },
|
||||
{ value: 652, label: 'Saint Barthélemy' },
|
||||
{ value: 654, label: 'Saint Helena, Ascension and Tristan da Cunha' },
|
||||
{ value: 659, label: 'Saint Kitts and Nevis' },
|
||||
{ value: 662, label: 'Saint Lucia' },
|
||||
{ value: 663, label: 'Saint Martin (French part)' },
|
||||
{ value: 666, label: 'Saint Pierre and Miquelon' },
|
||||
{ value: 670, label: 'Saint Vincent and the Grenadines' },
|
||||
{ value: 882, label: 'Samoa' },
|
||||
{ value: 674, label: 'San Marino' },
|
||||
{ value: 678, label: 'Sao Tome and Principe' },
|
||||
{ value: 682, label: 'Saudi Arabia' },
|
||||
{ value: 686, label: 'Senegal' },
|
||||
{ value: 688, label: 'Serbia' },
|
||||
{ value: 690, label: 'Seychelles' },
|
||||
{ value: 694, label: 'Sierra Leone' },
|
||||
{ value: 702, label: 'Singapore' },
|
||||
{ value: 534, label: 'Sint Maarten (Dutch part)' },
|
||||
{ value: 703, label: 'Slovakia' },
|
||||
{ value: 705, label: 'Slovenia' },
|
||||
{ value: 90, label: 'Solomon Islands' },
|
||||
{ value: 706, label: 'Somalia' },
|
||||
{ value: 710, label: 'South Africa' },
|
||||
{ value: 239, label: 'South Georgia and the South Sandwich Islands' },
|
||||
{ value: 728, label: 'South Sudan' },
|
||||
{ value: 724, label: 'Spain' },
|
||||
{ value: 144, label: 'Sri Lanka' },
|
||||
{ value: 729, label: 'Sudan' },
|
||||
{ value: 740, label: 'Suriname' },
|
||||
{ value: 744, label: 'Svalbard and Jan Mayen' },
|
||||
{ value: 748, label: 'Swaziland' },
|
||||
{ value: 752, label: 'Sweden' },
|
||||
{ value: 756, label: 'Switzerland' },
|
||||
{ value: 760, label: 'Syrian Arab Republic' },
|
||||
{ value: 158, label: 'Taiwan, Province of China' },
|
||||
{ value: 762, label: 'Tajikistan' },
|
||||
{ value: 834, label: 'Tanzania, United Republic of' },
|
||||
{ value: 764, label: 'Thailand' },
|
||||
{ value: 626, label: 'Timor-Leste' },
|
||||
{ value: 768, label: 'Togo' },
|
||||
{ value: 772, label: 'Tokelau' },
|
||||
{ value: 776, label: 'Tonga' },
|
||||
{ value: 780, label: 'Trinidad and Tobago' },
|
||||
{ value: 788, label: 'Tunisia' },
|
||||
{ value: 792, label: 'Turkey' },
|
||||
{ value: 795, label: 'Turkmenistan' },
|
||||
{ value: 796, label: 'Turks and Caicos Islands' },
|
||||
{ value: 798, label: 'Tuvalu' },
|
||||
{ value: 800, label: 'Uganda' },
|
||||
{ value: 804, label: 'Ukraine' },
|
||||
{ value: 784, label: 'United Arab Emirates' },
|
||||
{ value: 826, label: 'United Kingdom' },
|
||||
{ value: 840, label: 'United States' },
|
||||
{ value: 581, label: 'United States Minor Outlying Islands' },
|
||||
{ value: 858, label: 'Uruguay' },
|
||||
{ value: 860, label: 'Uzbekistan' },
|
||||
{ value: 548, label: 'Vanuatu' },
|
||||
{ value: 862, label: 'Venezuela, Bolivarian Republic of' },
|
||||
{ value: 704, label: 'Viet Nam' },
|
||||
{ value: 92, label: 'Virgin Islands, British' },
|
||||
{ value: 850, label: 'Virgin Islands, U.S.' },
|
||||
{ value: 876, label: 'Wallis and Futuna' },
|
||||
{ value: 732, label: 'Western Sahara' },
|
||||
{ value: 887, label: 'Yemen' },
|
||||
{ value: 894, label: 'Zambia' },
|
||||
{ value: 716, label: 'Zimbabwe' },
|
||||
{ value: 248, label: 'Åland Islands' },
|
||||
],
|
||||
},
|
||||
{
|
||||
label: 'Shipping Street Address',
|
||||
key: 'shippingStreetAddress',
|
||||
type: 'string' as const,
|
||||
required: false,
|
||||
description: '',
|
||||
variables: true,
|
||||
},
|
||||
{
|
||||
label: 'Shipping Apt/Suite',
|
||||
key: 'shippingAptSuite',
|
||||
type: 'string' as const,
|
||||
required: false,
|
||||
description: '',
|
||||
variables: true,
|
||||
},
|
||||
{
|
||||
label: 'Shipping City',
|
||||
key: 'shippingCity',
|
||||
type: 'string' as const,
|
||||
required: false,
|
||||
description: '',
|
||||
variables: true,
|
||||
},
|
||||
{
|
||||
label: 'Shipping State/Province',
|
||||
key: 'shippingStateProvince',
|
||||
type: 'string' as const,
|
||||
required: false,
|
||||
description: '',
|
||||
variables: true,
|
||||
},
|
||||
{
|
||||
label: 'Shipping Postal Code',
|
||||
key: 'shippingPostalCode',
|
||||
type: 'string' as const,
|
||||
required: false,
|
||||
description: '',
|
||||
variables: true,
|
||||
},
|
||||
{
|
||||
label: 'Shipping Country Code',
|
||||
key: 'shippingCountryCode',
|
||||
type: 'string' as const,
|
||||
required: false,
|
||||
description: '',
|
||||
variables: true,
|
||||
},
|
||||
{
|
||||
label: 'Private Notes',
|
||||
key: 'privateNotes',
|
||||
type: 'string' as const,
|
||||
required: false,
|
||||
description: '',
|
||||
variables: true,
|
||||
},
|
||||
{
|
||||
label: 'Public Notes',
|
||||
key: 'publicNotes',
|
||||
type: 'string' as const,
|
||||
required: false,
|
||||
description: '',
|
||||
variables: true,
|
||||
},
|
||||
{
|
||||
label: 'Website',
|
||||
key: 'website',
|
||||
type: 'string' as const,
|
||||
required: false,
|
||||
description: '',
|
||||
variables: true,
|
||||
},
|
||||
{
|
||||
label: 'Custom Value 1',
|
||||
key: 'customValue1',
|
||||
type: 'string' as const,
|
||||
required: false,
|
||||
description: '',
|
||||
variables: true,
|
||||
},
|
||||
{
|
||||
label: 'Custom Value 2',
|
||||
key: 'customValue2',
|
||||
type: 'string' as const,
|
||||
required: false,
|
||||
description: '',
|
||||
variables: true,
|
||||
},
|
||||
{
|
||||
label: 'Custom Value 3',
|
||||
key: 'customValue3',
|
||||
type: 'string' as const,
|
||||
required: false,
|
||||
description: '',
|
||||
variables: true,
|
||||
},
|
||||
{
|
||||
label: 'Custom Value 4',
|
||||
key: 'customValue4',
|
||||
type: 'string' as const,
|
||||
required: false,
|
||||
description: '',
|
||||
variables: true,
|
||||
},
|
||||
];
|
@@ -0,0 +1,84 @@
|
||||
import defineAction from '../../../../helpers/define-action';
|
||||
import { filterProvidedFields } from '../../common/filter-provided-fields';
|
||||
import { fields } from './fields';
|
||||
|
||||
export default defineAction({
|
||||
name: 'Create client',
|
||||
key: 'createClient',
|
||||
description: 'Creates a new client.',
|
||||
arguments: fields,
|
||||
|
||||
async run($) {
|
||||
const {
|
||||
clientName,
|
||||
contactFirstName,
|
||||
contactLastName,
|
||||
contactEmail,
|
||||
contactPhone,
|
||||
languageCode,
|
||||
currencyCode,
|
||||
idNumber,
|
||||
vatNumber,
|
||||
streetAddress,
|
||||
aptSuite,
|
||||
city,
|
||||
stateProvince,
|
||||
postalCode,
|
||||
countryCode,
|
||||
shippingStreetAddress,
|
||||
shippingAptSuite,
|
||||
shippingCity,
|
||||
shippingStateProvince,
|
||||
shippingPostalCode,
|
||||
shippingCountryCode,
|
||||
privateNotes,
|
||||
publicNotes,
|
||||
website,
|
||||
customValue1,
|
||||
customValue2,
|
||||
customValue3,
|
||||
customValue4,
|
||||
} = $.step.parameters;
|
||||
|
||||
const bodyFields = {
|
||||
name: clientName,
|
||||
contacts: {
|
||||
first_name: contactFirstName,
|
||||
last_name: contactLastName,
|
||||
email: contactEmail,
|
||||
phone: contactPhone,
|
||||
},
|
||||
settings: {
|
||||
language_id: languageCode,
|
||||
currency_id: currencyCode,
|
||||
},
|
||||
id_number: idNumber,
|
||||
vat_number: vatNumber,
|
||||
address1: streetAddress,
|
||||
address2: aptSuite,
|
||||
city: city,
|
||||
state: stateProvince,
|
||||
postal_code: postalCode,
|
||||
country_id: countryCode,
|
||||
shipping_address1: shippingStreetAddress,
|
||||
shipping_address2: shippingAptSuite,
|
||||
shipping_city: shippingCity,
|
||||
shipping_state: shippingStateProvince,
|
||||
shipping_postal_code: shippingPostalCode,
|
||||
shipping_country_id: shippingCountryCode,
|
||||
private_notes: privateNotes,
|
||||
public_notes: publicNotes,
|
||||
website: website,
|
||||
custom_value1: customValue1,
|
||||
custom_value2: customValue2,
|
||||
custom_value3: customValue3,
|
||||
custom_value4: customValue4,
|
||||
};
|
||||
|
||||
const body = filterProvidedFields(bodyFields);
|
||||
|
||||
const response = await $.http.post('/v1/clients', body);
|
||||
|
||||
$.setActionItem({ raw: response.data.data });
|
||||
},
|
||||
});
|
@@ -0,0 +1,407 @@
|
||||
export const fields = [
|
||||
{
|
||||
label: 'Client ID',
|
||||
key: 'clientId',
|
||||
type: 'dropdown' as const,
|
||||
required: true,
|
||||
description: 'The ID of the client, not the name or email address.',
|
||||
variables: true,
|
||||
source: {
|
||||
type: 'query',
|
||||
name: 'getDynamicData',
|
||||
arguments: [
|
||||
{
|
||||
name: 'key',
|
||||
value: 'listClients',
|
||||
},
|
||||
],
|
||||
},
|
||||
},
|
||||
{
|
||||
label: 'Send Email',
|
||||
key: 'sendEmail',
|
||||
type: 'dropdown' as const,
|
||||
required: false,
|
||||
description: '',
|
||||
variables: true,
|
||||
options: [
|
||||
{ label: 'False', value: 'false' },
|
||||
{ label: 'True', value: 'true' },
|
||||
],
|
||||
},
|
||||
{
|
||||
label: 'Mark Sent',
|
||||
key: 'markSent',
|
||||
type: 'dropdown' as const,
|
||||
required: false,
|
||||
description: 'Setting this to true creates the invoice as sent.',
|
||||
variables: true,
|
||||
options: [
|
||||
{ label: 'False', value: 'false' },
|
||||
{ label: 'True', value: 'true' },
|
||||
],
|
||||
},
|
||||
{
|
||||
label: 'Paid',
|
||||
key: 'paid',
|
||||
type: 'dropdown' as const,
|
||||
required: false,
|
||||
description: 'Setting this to true creates the invoice as paid.',
|
||||
variables: true,
|
||||
options: [
|
||||
{ label: 'False', value: 'false' },
|
||||
{ label: 'True', value: 'true' },
|
||||
],
|
||||
},
|
||||
{
|
||||
label: 'Amount Paid',
|
||||
key: 'amountPaid',
|
||||
type: 'string' as const,
|
||||
required: false,
|
||||
description:
|
||||
'If this value is greater than zero a payment will be created along with the invoice.',
|
||||
variables: true,
|
||||
},
|
||||
{
|
||||
label: 'Number',
|
||||
key: 'number',
|
||||
type: 'string' as const,
|
||||
required: false,
|
||||
description:
|
||||
'The invoice number - is a unique alpha numeric number per invoice per company',
|
||||
variables: true,
|
||||
},
|
||||
{
|
||||
label: 'Discount',
|
||||
key: 'discount',
|
||||
type: 'string' as const,
|
||||
required: false,
|
||||
description: '',
|
||||
variables: true,
|
||||
},
|
||||
{
|
||||
label: 'PO Number',
|
||||
key: 'poNumber',
|
||||
type: 'string' as const,
|
||||
required: false,
|
||||
description: 'The purchase order associated with this invoice',
|
||||
variables: true,
|
||||
},
|
||||
{
|
||||
label: 'Date',
|
||||
key: 'date',
|
||||
type: 'string' as const,
|
||||
required: false,
|
||||
description: '',
|
||||
variables: true,
|
||||
},
|
||||
{
|
||||
label: 'Due Date',
|
||||
key: 'dueDate',
|
||||
type: 'string' as const,
|
||||
required: false,
|
||||
description: '',
|
||||
variables: true,
|
||||
},
|
||||
{
|
||||
label: 'Tax Rate 1',
|
||||
key: 'taxRate1',
|
||||
type: 'string' as const,
|
||||
required: false,
|
||||
description: '',
|
||||
variables: true,
|
||||
},
|
||||
{
|
||||
label: 'Tax Name 1',
|
||||
key: 'taxName1',
|
||||
type: 'string' as const,
|
||||
required: false,
|
||||
description: '',
|
||||
variables: true,
|
||||
},
|
||||
{
|
||||
label: 'Tax Rate 2',
|
||||
key: 'taxRate2',
|
||||
type: 'string' as const,
|
||||
required: false,
|
||||
description: '',
|
||||
variables: true,
|
||||
},
|
||||
{
|
||||
label: 'Tax Name 2',
|
||||
key: 'taxName2',
|
||||
type: 'string' as const,
|
||||
required: false,
|
||||
description: '',
|
||||
variables: true,
|
||||
},
|
||||
{
|
||||
label: 'Tax Rate 3',
|
||||
key: 'taxRate3',
|
||||
type: 'string' as const,
|
||||
required: false,
|
||||
description: '',
|
||||
variables: true,
|
||||
},
|
||||
{
|
||||
label: 'Tax Name 3',
|
||||
key: 'taxName3',
|
||||
type: 'string' as const,
|
||||
required: false,
|
||||
description: '',
|
||||
variables: true,
|
||||
},
|
||||
{
|
||||
label: 'Custom Field 1',
|
||||
key: 'customField1',
|
||||
type: 'string' as const,
|
||||
required: false,
|
||||
description: '',
|
||||
variables: true,
|
||||
},
|
||||
{
|
||||
label: 'Custom Field 2',
|
||||
key: 'customField2',
|
||||
type: 'string' as const,
|
||||
required: false,
|
||||
description: '',
|
||||
variables: true,
|
||||
},
|
||||
{
|
||||
label: 'Custom Field 3',
|
||||
key: 'customField3',
|
||||
type: 'string' as const,
|
||||
required: false,
|
||||
description: '',
|
||||
variables: true,
|
||||
},
|
||||
{
|
||||
label: 'Custom Field 4',
|
||||
key: 'customField4',
|
||||
type: 'string' as const,
|
||||
required: false,
|
||||
description: '',
|
||||
variables: true,
|
||||
},
|
||||
{
|
||||
label: 'Custom Surcharge 1',
|
||||
key: 'customSurcharge1',
|
||||
type: 'string' as const,
|
||||
required: false,
|
||||
description: '',
|
||||
variables: true,
|
||||
},
|
||||
{
|
||||
label: 'Custom Surcharge 2',
|
||||
key: 'customSurcharge2',
|
||||
type: 'string' as const,
|
||||
required: false,
|
||||
description: '',
|
||||
variables: true,
|
||||
},
|
||||
{
|
||||
label: 'Custom Surcharge 3',
|
||||
key: 'customSurcharge3',
|
||||
type: 'string' as const,
|
||||
required: false,
|
||||
description: '',
|
||||
variables: true,
|
||||
},
|
||||
{
|
||||
label: 'Custom Surcharge 4',
|
||||
key: 'customSurcharge4',
|
||||
type: 'string' as const,
|
||||
required: false,
|
||||
description: '',
|
||||
variables: true,
|
||||
},
|
||||
{
|
||||
label: 'Is Amount Discount',
|
||||
key: 'isAmountDiscount',
|
||||
type: 'dropdown' as const,
|
||||
required: false,
|
||||
description:
|
||||
'By default the discount is applied as a percentage, enabling this applies the discount as a fixed amount.',
|
||||
variables: true,
|
||||
options: [
|
||||
{ label: 'False', value: 'false' },
|
||||
{ label: 'True', value: 'true' },
|
||||
],
|
||||
},
|
||||
{
|
||||
label: 'Partial/Deposit',
|
||||
key: 'partialDeposit',
|
||||
type: 'string' as const,
|
||||
required: false,
|
||||
description: '',
|
||||
variables: true,
|
||||
},
|
||||
{
|
||||
label: 'Partial Due Date',
|
||||
key: 'partialDueDate',
|
||||
type: 'string' as const,
|
||||
required: false,
|
||||
description: '',
|
||||
variables: true,
|
||||
},
|
||||
{
|
||||
label: 'Line Item Cost',
|
||||
key: 'lineItemCost',
|
||||
type: 'string' as const,
|
||||
required: false,
|
||||
description: '',
|
||||
variables: true,
|
||||
},
|
||||
{
|
||||
label: 'Line Item Quatity',
|
||||
key: 'lineItemQuantity',
|
||||
type: 'string' as const,
|
||||
required: false,
|
||||
description: '',
|
||||
variables: true,
|
||||
},
|
||||
{
|
||||
label: 'Line Item Product',
|
||||
key: 'lineItemProduct',
|
||||
type: 'string' as const,
|
||||
required: false,
|
||||
description: '',
|
||||
variables: true,
|
||||
},
|
||||
{
|
||||
label: 'Line Item Discount',
|
||||
key: 'lineItemDiscount',
|
||||
type: 'string' as const,
|
||||
required: false,
|
||||
description: '',
|
||||
variables: true,
|
||||
},
|
||||
{
|
||||
label: 'Line Item Description',
|
||||
key: 'lineItemDescription',
|
||||
type: 'string' as const,
|
||||
required: false,
|
||||
description: '',
|
||||
variables: true,
|
||||
},
|
||||
{
|
||||
label: 'Line Item Tax Rate 1',
|
||||
key: 'lineItemTaxRate1',
|
||||
type: 'string' as const,
|
||||
required: false,
|
||||
description: '',
|
||||
variables: true,
|
||||
},
|
||||
{
|
||||
label: 'Line Item Tax Name 1',
|
||||
key: 'lineItemTaxName1',
|
||||
type: 'string' as const,
|
||||
required: false,
|
||||
description: '',
|
||||
variables: true,
|
||||
},
|
||||
{
|
||||
label: 'Line Item Tax Rate 2',
|
||||
key: 'lineItemTaxRate2',
|
||||
type: 'string' as const,
|
||||
required: false,
|
||||
description: '',
|
||||
variables: true,
|
||||
},
|
||||
{
|
||||
label: 'Line Item Tax Name 2',
|
||||
key: 'lineItemTaxName2',
|
||||
type: 'string' as const,
|
||||
required: false,
|
||||
description: '',
|
||||
variables: true,
|
||||
},
|
||||
{
|
||||
label: 'Line Item Tax Rate 3',
|
||||
key: 'lineItemTaxRate3',
|
||||
type: 'string' as const,
|
||||
required: false,
|
||||
description: '',
|
||||
variables: true,
|
||||
},
|
||||
{
|
||||
label: 'Line Item Tax Name 3',
|
||||
key: 'lineItemTaxName3',
|
||||
type: 'string' as const,
|
||||
required: false,
|
||||
description: '',
|
||||
variables: true,
|
||||
},
|
||||
{
|
||||
label: 'Line Item Custom Field 1',
|
||||
key: 'lineItemCustomField1',
|
||||
type: 'string' as const,
|
||||
required: false,
|
||||
description: '',
|
||||
variables: true,
|
||||
},
|
||||
{
|
||||
label: 'Line Item Custom Field 2',
|
||||
key: 'lineItemCustomField2',
|
||||
type: 'string' as const,
|
||||
required: false,
|
||||
description: '',
|
||||
variables: true,
|
||||
},
|
||||
{
|
||||
label: 'Line Item Custom Field 3',
|
||||
key: 'lineItemCustomField3',
|
||||
type: 'string' as const,
|
||||
required: false,
|
||||
description: '',
|
||||
variables: true,
|
||||
},
|
||||
{
|
||||
label: 'Line Item Custom Field 4',
|
||||
key: 'lineItemCustomField4',
|
||||
type: 'string' as const,
|
||||
required: false,
|
||||
description: '',
|
||||
variables: true,
|
||||
},
|
||||
{
|
||||
label: 'Line Item Product Cost',
|
||||
key: 'lineItemProductCost',
|
||||
type: 'string' as const,
|
||||
required: false,
|
||||
description: '',
|
||||
variables: true,
|
||||
},
|
||||
{
|
||||
label: 'Public Notes',
|
||||
key: 'publicNotes',
|
||||
type: 'string' as const,
|
||||
required: false,
|
||||
description: '',
|
||||
variables: true,
|
||||
},
|
||||
{
|
||||
label: 'Private Notes',
|
||||
key: 'privateNotes',
|
||||
type: 'string' as const,
|
||||
required: false,
|
||||
description: '',
|
||||
variables: true,
|
||||
},
|
||||
{
|
||||
label: 'Terms',
|
||||
key: 'terms',
|
||||
type: 'string' as const,
|
||||
required: false,
|
||||
description: '',
|
||||
variables: true,
|
||||
},
|
||||
{
|
||||
label: 'Footer',
|
||||
key: 'footer',
|
||||
type: 'string' as const,
|
||||
required: false,
|
||||
description: '',
|
||||
variables: true,
|
||||
},
|
||||
];
|
@@ -0,0 +1,127 @@
|
||||
import defineAction from '../../../../helpers/define-action';
|
||||
import { filterProvidedFields } from '../../common/filter-provided-fields';
|
||||
import { fields } from './fields';
|
||||
|
||||
export default defineAction({
|
||||
name: 'Create invoice',
|
||||
key: 'createInvoice',
|
||||
description: 'Creates a new invoice.',
|
||||
arguments: fields,
|
||||
|
||||
async run($) {
|
||||
const {
|
||||
clientId,
|
||||
sendEmail,
|
||||
markSent,
|
||||
paid,
|
||||
amountPaid,
|
||||
number,
|
||||
discount,
|
||||
poNumber,
|
||||
date,
|
||||
dueDate,
|
||||
taxRate1,
|
||||
taxName1,
|
||||
taxRate2,
|
||||
taxName2,
|
||||
taxRate3,
|
||||
taxName3,
|
||||
customField1,
|
||||
customField2,
|
||||
customField3,
|
||||
customField4,
|
||||
customSurcharge1,
|
||||
customSurcharge2,
|
||||
customSurcharge3,
|
||||
customSurcharge4,
|
||||
isAmountDiscount,
|
||||
partialDeposit,
|
||||
partialDueDate,
|
||||
lineItemCost,
|
||||
lineItemQuantity,
|
||||
lineItemProduct,
|
||||
lineItemDiscount,
|
||||
lineItemDescription,
|
||||
lineItemTaxRate1,
|
||||
lineItemTaxName1,
|
||||
lineItemTaxRate2,
|
||||
lineItemTaxName2,
|
||||
lineItemTaxRate3,
|
||||
lineItemTaxName3,
|
||||
lineItemCustomField1,
|
||||
lineItemCustomField2,
|
||||
lineItemCustomField3,
|
||||
lineItemCustomField4,
|
||||
lineItemProductCost,
|
||||
publicNotes,
|
||||
privateNotes,
|
||||
terms,
|
||||
footer,
|
||||
} = $.step.parameters;
|
||||
|
||||
const paramFields = {
|
||||
send_email: sendEmail,
|
||||
mark_sent: markSent,
|
||||
paid: paid,
|
||||
amount_paid: amountPaid,
|
||||
};
|
||||
|
||||
const params = filterProvidedFields(paramFields);
|
||||
|
||||
const bodyFields = {
|
||||
client_id: clientId,
|
||||
number: number,
|
||||
discount: discount,
|
||||
po_number: poNumber,
|
||||
date: date,
|
||||
due_date: dueDate,
|
||||
tax_rate1: taxRate1,
|
||||
tax_name1: taxName1,
|
||||
tax_rate2: taxRate2,
|
||||
tax_name2: taxName2,
|
||||
tax_rate3: taxRate3,
|
||||
tax_name3: taxName3,
|
||||
custom_value1: customField1,
|
||||
custom_value2: customField2,
|
||||
custom_value3: customField3,
|
||||
custom_value4: customField4,
|
||||
custom_surcharge1: customSurcharge1,
|
||||
custom_surcharge2: customSurcharge2,
|
||||
custom_surcharge3: customSurcharge3,
|
||||
custom_surcharge4: customSurcharge4,
|
||||
is_amount_discount: Boolean(isAmountDiscount),
|
||||
partial: partialDeposit,
|
||||
partial_due_date: partialDueDate,
|
||||
line_items: [
|
||||
{
|
||||
cost: lineItemCost,
|
||||
quantity: lineItemQuantity,
|
||||
product_key: lineItemProduct,
|
||||
discount: lineItemDiscount,
|
||||
notes: lineItemDescription,
|
||||
tax_rate1: lineItemTaxRate1,
|
||||
tax_name1: lineItemTaxName1,
|
||||
tax_rate2: lineItemTaxRate2,
|
||||
tax_name2: lineItemTaxName2,
|
||||
tax_rate3: lineItemTaxRate3,
|
||||
tax_name3: lineItemTaxName3,
|
||||
custom_value1: lineItemCustomField1,
|
||||
custom_value2: lineItemCustomField2,
|
||||
custom_value3: lineItemCustomField3,
|
||||
custom_value4: lineItemCustomField4,
|
||||
product_cost: lineItemProductCost,
|
||||
},
|
||||
],
|
||||
public_notes: publicNotes,
|
||||
private_notes: privateNotes,
|
||||
terms: terms,
|
||||
footer: footer,
|
||||
};
|
||||
|
||||
const body = filterProvidedFields(bodyFields);
|
||||
|
||||
const response = await $.http.post('/v1/invoices', body, { params });
|
||||
|
||||
$.setActionItem({ raw: response.data.data });
|
||||
},
|
||||
});
|
@@ -0,0 +1,111 @@
|
||||
export const fields = [
|
||||
{
|
||||
label: 'Client ID',
|
||||
key: 'clientId',
|
||||
type: 'dropdown' as const,
|
||||
required: true,
|
||||
description: 'The ID of the client, not the name or email address.',
|
||||
variables: true,
|
||||
source: {
|
||||
type: 'query',
|
||||
name: 'getDynamicData',
|
||||
arguments: [
|
||||
{
|
||||
name: 'key',
|
||||
value: 'listClients',
|
||||
},
|
||||
],
|
||||
},
|
||||
},
|
||||
{
|
||||
label: 'Payment Date',
|
||||
key: 'paymentDate',
|
||||
type: 'string' as const,
|
||||
required: false,
|
||||
description: '',
|
||||
variables: true,
|
||||
},
|
||||
{
|
||||
label: 'Invoice',
|
||||
key: 'invoiceId',
|
||||
type: 'dropdown' as const,
|
||||
required: false,
|
||||
description: '',
|
||||
variables: true,
|
||||
source: {
|
||||
type: 'query',
|
||||
name: 'getDynamicData',
|
||||
arguments: [
|
||||
{
|
||||
name: 'key',
|
||||
value: 'listInvoices',
|
||||
},
|
||||
],
|
||||
},
|
||||
},
|
||||
{
|
||||
label: 'Invoice Amount',
|
||||
key: 'invoiceAmount',
|
||||
type: 'string' as const,
|
||||
required: false,
|
||||
description: '',
|
||||
variables: true,
|
||||
},
|
||||
{
|
||||
label: 'Payment Type',
|
||||
key: 'paymentType',
|
||||
type: 'dropdown' as const,
|
||||
required: false,
|
||||
description: '',
|
||||
variables: true,
|
||||
options: [
|
||||
{ label: 'Bank Transfer', value: '1' },
|
||||
{ label: 'Cash', value: '2' },
|
||||
{ label: 'Debit', value: '3' },
|
||||
{ label: 'ACH', value: '4' },
|
||||
{ label: 'Visa Card', value: '5' },
|
||||
{ label: 'MasterCard', value: '6' },
|
||||
{ label: 'American Express', value: '7' },
|
||||
{ label: 'Discover Card', value: '8' },
|
||||
{ label: 'Diners Card', value: '9' },
|
||||
{ label: 'EuroCard', value: '10' },
|
||||
{ label: 'Nova', value: '11' },
|
||||
{ label: 'Credit Card Other', value: '12' },
|
||||
{ label: 'PayPal', value: '13' },
|
||||
{ label: 'Google Wallet', value: '14' },
|
||||
{ label: 'Check', value: '15' },
|
||||
{ label: 'Carte Blanche', value: '16' },
|
||||
{ label: 'UnionPay', value: '17' },
|
||||
{ label: 'JCB', value: '18' },
|
||||
{ label: 'Laser', value: '19' },
|
||||
{ label: 'Maestro', value: '20' },
|
||||
{ label: 'Solo', value: '21' },
|
||||
{ label: 'Switch', value: '22' },
|
||||
{ label: 'iZettle', value: '23' },
|
||||
{ label: 'Swish', value: '24' },
|
||||
{ label: 'Venmo', value: '25' },
|
||||
{ label: 'Money Order', value: '26' },
|
||||
{ label: 'Alipay', value: '27' },
|
||||
{ label: 'Sofort', value: '28' },
|
||||
{ label: 'SEPA', value: '29' },
|
||||
{ label: 'GoCardless', value: '30' },
|
||||
{ label: 'Bitcoin', value: '31' },
|
||||
],
|
||||
},
|
||||
{
|
||||
label: 'Transfer Reference',
|
||||
key: 'transferReference',
|
||||
type: 'string' as const,
|
||||
required: false,
|
||||
description: '',
|
||||
variables: true,
|
||||
},
|
||||
{
|
||||
label: 'Private Notes',
|
||||
key: 'privateNotes',
|
||||
type: 'string' as const,
|
||||
required: false,
|
||||
description: '',
|
||||
variables: true,
|
||||
},
|
||||
];
|
@@ -0,0 +1,42 @@
|
||||
import defineAction from '../../../../helpers/define-action';
|
||||
import { filterProvidedFields } from '../../common/filter-provided-fields';
|
||||
import { fields } from './fields';
|
||||
|
||||
export default defineAction({
|
||||
name: 'Create payment',
|
||||
key: 'createPayment',
|
||||
description: 'Creates a new payment.',
|
||||
arguments: fields,
|
||||
|
||||
async run($) {
|
||||
const {
|
||||
clientId,
|
||||
paymentDate,
|
||||
invoiceId,
|
||||
invoiceAmount,
|
||||
paymentType,
|
||||
transferReference,
|
||||
privateNotes,
|
||||
} = $.step.parameters;
|
||||
|
||||
const bodyFields = {
|
||||
client_id: clientId,
|
||||
date: paymentDate,
|
||||
invoices: [
|
||||
{
|
||||
invoice_id: invoiceId,
|
||||
amount: invoiceAmount,
|
||||
},
|
||||
],
|
||||
type_id: paymentType,
|
||||
transaction_reference: transferReference,
|
||||
private_notes: privateNotes,
|
||||
};
|
||||
|
||||
const body = filterProvidedFields(bodyFields);
|
||||
|
||||
const response = await $.http.post('/v1/payments', body);
|
||||
|
||||
$.setActionItem({ raw: response.data.data });
|
||||
},
|
||||
});
|
@@ -0,0 +1,114 @@
|
||||
export const fields = [
|
||||
{
|
||||
label: 'Product Key',
|
||||
key: 'productKey',
|
||||
type: 'string' as const,
|
||||
required: false,
|
||||
description: '',
|
||||
variables: true,
|
||||
},
|
||||
{
|
||||
label: 'Notes',
|
||||
key: 'notes',
|
||||
type: 'string' as const,
|
||||
required: false,
|
||||
description: '',
|
||||
variables: true,
|
||||
},
|
||||
{
|
||||
label: 'Price',
|
||||
key: 'price',
|
||||
type: 'string' as const,
|
||||
required: false,
|
||||
description: '',
|
||||
variables: true,
|
||||
},
|
||||
{
|
||||
label: 'Quantity',
|
||||
key: 'quantity',
|
||||
type: 'string' as const,
|
||||
required: false,
|
||||
description: '',
|
||||
variables: true,
|
||||
},
|
||||
{
|
||||
label: 'Tax Rate 1',
|
||||
key: 'taxRate1',
|
||||
type: 'string' as const,
|
||||
required: false,
|
||||
description: '',
|
||||
variables: true,
|
||||
},
|
||||
{
|
||||
label: 'Tax Name 1',
|
||||
key: 'taxName1',
|
||||
type: 'string' as const,
|
||||
required: false,
|
||||
description: '',
|
||||
variables: true,
|
||||
},
|
||||
{
|
||||
label: 'Tax Rate 2',
|
||||
key: 'taxRate2',
|
||||
type: 'string' as const,
|
||||
required: false,
|
||||
description: '',
|
||||
variables: true,
|
||||
},
|
||||
{
|
||||
label: 'Tax Name 2',
|
||||
key: 'taxName2',
|
||||
type: 'string' as const,
|
||||
required: false,
|
||||
description: '',
|
||||
variables: true,
|
||||
},
|
||||
{
|
||||
label: 'Tax Rate 3',
|
||||
key: 'taxRate3',
|
||||
type: 'string' as const,
|
||||
required: false,
|
||||
description: '',
|
||||
variables: true,
|
||||
},
|
||||
{
|
||||
label: 'Tax Name 3',
|
||||
key: 'taxName3',
|
||||
type: 'string' as const,
|
||||
required: false,
|
||||
description: '',
|
||||
variables: true,
|
||||
},
|
||||
{
|
||||
label: 'Custom Value 1',
|
||||
key: 'customValue1',
|
||||
type: 'string' as const,
|
||||
required: false,
|
||||
description: '',
|
||||
variables: true,
|
||||
},
|
||||
{
|
||||
label: 'Custom Value 2',
|
||||
key: 'customValue2',
|
||||
type: 'string' as const,
|
||||
required: false,
|
||||
description: '',
|
||||
variables: true,
|
||||
},
|
||||
{
|
||||
label: 'Custom Value 3',
|
||||
key: 'customValue3',
|
||||
type: 'string' as const,
|
||||
required: false,
|
||||
description: '',
|
||||
variables: true,
|
||||
},
|
||||
{
|
||||
label: 'Custom Value 4',
|
||||
key: 'customValue4',
|
||||
type: 'string' as const,
|
||||
required: false,
|
||||
description: '',
|
||||
variables: true,
|
||||
},
|
||||
];
|
@@ -0,0 +1,52 @@
|
||||
import defineAction from '../../../../helpers/define-action';
|
||||
import { filterProvidedFields } from '../../common/filter-provided-fields';
|
||||
import { fields } from './fields';
|
||||
|
||||
export default defineAction({
|
||||
name: 'Create product',
|
||||
key: 'createProduct',
|
||||
description: 'Creates a new product.',
|
||||
arguments: fields,
|
||||
|
||||
async run($) {
|
||||
const {
|
||||
productKey,
|
||||
notes,
|
||||
price,
|
||||
quantity,
|
||||
taxRate1,
|
||||
taxName1,
|
||||
taxRate2,
|
||||
taxName2,
|
||||
taxRate3,
|
||||
taxName3,
|
||||
customValue1,
|
||||
customValue2,
|
||||
customValue3,
|
||||
customValue4,
|
||||
} = $.step.parameters;
|
||||
|
||||
const bodyFields = {
|
||||
product_key: productKey,
|
||||
notes: notes,
|
||||
price: price,
|
||||
quantity: quantity,
|
||||
tax_rate1: taxRate1,
|
||||
tax_name1: taxName1,
|
||||
tax_rate2: taxRate2,
|
||||
tax_name2: taxName2,
|
||||
tax_rate3: taxRate3,
|
||||
tax_name3: taxName3,
|
||||
custom_value1: customValue1,
|
||||
custom_value2: customValue2,
|
||||
custom_value3: customValue3,
|
||||
custom_value4: customValue4,
|
||||
};
|
||||
|
||||
const body = filterProvidedFields(bodyFields);
|
||||
|
||||
const response = await $.http.post('/v1/products', body);
|
||||
|
||||
$.setActionItem({ raw: response.data.data });
|
||||
},
|
||||
});
|
6
packages/backend/src/apps/invoice-ninja/actions/index.ts
Normal file
6
packages/backend/src/apps/invoice-ninja/actions/index.ts
Normal file
@@ -0,0 +1,6 @@
|
||||
import createClient from './create-client';
|
||||
import createInvoice from './create-invoice';
|
||||
import createPayment from './create-payment';
|
||||
import createProduct from './create-product';
|
||||
|
||||
export default [createClient, createInvoice, createPayment, createProduct];
|
@@ -0,0 +1,2 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<svg fill="#000000" width="800px" height="800px" viewBox="0 0 24 24" role="img" xmlns="http://www.w3.org/2000/svg"><path d="M16.247 10.326a1.164 1.164 0 11-2.328 0 1.164 1.164 0 012.328 0zm-6.288 0a1.164 1.164 0 11-2.329 0 1.164 1.164 0 012.329 0zm-.14 13.52c-4.712-.98-8.227-4.257-9.482-8.842-.421-1.537-.421-4.49 0-6.027C1.506 4.709 4.73 1.485 8.997.316c1.538-.421 4.49-.421 6.028 0 4.267 1.169 7.492 4.393 8.66 8.66.24.874.294 1.43.294 3.014 0 1.584-.054 2.14-.293 3.014-1.17 4.271-4.439 7.536-8.661 8.65-1.391.367-3.916.46-5.206.192zm6.64-9.315c-3.047-1.348-4.054-1.737-4.5-1.737-.446 0-1.433.38-4.38 1.684-2.091.926-3.828 1.76-3.86 1.79h16.663zm-9.873-.361c1.621-.729 3.06-1.387 3.196-1.464.258-.145.337-.09-5.285-3.682-.56-.358-1.023-.698-1.025-.65V15.564a790.1 790.1 0 003.114-1.394zm14.078-2.194V8.417c0-.11-1.676.993-3.496 2.12-3 1.854-3.281 2.06-3.004 2.185 1.345.611 6.42 2.862 6.5 2.872zm-8.169.11c.545.125.643.104 1.226-.263.349-.22.655-.419.681-.442.026-.024-.05-.181-.167-.35-.118-.168-.215-.5-.215-.739V9.86l-.569.21c-.726.267-2.28.27-3 .005l-.556-.205.013.452c.007.26-.088.563-.225.715-.232.256-.22.276.45.726.64.432.725.455 1.23.327a2.349 2.349 0 011.132-.002zm-4.23-2.65c-.105-.113-2.97-.954-3.033-.891-.03.03.504.414 1.186.854l1.24.8.34-.344c.186-.188.307-.377.268-.42zm9.76-.373c.473-.306.8-.555.728-.555-.155 0-2.877.804-3.027.894-.057.034.033.229.2.433l.304.37.47-.293c.257-.162.854-.544 1.326-.85zm-1.636-.555c2.11-.59 3.867-1.102 3.904-1.139H3.59c.187.187 7.779 2.195 8.323 2.202.41.005 2.014-.376 4.476-1.063z"/></svg>
|
After Width: | Height: | Size: 1.5 KiB |
33
packages/backend/src/apps/invoice-ninja/auth/index.ts
Normal file
33
packages/backend/src/apps/invoice-ninja/auth/index.ts
Normal file
@@ -0,0 +1,33 @@
|
||||
import verifyCredentials from './verify-credentials';
|
||||
import isStillVerified from './is-still-verified';
|
||||
|
||||
export default {
|
||||
fields: [
|
||||
{
|
||||
key: 'apiToken',
|
||||
label: 'API Token',
|
||||
type: 'string' as const,
|
||||
required: true,
|
||||
readOnly: false,
|
||||
value: null,
|
||||
placeholder: null,
|
||||
description:
|
||||
'Tokens can be created in the v5 app on Settings > Account Management',
|
||||
clickToCopy: false,
|
||||
},
|
||||
{
|
||||
key: 'instanceUrl',
|
||||
label: 'Invoice Ninja instance URL (optional)',
|
||||
type: 'string' as const,
|
||||
required: false,
|
||||
readOnly: false,
|
||||
value: null,
|
||||
placeholder: null,
|
||||
description: "Leave this field blank if you're using hosted platform.",
|
||||
clickToCopy: true,
|
||||
},
|
||||
],
|
||||
|
||||
verifyCredentials,
|
||||
isStillVerified,
|
||||
};
|
@@ -0,0 +1,10 @@
|
||||
import { IGlobalVariable } from '@automatisch/types';
|
||||
import verifyCredentials from './verify-credentials';
|
||||
|
||||
const isStillVerified = async ($: IGlobalVariable) => {
|
||||
await verifyCredentials($);
|
||||
|
||||
return true;
|
||||
};
|
||||
|
||||
export default isStillVerified;
|
@@ -0,0 +1,15 @@
|
||||
import { IGlobalVariable } from '@automatisch/types';
|
||||
|
||||
const verifyCredentials = async ($: IGlobalVariable) => {
|
||||
const { data } = await $.http.get('/v1/ping');
|
||||
|
||||
const screenName = [data.user_name, data.company_name]
|
||||
.filter(Boolean)
|
||||
.join(' @ ');
|
||||
|
||||
await $.auth.set({
|
||||
screenName,
|
||||
});
|
||||
};
|
||||
|
||||
export default verifyCredentials;
|
@@ -0,0 +1,20 @@
|
||||
import { TBeforeRequest } from '@automatisch/types';
|
||||
|
||||
const addAuthHeader: TBeforeRequest = ($, requestConfig) => {
|
||||
const { instanceUrl } = $.auth.data;
|
||||
|
||||
if (instanceUrl) {
|
||||
requestConfig.baseURL = instanceUrl as string;
|
||||
}
|
||||
|
||||
requestConfig.headers['X-API-TOKEN'] = $.auth.data.apiToken as string;
|
||||
|
||||
requestConfig.headers['X-Requested-With'] = 'XMLHttpRequest';
|
||||
|
||||
requestConfig.headers['Content-Type'] =
|
||||
requestConfig.headers['Content-Type'] || 'application/json';
|
||||
|
||||
return requestConfig;
|
||||
};
|
||||
|
||||
export default addAuthHeader;
|
@@ -0,0 +1,18 @@
|
||||
import isObject from 'lodash/isObject';
|
||||
|
||||
export function filterProvidedFields(body: Record<string, unknown>) {
|
||||
return Object.keys(body).reduce<Record<string, unknown>>((result, key) => {
|
||||
const value = body[key];
|
||||
if (isObject(value)) {
|
||||
const filteredNestedObj = filterProvidedFields(
|
||||
value as Record<string, unknown>
|
||||
);
|
||||
if (Object.keys(filteredNestedObj).length > 0) {
|
||||
result[key] = filteredNestedObj;
|
||||
}
|
||||
} else if (body[key]) {
|
||||
result[key] = value;
|
||||
}
|
||||
return result;
|
||||
}, {});
|
||||
}
|
@@ -0,0 +1,13 @@
|
||||
import { TBeforeRequest } from '@automatisch/types';
|
||||
|
||||
const setBaseUrl: TBeforeRequest = ($, requestConfig) => {
|
||||
const instanceUrl = $.auth.data.instanceUrl as string;
|
||||
|
||||
if (instanceUrl) {
|
||||
requestConfig.baseURL = instanceUrl;
|
||||
}
|
||||
|
||||
return requestConfig;
|
||||
};
|
||||
|
||||
export default setBaseUrl;
|
@@ -0,0 +1,4 @@
|
||||
import listClients from './list-clients';
|
||||
import listInvoices from './list-invoices';
|
||||
|
||||
export default [listClients, listInvoices];
|
@@ -0,0 +1,35 @@
|
||||
import { IGlobalVariable, IJSONObject } from '@automatisch/types';
|
||||
|
||||
export default {
|
||||
name: 'List clients',
|
||||
key: 'listClients',
|
||||
|
||||
async run($: IGlobalVariable) {
|
||||
const clients: {
|
||||
data: IJSONObject[];
|
||||
} = {
|
||||
data: [],
|
||||
};
|
||||
|
||||
const params = {
|
||||
sort: 'created_at|desc',
|
||||
};
|
||||
|
||||
const {
|
||||
data: { data },
|
||||
} = await $.http.get('/v1/clients', { params });
|
||||
|
||||
if (!data?.length) {
|
||||
return;
|
||||
}
|
||||
|
||||
for (const client of data) {
|
||||
clients.data.push({
|
||||
value: client.id,
|
||||
name: client.name,
|
||||
});
|
||||
}
|
||||
|
||||
return clients;
|
||||
},
|
||||
};
|
@@ -0,0 +1,35 @@
|
||||
import { IGlobalVariable, IJSONObject } from '@automatisch/types';
|
||||
|
||||
export default {
|
||||
name: 'List invoices',
|
||||
key: 'listInvoices',
|
||||
|
||||
async run($: IGlobalVariable) {
|
||||
const invoices: {
|
||||
data: IJSONObject[];
|
||||
} = {
|
||||
data: [],
|
||||
};
|
||||
|
||||
const params = {
|
||||
sort: 'created_at|desc',
|
||||
};
|
||||
|
||||
const {
|
||||
data: { data },
|
||||
} = await $.http.get('/v1/invoices', { params });
|
||||
|
||||
if (!data?.length) {
|
||||
return;
|
||||
}
|
||||
|
||||
for (const invoice of data) {
|
||||
invoices.data.push({
|
||||
value: invoice.id,
|
||||
name: invoice.number,
|
||||
});
|
||||
}
|
||||
|
||||
return invoices;
|
||||
},
|
||||
};
|
0
packages/backend/src/apps/invoice-ninja/index.d.ts
vendored
Normal file
0
packages/backend/src/apps/invoice-ninja/index.d.ts
vendored
Normal file
23
packages/backend/src/apps/invoice-ninja/index.ts
Normal file
23
packages/backend/src/apps/invoice-ninja/index.ts
Normal file
@@ -0,0 +1,23 @@
|
||||
import defineApp from '../../helpers/define-app';
|
||||
import setBaseUrl from './common/set-base-url';
|
||||
import addAuthHeader from './common/add-auth-header';
|
||||
import auth from './auth';
|
||||
import triggers from './triggers';
|
||||
import actions from './actions';
|
||||
import dynamicData from './dynamic-data';
|
||||
|
||||
export default defineApp({
|
||||
name: 'Invoice Ninja',
|
||||
key: 'invoice-ninja',
|
||||
baseUrl: 'https://invoiceninja.com',
|
||||
apiBaseUrl: 'https://invoicing.co/api',
|
||||
iconUrl: '{BASE_URL}/apps/invoice-ninja/assets/favicon.svg',
|
||||
authDocUrl: 'https://automatisch.io/docs/apps/invoice-ninja/connection',
|
||||
primaryColor: '000000',
|
||||
supportsConnections: true,
|
||||
beforeRequest: [setBaseUrl, addAuthHeader],
|
||||
auth,
|
||||
triggers,
|
||||
actions,
|
||||
dynamicData,
|
||||
});
|
15
packages/backend/src/apps/invoice-ninja/triggers/index.ts
Normal file
15
packages/backend/src/apps/invoice-ninja/triggers/index.ts
Normal file
@@ -0,0 +1,15 @@
|
||||
import newClients from './new-clients';
|
||||
import newCredits from './new-credits';
|
||||
import newInvoices from './new-invoices';
|
||||
import newPayments from './new-payments';
|
||||
import newProjects from './new-projects';
|
||||
import newQuotes from './new-quotes';
|
||||
|
||||
export default [
|
||||
newClients,
|
||||
newCredits,
|
||||
newInvoices,
|
||||
newPayments,
|
||||
newProjects,
|
||||
newQuotes,
|
||||
];
|
@@ -0,0 +1,65 @@
|
||||
import Crypto from 'crypto';
|
||||
import isEmpty from 'lodash/isEmpty';
|
||||
import defineTrigger from '../../../../helpers/define-trigger';
|
||||
|
||||
type Response = {
|
||||
data: {
|
||||
data: {
|
||||
id: string;
|
||||
event_id: string;
|
||||
target_url: string;
|
||||
format: string;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
export default defineTrigger({
|
||||
name: 'New clients',
|
||||
key: 'newClients',
|
||||
type: 'webhook',
|
||||
description: 'Triggers when a new client is added.',
|
||||
arguments: [],
|
||||
|
||||
async run($) {
|
||||
const dataItem = {
|
||||
raw: $.request.body,
|
||||
meta: {
|
||||
internalId: Crypto.randomUUID(),
|
||||
},
|
||||
};
|
||||
|
||||
$.pushTriggerItem(dataItem);
|
||||
},
|
||||
|
||||
async testRun($) {
|
||||
const lastExecutionStep = await $.getLastExecutionStep();
|
||||
|
||||
if (!isEmpty(lastExecutionStep?.dataOut)) {
|
||||
$.pushTriggerItem({
|
||||
raw: lastExecutionStep.dataOut,
|
||||
meta: {
|
||||
internalId: '',
|
||||
},
|
||||
});
|
||||
}
|
||||
},
|
||||
|
||||
async registerHook($) {
|
||||
const CREATE_CLIENT_EVENT_ID = '1';
|
||||
|
||||
const payload = {
|
||||
target_url: $.webhookUrl,
|
||||
event_id: CREATE_CLIENT_EVENT_ID,
|
||||
format: 'JSON',
|
||||
rest_method: 'post',
|
||||
};
|
||||
|
||||
const response: Response = await $.http.post('/v1/webhooks', payload);
|
||||
|
||||
await $.flow.setRemoteWebhookId(response.data.data.id);
|
||||
},
|
||||
|
||||
async unregisterHook($) {
|
||||
await $.http.delete(`/v1/webhooks/${$.flow.remoteWebhookId}`);
|
||||
},
|
||||
});
|
@@ -0,0 +1,65 @@
|
||||
import Crypto from 'crypto';
|
||||
import isEmpty from 'lodash/isEmpty';
|
||||
import defineTrigger from '../../../../helpers/define-trigger';
|
||||
|
||||
type Response = {
|
||||
data: {
|
||||
data: {
|
||||
id: string;
|
||||
event_id: string;
|
||||
target_url: string;
|
||||
format: string;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
export default defineTrigger({
|
||||
name: 'New credits',
|
||||
key: 'newCredits',
|
||||
type: 'webhook',
|
||||
description: 'Triggers when a new credit is added.',
|
||||
arguments: [],
|
||||
|
||||
async run($) {
|
||||
const dataItem = {
|
||||
raw: $.request.body,
|
||||
meta: {
|
||||
internalId: Crypto.randomUUID(),
|
||||
},
|
||||
};
|
||||
|
||||
$.pushTriggerItem(dataItem);
|
||||
},
|
||||
|
||||
async testRun($) {
|
||||
const lastExecutionStep = await $.getLastExecutionStep();
|
||||
|
||||
if (!isEmpty(lastExecutionStep?.dataOut)) {
|
||||
$.pushTriggerItem({
|
||||
raw: lastExecutionStep.dataOut,
|
||||
meta: {
|
||||
internalId: '',
|
||||
},
|
||||
});
|
||||
}
|
||||
},
|
||||
|
||||
async registerHook($) {
|
||||
const CREATE_CREDIT_EVENT_ID = '27';
|
||||
|
||||
const payload = {
|
||||
target_url: $.webhookUrl,
|
||||
event_id: CREATE_CREDIT_EVENT_ID,
|
||||
format: 'JSON',
|
||||
rest_method: 'post',
|
||||
};
|
||||
|
||||
const response: Response = await $.http.post('/v1/webhooks', payload);
|
||||
|
||||
await $.flow.setRemoteWebhookId(response.data.data.id);
|
||||
},
|
||||
|
||||
async unregisterHook($) {
|
||||
await $.http.delete(`/v1/webhooks/${$.flow.remoteWebhookId}`);
|
||||
},
|
||||
});
|
@@ -0,0 +1,65 @@
|
||||
import Crypto from 'crypto';
|
||||
import isEmpty from 'lodash/isEmpty';
|
||||
import defineTrigger from '../../../../helpers/define-trigger';
|
||||
|
||||
type Response = {
|
||||
data: {
|
||||
data: {
|
||||
id: string;
|
||||
event_id: string;
|
||||
target_url: string;
|
||||
format: string;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
export default defineTrigger({
|
||||
name: 'New invoices',
|
||||
key: 'newInvoices',
|
||||
type: 'webhook',
|
||||
description: 'Triggers when a new invoice is added.',
|
||||
arguments: [],
|
||||
|
||||
async run($) {
|
||||
const dataItem = {
|
||||
raw: $.request.body,
|
||||
meta: {
|
||||
internalId: Crypto.randomUUID(),
|
||||
},
|
||||
};
|
||||
|
||||
$.pushTriggerItem(dataItem);
|
||||
},
|
||||
|
||||
async testRun($) {
|
||||
const lastExecutionStep = await $.getLastExecutionStep();
|
||||
|
||||
if (!isEmpty(lastExecutionStep?.dataOut)) {
|
||||
$.pushTriggerItem({
|
||||
raw: lastExecutionStep.dataOut,
|
||||
meta: {
|
||||
internalId: '',
|
||||
},
|
||||
});
|
||||
}
|
||||
},
|
||||
|
||||
async registerHook($) {
|
||||
const CREATE_INVOICE_EVENT_ID = '2';
|
||||
|
||||
const payload = {
|
||||
target_url: $.webhookUrl,
|
||||
event_id: CREATE_INVOICE_EVENT_ID,
|
||||
format: 'JSON',
|
||||
rest_method: 'post',
|
||||
};
|
||||
|
||||
const response: Response = await $.http.post('/v1/webhooks', payload);
|
||||
|
||||
await $.flow.setRemoteWebhookId(response.data.data.id);
|
||||
},
|
||||
|
||||
async unregisterHook($) {
|
||||
await $.http.delete(`/v1/webhooks/${$.flow.remoteWebhookId}`);
|
||||
},
|
||||
});
|
@@ -0,0 +1,65 @@
|
||||
import Crypto from 'crypto';
|
||||
import isEmpty from 'lodash/isEmpty';
|
||||
import defineTrigger from '../../../../helpers/define-trigger';
|
||||
|
||||
type Response = {
|
||||
data: {
|
||||
data: {
|
||||
id: string;
|
||||
event_id: string;
|
||||
target_url: string;
|
||||
format: string;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
export default defineTrigger({
|
||||
name: 'New payments',
|
||||
key: 'newPayments',
|
||||
type: 'webhook',
|
||||
description: 'Triggers when a new payment is added.',
|
||||
arguments: [],
|
||||
|
||||
async run($) {
|
||||
const dataItem = {
|
||||
raw: $.request.body,
|
||||
meta: {
|
||||
internalId: Crypto.randomUUID(),
|
||||
},
|
||||
};
|
||||
|
||||
$.pushTriggerItem(dataItem);
|
||||
},
|
||||
|
||||
async testRun($) {
|
||||
const lastExecutionStep = await $.getLastExecutionStep();
|
||||
|
||||
if (!isEmpty(lastExecutionStep?.dataOut)) {
|
||||
$.pushTriggerItem({
|
||||
raw: lastExecutionStep.dataOut,
|
||||
meta: {
|
||||
internalId: '',
|
||||
},
|
||||
});
|
||||
}
|
||||
},
|
||||
|
||||
async registerHook($) {
|
||||
const CREATE_PAYMENT_EVENT_ID = '4';
|
||||
|
||||
const payload = {
|
||||
target_url: $.webhookUrl,
|
||||
event_id: CREATE_PAYMENT_EVENT_ID,
|
||||
format: 'JSON',
|
||||
rest_method: 'post',
|
||||
};
|
||||
|
||||
const response: Response = await $.http.post('/v1/webhooks', payload);
|
||||
|
||||
await $.flow.setRemoteWebhookId(response.data.data.id);
|
||||
},
|
||||
|
||||
async unregisterHook($) {
|
||||
await $.http.delete(`/v1/webhooks/${$.flow.remoteWebhookId}`);
|
||||
},
|
||||
});
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user