Compare commits

..

1 Commits

Author SHA1 Message Date
Ali BARIN
7dee26c16d chore: allow custom seed user creds 2024-03-07 08:41:30 +00:00
479 changed files with 5457 additions and 7400 deletions

View File

@@ -4,9 +4,5 @@
**/.devcontainer **/.devcontainer
**/.github **/.github
**/.vscode **/.vscode
**/.env
**/.env.test
**/.env.production
**/yarn-error.log
packages/docs packages/docs
packages/e2e-test packages/e2e-test

View File

@@ -1,32 +0,0 @@
name: Automatisch Docs Change
on:
pull_request:
paths:
- 'packages/docs/**'
jobs:
label:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v3
- name: Label PR
uses: actions/github-script@v6
with:
script: |
const { pull_request } = context.payload;
const label = 'documentation-change';
const hasLabel = pull_request.labels.some(({ name }) => name === label);
if (!hasLabel) {
await github.rest.issues.addLabels({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: pull_request.number,
labels: [label],
});
console.log(`Label "${label}" added to PR #${pull_request.number}`);
} else {
console.log(`Label "${label}" already exists on PR #${pull_request.number}`);
}

View File

@@ -1,25 +1,14 @@
# syntax=docker/dockerfile:1 # syntax=docker/dockerfile:1
FROM node:18-alpine FROM node:18-alpine
ENV PORT 3000
RUN \
apk --no-cache add --virtual build-dependencies python3 build-base git
WORKDIR /automatisch WORKDIR /automatisch
# copy the app, note .dockerignore
COPY . /automatisch
RUN yarn
RUN cd packages/web && yarn build
RUN \ RUN \
apk --no-cache add --virtual build-dependencies python3 build-base && \
yarn global add @automatisch/cli@0.10.0 --network-timeout 1000000 && \
rm -rf /usr/local/share/.cache/ && \ rm -rf /usr/local/share/.cache/ && \
apk del build-dependencies apk del build-dependencies
COPY ./docker/entrypoint.sh /entrypoint.sh COPY ./entrypoint.sh /entrypoint.sh
EXPOSE 3000 EXPOSE 3000
ENTRYPOINT ["sh", "/entrypoint.sh"] ENTRYPOINT ["sh", "/entrypoint.sh"]

View File

@@ -2,12 +2,8 @@
set -e set -e
cd packages/backend
if [ -n "$WORKER" ]; then if [ -n "$WORKER" ]; then
yarn start:worker automatisch start-worker
else else
yarn db:migrate automatisch start
yarn db:seed:user
yarn start
fi fi

View File

@@ -18,8 +18,8 @@ async function fetchAdminRole() {
} }
export async function createUser( export async function createUser(
email = 'user@automatisch.io', email = appConfig.seedUserEmail,
password = 'sample' password = appConfig.seedUserPassword
) { ) {
const UNIQUE_VIOLATION_CODE = '23505'; const UNIQUE_VIOLATION_CODE = '23505';

View File

@@ -31,7 +31,7 @@
"accounting": "^0.4.1", "accounting": "^0.4.1",
"ajv-formats": "^2.1.1", "ajv-formats": "^2.1.1",
"axios": "1.6.0", "axios": "1.6.0",
"bcrypt": "^5.1.0", "bcrypt": "^5.0.1",
"bullmq": "^3.0.0", "bullmq": "^3.0.0",
"cors": "^2.8.5", "cors": "^2.8.5",
"crypto-js": "^4.1.1", "crypto-js": "^4.1.1",
@@ -95,7 +95,6 @@
"url": "https://github.com/automatisch/automatisch/issues" "url": "https://github.com/automatisch/automatisch/issues"
}, },
"devDependencies": { "devDependencies": {
"node-gyp": "^10.1.0",
"nodemon": "^2.0.13", "nodemon": "^2.0.13",
"supertest": "^6.3.3", "supertest": "^6.3.3",
"vitest": "^1.1.3" "vitest": "^1.1.3"

View File

@@ -11,7 +11,7 @@ export default defineApp({
'https://azure.microsoft.com/en-us/products/ai-services/openai-service', 'https://azure.microsoft.com/en-us/products/ai-services/openai-service',
apiBaseUrl: '', apiBaseUrl: '',
iconUrl: '{BASE_URL}/apps/azure-openai/assets/favicon.svg', iconUrl: '{BASE_URL}/apps/azure-openai/assets/favicon.svg',
authDocUrl: '{DOCS_URL}/apps/azure-openai/connection', authDocUrl: 'https://automatisch.io/docs/apps/azure-openai/connection',
primaryColor: '000000', primaryColor: '000000',
supportsConnections: true, supportsConnections: true,
beforeRequest: [setBaseUrl, addAuthHeader], beforeRequest: [setBaseUrl, addAuthHeader],

View File

@@ -7,7 +7,7 @@ export default defineApp({
name: 'Carbone', name: 'Carbone',
key: 'carbone', key: 'carbone',
iconUrl: '{BASE_URL}/apps/carbone/assets/favicon.svg', iconUrl: '{BASE_URL}/apps/carbone/assets/favicon.svg',
authDocUrl: '{DOCS_URL}/apps/carbone/connection', authDocUrl: 'https://automatisch.io/docs/apps/carbone/connection',
supportsConnections: true, supportsConnections: true,
baseUrl: 'https://carbone.io', baseUrl: 'https://carbone.io',
apiBaseUrl: 'https://api.carbone.io', apiBaseUrl: 'https://api.carbone.io',

View File

@@ -5,7 +5,7 @@ export default defineApp({
name: 'Datastore', name: 'Datastore',
key: 'datastore', key: 'datastore',
iconUrl: '{BASE_URL}/apps/datastore/assets/favicon.svg', iconUrl: '{BASE_URL}/apps/datastore/assets/favicon.svg',
authDocUrl: '{DOCS_URL}/apps/datastore/connection', authDocUrl: 'https://automatisch.io/docs/apps/datastore/connection',
supportsConnections: false, supportsConnections: false,
baseUrl: '', baseUrl: '',
apiBaseUrl: '', apiBaseUrl: '',

View File

@@ -7,7 +7,7 @@ export default defineApp({
name: 'DeepL', name: 'DeepL',
key: 'deepl', key: 'deepl',
iconUrl: '{BASE_URL}/apps/deepl/assets/favicon.svg', iconUrl: '{BASE_URL}/apps/deepl/assets/favicon.svg',
authDocUrl: '{DOCS_URL}/apps/deepl/connection', authDocUrl: 'https://automatisch.io/docs/apps/deepl/connection',
supportsConnections: true, supportsConnections: true,
baseUrl: 'https://deepl.com', baseUrl: 'https://deepl.com',
apiBaseUrl: 'https://api.deepl.com', apiBaseUrl: 'https://api.deepl.com',

View File

@@ -5,7 +5,7 @@ export default defineApp({
name: 'Delay', name: 'Delay',
key: 'delay', key: 'delay',
iconUrl: '{BASE_URL}/apps/delay/assets/favicon.svg', iconUrl: '{BASE_URL}/apps/delay/assets/favicon.svg',
authDocUrl: '{DOCS_URL}/apps/delay/connection', authDocUrl: 'https://automatisch.io/docs/apps/delay/connection',
supportsConnections: false, supportsConnections: false,
baseUrl: '', baseUrl: '',
apiBaseUrl: '', apiBaseUrl: '',

View File

@@ -10,7 +10,7 @@ export default defineApp({
name: 'Discord', name: 'Discord',
key: 'discord', key: 'discord',
iconUrl: '{BASE_URL}/apps/discord/assets/favicon.svg', iconUrl: '{BASE_URL}/apps/discord/assets/favicon.svg',
authDocUrl: '{DOCS_URL}/apps/discord/connection', authDocUrl: 'https://automatisch.io/docs/apps/discord/connection',
supportsConnections: true, supportsConnections: true,
baseUrl: 'https://discord.com', baseUrl: 'https://discord.com',
apiBaseUrl: 'https://discord.com/api', apiBaseUrl: 'https://discord.com/api',

View File

@@ -7,7 +7,7 @@ export default defineApp({
name: 'Dropbox', name: 'Dropbox',
key: 'dropbox', key: 'dropbox',
iconUrl: '{BASE_URL}/apps/dropbox/assets/favicon.svg', iconUrl: '{BASE_URL}/apps/dropbox/assets/favicon.svg',
authDocUrl: '{DOCS_URL}/apps/dropbox/connection', authDocUrl: 'https://automatisch.io/docs/apps/dropbox/connection',
supportsConnections: true, supportsConnections: true,
baseUrl: 'https://dropbox.com', baseUrl: 'https://dropbox.com',
apiBaseUrl: 'https://api.dropboxapi.com', apiBaseUrl: 'https://api.dropboxapi.com',

View File

@@ -5,7 +5,7 @@ export default defineApp({
name: 'Filter', name: 'Filter',
key: 'filter', key: 'filter',
iconUrl: '{BASE_URL}/apps/filter/assets/favicon.svg', iconUrl: '{BASE_URL}/apps/filter/assets/favicon.svg',
authDocUrl: '{DOCS_URL}/apps/filter/connection', authDocUrl: 'https://automatisch.io/docs/apps/filter/connection',
supportsConnections: false, supportsConnections: false,
baseUrl: '', baseUrl: '',
apiBaseUrl: '', apiBaseUrl: '',

View File

@@ -8,7 +8,7 @@ export default defineApp({
name: 'Flickr', name: 'Flickr',
key: 'flickr', key: 'flickr',
iconUrl: '{BASE_URL}/apps/flickr/assets/favicon.svg', iconUrl: '{BASE_URL}/apps/flickr/assets/favicon.svg',
authDocUrl: '{DOCS_URL}/apps/flickr/connection', authDocUrl: 'https://automatisch.io/docs/apps/flickr/connection',
docUrl: 'https://automatisch.io/docs/flickr', docUrl: 'https://automatisch.io/docs/flickr',
primaryColor: '000000', primaryColor: '000000',
supportsConnections: true, supportsConnections: true,

View File

@@ -7,7 +7,7 @@ export default defineApp({
name: 'Flowers Software', name: 'Flowers Software',
key: 'flowers-software', key: 'flowers-software',
iconUrl: '{BASE_URL}/apps/flowers-software/assets/favicon.svg', iconUrl: '{BASE_URL}/apps/flowers-software/assets/favicon.svg',
authDocUrl: '{DOCS_URL}/apps/flowers-software/connection', authDocUrl: 'https://automatisch.io/docs/apps/flowers-software/connection',
supportsConnections: true, supportsConnections: true,
baseUrl: 'https://flowers-software.com', baseUrl: 'https://flowers-software.com',
apiBaseUrl: 'https://webapp.flowers-software.com/api', apiBaseUrl: 'https://webapp.flowers-software.com/api',

View File

@@ -6,7 +6,7 @@ export default defineApp({
name: 'Formatter', name: 'Formatter',
key: 'formatter', key: 'formatter',
iconUrl: '{BASE_URL}/apps/formatter/assets/favicon.svg', iconUrl: '{BASE_URL}/apps/formatter/assets/favicon.svg',
authDocUrl: '{DOCS_URL}/apps/formatter/connection', authDocUrl: 'https://automatisch.io/docs/apps/formatter/connection',
supportsConnections: false, supportsConnections: false,
baseUrl: '', baseUrl: '',
apiBaseUrl: '', apiBaseUrl: '',

View File

@@ -10,7 +10,7 @@ export default defineApp({
baseUrl: 'https://ghost.org', baseUrl: 'https://ghost.org',
apiBaseUrl: '', apiBaseUrl: '',
iconUrl: '{BASE_URL}/apps/ghost/assets/favicon.svg', iconUrl: '{BASE_URL}/apps/ghost/assets/favicon.svg',
authDocUrl: '{DOCS_URL}/apps/ghost/connection', authDocUrl: 'https://automatisch.io/docs/apps/ghost/connection',
primaryColor: '15171A', primaryColor: '15171A',
supportsConnections: true, supportsConnections: true,
beforeRequest: [setBaseUrl, addAuthHeader], beforeRequest: [setBaseUrl, addAuthHeader],

View File

@@ -11,7 +11,7 @@ export default defineApp({
baseUrl: 'https://github.com', baseUrl: 'https://github.com',
apiBaseUrl: 'https://api.github.com', apiBaseUrl: 'https://api.github.com',
iconUrl: '{BASE_URL}/apps/github/assets/favicon.svg', iconUrl: '{BASE_URL}/apps/github/assets/favicon.svg',
authDocUrl: '{DOCS_URL}/apps/github/connection', authDocUrl: 'https://automatisch.io/docs/apps/github/connection',
primaryColor: '000000', primaryColor: '000000',
supportsConnections: true, supportsConnections: true,
beforeRequest: [addAuthHeader], beforeRequest: [addAuthHeader],

View File

@@ -11,7 +11,7 @@ export default defineApp({
baseUrl: 'https://gitlab.com', baseUrl: 'https://gitlab.com',
apiBaseUrl: 'https://gitlab.com', apiBaseUrl: 'https://gitlab.com',
iconUrl: '{BASE_URL}/apps/gitlab/assets/favicon.svg', iconUrl: '{BASE_URL}/apps/gitlab/assets/favicon.svg',
authDocUrl: '{DOCS_URL}/apps/gitlab/connection', authDocUrl: 'https://automatisch.io/docs/apps/gitlab/connection',
primaryColor: 'FC6D26', primaryColor: 'FC6D26',
supportsConnections: true, supportsConnections: true,
beforeRequest: [setBaseUrl, addAuthHeader], beforeRequest: [setBaseUrl, addAuthHeader],

View File

@@ -10,7 +10,7 @@ export default defineApp({
baseUrl: 'https://calendar.google.com', baseUrl: 'https://calendar.google.com',
apiBaseUrl: 'https://www.googleapis.com/calendar', apiBaseUrl: 'https://www.googleapis.com/calendar',
iconUrl: '{BASE_URL}/apps/google-calendar/assets/favicon.svg', iconUrl: '{BASE_URL}/apps/google-calendar/assets/favicon.svg',
authDocUrl: '{DOCS_URL}/apps/google-calendar/connection', authDocUrl: 'https://automatisch.io/docs/apps/google-calendar/connection',
primaryColor: '448AFF', primaryColor: '448AFF',
supportsConnections: true, supportsConnections: true,
beforeRequest: [addAuthHeader], beforeRequest: [addAuthHeader],

View File

@@ -10,7 +10,7 @@ export default defineApp({
baseUrl: 'https://drive.google.com', baseUrl: 'https://drive.google.com',
apiBaseUrl: 'https://www.googleapis.com/drive', apiBaseUrl: 'https://www.googleapis.com/drive',
iconUrl: '{BASE_URL}/apps/google-drive/assets/favicon.svg', iconUrl: '{BASE_URL}/apps/google-drive/assets/favicon.svg',
authDocUrl: '{DOCS_URL}/apps/google-drive/connection', authDocUrl: 'https://automatisch.io/docs/apps/google-drive/connection',
primaryColor: '1FA463', primaryColor: '1FA463',
supportsConnections: true, supportsConnections: true,
beforeRequest: [addAuthHeader], beforeRequest: [addAuthHeader],

View File

@@ -10,7 +10,7 @@ export default defineApp({
baseUrl: 'https://docs.google.com/forms', baseUrl: 'https://docs.google.com/forms',
apiBaseUrl: 'https://forms.googleapis.com', apiBaseUrl: 'https://forms.googleapis.com',
iconUrl: '{BASE_URL}/apps/google-forms/assets/favicon.svg', iconUrl: '{BASE_URL}/apps/google-forms/assets/favicon.svg',
authDocUrl: '{DOCS_URL}/apps/google-forms/connection', authDocUrl: 'https://automatisch.io/docs/apps/google-forms/connection',
primaryColor: '673AB7', primaryColor: '673AB7',
supportsConnections: true, supportsConnections: true,
beforeRequest: [addAuthHeader], beforeRequest: [addAuthHeader],

View File

@@ -12,7 +12,7 @@ export default defineApp({
baseUrl: 'https://docs.google.com/spreadsheets', baseUrl: 'https://docs.google.com/spreadsheets',
apiBaseUrl: 'https://sheets.googleapis.com', apiBaseUrl: 'https://sheets.googleapis.com',
iconUrl: '{BASE_URL}/apps/google-sheets/assets/favicon.svg', iconUrl: '{BASE_URL}/apps/google-sheets/assets/favicon.svg',
authDocUrl: '{DOCS_URL}/apps/google-sheets/connection', authDocUrl: 'https://automatisch.io/docs/apps/google-sheets/connection',
primaryColor: '0F9D58', primaryColor: '0F9D58',
supportsConnections: true, supportsConnections: true,
beforeRequest: [addAuthHeader], beforeRequest: [addAuthHeader],

View File

@@ -10,7 +10,7 @@ export default defineApp({
baseUrl: 'https://tryhelix.ai', baseUrl: 'https://tryhelix.ai',
apiBaseUrl: 'https://app.tryhelix.ai', apiBaseUrl: 'https://app.tryhelix.ai',
iconUrl: '{BASE_URL}/apps/helix/assets/favicon.svg', iconUrl: '{BASE_URL}/apps/helix/assets/favicon.svg',
authDocUrl: '{DOCS_URL}/apps/helix/connection', authDocUrl: 'https://automatisch.io/docs/apps/helix/connection',
primaryColor: '000000', primaryColor: '000000',
supportsConnections: true, supportsConnections: true,
beforeRequest: [setBaseUrl, addAuthHeader], beforeRequest: [setBaseUrl, addAuthHeader],

View File

@@ -90,7 +90,7 @@ export default defineAction({
async run($) { async run($) {
const method = $.step.parameters.method; const method = $.step.parameters.method;
const data = $.step.parameters.data || null; const data = $.step.parameters.data;
const url = $.step.parameters.url; const url = $.step.parameters.url;
const headers = $.step.parameters.headers; const headers = $.step.parameters.headers;
@@ -108,17 +108,14 @@ export default defineAction({
return result; return result;
}, {}); }, {});
let expectedResponseContentType = headersObject.accept; let contentType = headersObject['content-type'];
// in case HEAD request is not supported by the URL // in case HEAD request is not supported by the URL
try { try {
const metadataResponse = await $.http.head(url, { const metadataResponse = await $.http.head(url, {
headers: headersObject, headers: headersObject,
}); });
contentType = metadataResponse.headers['content-type'];
if (!expectedResponseContentType) {
expectedResponseContentType = metadataResponse.headers['content-type'];
}
throwIfFileSizeExceedsLimit(metadataResponse.headers['content-length']); throwIfFileSizeExceedsLimit(metadataResponse.headers['content-length']);
// eslint-disable-next-line no-empty // eslint-disable-next-line no-empty
@@ -131,7 +128,7 @@ export default defineAction({
headers: headersObject, headers: headersObject,
}; };
if (!isPossiblyTextBased(expectedResponseContentType)) { if (!isPossiblyTextBased(contentType)) {
requestData.responseType = 'arraybuffer'; requestData.responseType = 'arraybuffer';
} }
@@ -141,7 +138,7 @@ export default defineAction({
let responseData = response.data; let responseData = response.data;
if (!isPossiblyTextBased(expectedResponseContentType)) { if (!isPossiblyTextBased(contentType)) {
responseData = Buffer.from(responseData).toString('base64'); responseData = Buffer.from(responseData).toString('base64');
} }

View File

@@ -5,7 +5,7 @@ export default defineApp({
name: 'HTTP Request', name: 'HTTP Request',
key: 'http-request', key: 'http-request',
iconUrl: '{BASE_URL}/apps/http-request/assets/favicon.svg', iconUrl: '{BASE_URL}/apps/http-request/assets/favicon.svg',
authDocUrl: '{DOCS_URL}/apps/http-request/connection', authDocUrl: 'https://automatisch.io/docs/apps/http-request/connection',
supportsConnections: false, supportsConnections: false,
baseUrl: '', baseUrl: '',
apiBaseUrl: '', apiBaseUrl: '',

View File

@@ -7,7 +7,7 @@ export default defineApp({
name: 'HubSpot', name: 'HubSpot',
key: 'hubspot', key: 'hubspot',
iconUrl: '{BASE_URL}/apps/hubspot/assets/favicon.svg', iconUrl: '{BASE_URL}/apps/hubspot/assets/favicon.svg',
authDocUrl: '{DOCS_URL}/apps/hubspot/connection', authDocUrl: 'https://automatisch.io/docs/apps/hubspot/connection',
supportsConnections: true, supportsConnections: true,
baseUrl: 'https://www.hubspot.com', baseUrl: 'https://www.hubspot.com',
apiBaseUrl: 'https://api.hubapi.com', apiBaseUrl: 'https://api.hubapi.com',

View File

@@ -12,7 +12,7 @@ export default defineApp({
baseUrl: 'https://invoiceninja.com', baseUrl: 'https://invoiceninja.com',
apiBaseUrl: 'https://invoicing.co/api', apiBaseUrl: 'https://invoicing.co/api',
iconUrl: '{BASE_URL}/apps/invoice-ninja/assets/favicon.svg', iconUrl: '{BASE_URL}/apps/invoice-ninja/assets/favicon.svg',
authDocUrl: '{DOCS_URL}/apps/invoice-ninja/connection', authDocUrl: 'https://automatisch.io/docs/apps/invoice-ninja/connection',
primaryColor: '000000', primaryColor: '000000',
supportsConnections: true, supportsConnections: true,
beforeRequest: [setBaseUrl, addAuthHeader], beforeRequest: [setBaseUrl, addAuthHeader],

View File

@@ -10,7 +10,7 @@ export default defineApp({
name: 'Mattermost', name: 'Mattermost',
key: 'mattermost', key: 'mattermost',
iconUrl: '{BASE_URL}/apps/mattermost/assets/favicon.svg', iconUrl: '{BASE_URL}/apps/mattermost/assets/favicon.svg',
authDocUrl: '{DOCS_URL}/apps/mattermost/connection', authDocUrl: 'https://automatisch.io/docs/apps/mattermost/connection',
baseUrl: 'https://mattermost.com', baseUrl: 'https://mattermost.com',
apiBaseUrl: '', // there is no cloud version of this app, user always need to provide address of own instance when creating connection apiBaseUrl: '', // there is no cloud version of this app, user always need to provide address of own instance when creating connection
primaryColor: '4a154b', primaryColor: '4a154b',

View File

@@ -10,7 +10,7 @@ export default defineApp({
baseUrl: 'https://miro.com', baseUrl: 'https://miro.com',
apiBaseUrl: 'https://api.miro.com', apiBaseUrl: 'https://api.miro.com',
iconUrl: '{BASE_URL}/apps/miro/assets/favicon.svg', iconUrl: '{BASE_URL}/apps/miro/assets/favicon.svg',
authDocUrl: '{DOCS_URL}/apps/miro/connection', authDocUrl: 'https://automatisch.io/docs/apps/miro/connection',
primaryColor: 'F2CA02', primaryColor: 'F2CA02',
supportsConnections: true, supportsConnections: true,
beforeRequest: [addAuthHeader], beforeRequest: [addAuthHeader],

View File

@@ -1,70 +0,0 @@
import defineAction from '../../../../helpers/define-action.js';
export default defineAction({
name: 'Create board',
key: 'createBoard',
description: 'Creates a new board.',
arguments: [
{
label: 'Board Name',
key: 'boardName',
type: 'string',
required: true,
description: 'Title for the board.',
variables: true,
},
{
label: 'Board Kind',
key: 'boardKind',
type: 'dropdown',
required: true,
description: '',
variables: true,
options: [
{
label: 'Main',
value: 'public',
},
{
label: 'Private',
value: 'private',
},
{
label: 'Shareable',
value: 'share',
},
],
},
{
label: 'Template ID',
key: 'templateId',
type: 'string',
required: false,
description:
"When you switch on developer mode, you'll spot the template IDs in your template store. Additionally, you have the option to utilize the Board ID from any board you've saved as a template.",
variables: true,
},
],
async run($) {
const { boardName, boardKind, templateId } = $.step.parameters;
const body = {
query: `mutation {
create_board (board_name: "${boardName}", board_kind: ${boardKind}${
templateId ? `, template_id: ${templateId}` : ''
}) {
id
name
board_kind
}
}`,
};
const { data } = await $.http.post('/', body);
$.setActionItem({
raw: data,
});
},
});

View File

@@ -1,3 +0,0 @@
import createBoard from './create-board/index.js';
export default [createBoard];

View File

@@ -1,8 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="256px" height="156px" viewBox="0 0 256 156" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" preserveAspectRatio="xMidYMid">
<g>
<path d="M31.8458633,153.488694 C20.3244423,153.513586 9.68073708,147.337265 3.98575204,137.321731 C-1.62714067,127.367831 -1.29055839,115.129325 4.86093879,105.498969 L62.2342919,15.4033556 C68.2125882,5.54538256 79.032489,-0.333585033 90.5563073,0.0146553508 C102.071737,0.290611552 112.546041,6.74705604 117.96667,16.9106216 C123.315033,27.0238906 122.646488,39.1914174 116.240607,48.6847625 L58.9037201,138.780375 C52.9943022,147.988884 42.7873202,153.537154 31.8458633,153.488694 L31.8458633,153.488694 Z" fill="#F62B54"></path>
<path d="M130.25575,153.488484 C118.683837,153.488484 108.035731,147.301291 102.444261,137.358197 C96.8438154,127.431292 97.1804475,115.223704 103.319447,105.620522 L160.583402,15.7315506 C166.47539,5.73210989 177.327374,-0.284878136 188.929728,0.0146553508 C200.598885,0.269918151 211.174058,6.7973526 216.522421,17.0078646 C221.834319,27.2183766 221.056375,39.4588356 214.456008,48.9278699 L157.204209,138.816842 C151.313487,147.985468 141.153618,153.5168 130.25575,153.488484 Z" fill="#FFCC00"></path>
<ellipse fill="#00CA72" cx="226.465527" cy="125.324379" rx="29.5375538" ry="28.9176274"></ellipse>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 1.4 KiB

View File

@@ -1,21 +0,0 @@
import verifyCredentials from './verify-credentials.js';
import isStillVerified from './is-still-verified.js';
export default {
fields: [
{
key: 'apiToken',
label: 'API Token',
type: 'string',
required: true,
readOnly: false,
value: null,
placeholder: null,
description: 'Monday.com API token of your account.',
clickToCopy: false,
},
],
verifyCredentials,
isStillVerified,
};

View File

@@ -1,8 +0,0 @@
import verifyCredentials from './verify-credentials.js';
const isStillVerified = async ($) => {
await verifyCredentials($);
return true;
};
export default isStillVerified;

View File

@@ -1,18 +0,0 @@
const verifyCredentials = async ($) => {
const body = {
query: 'query { me { name, email } }',
};
const { data } = await $.http.post('/', body);
const screenName = [data.data.me.name, data.data.me.email]
.filter(Boolean)
.join(' @ ');
await $.auth.set({
screenName,
apiToken: $.auth.data.apiToken,
});
};
export default verifyCredentials;

View File

@@ -1,9 +0,0 @@
const addAuthHeader = ($, requestConfig) => {
if ($.auth.data?.apiToken) {
requestConfig.headers.Authorization = $.auth.data.apiToken;
}
return requestConfig;
};
export default addAuthHeader;

View File

@@ -1,20 +0,0 @@
import defineApp from '../../helpers/define-app.js';
import addAuthHeader from './common/add-auth-header.js';
import auth from './auth/index.js';
import triggers from './triggers/index.js';
import actions from './actions/index.js';
export default defineApp({
name: 'Monday',
key: 'monday',
iconUrl: '{BASE_URL}/apps/monday/assets/favicon.svg',
authDocUrl: '{DOCS_URL}/apps/monday/connection',
supportsConnections: true,
baseUrl: 'https://monday.com',
apiBaseUrl: 'https://api.monday.com/v2',
primaryColor: 'F62B54',
beforeRequest: [addAuthHeader],
auth,
triggers,
actions,
});

View File

@@ -1,3 +0,0 @@
import newBoards from './new-boards/index.js';
export default [newBoards];

View File

@@ -1,29 +0,0 @@
import defineTrigger from '../../../../helpers/define-trigger.js';
export default defineTrigger({
name: 'New board',
key: 'newBoard',
pollInterval: 15,
description: 'Triggers when a new board is created.',
async run($) {
const body = {
query: 'query { boards { id, name } }',
};
const { data } = await $.http.post('/', body);
if (!data?.data?.boards?.length) {
return;
}
for (const board of data.data.boards) {
$.pushTriggerItem({
raw: board,
meta: {
internalId: board.id,
},
});
}
},
});

View File

@@ -12,7 +12,7 @@ export default defineApp({
baseUrl: 'https://notion.com', baseUrl: 'https://notion.com',
apiBaseUrl: 'https://api.notion.com', apiBaseUrl: 'https://api.notion.com',
iconUrl: '{BASE_URL}/apps/notion/assets/favicon.svg', iconUrl: '{BASE_URL}/apps/notion/assets/favicon.svg',
authDocUrl: '{DOCS_URL}/apps/notion/connection', authDocUrl: 'https://automatisch.io/docs/apps/notion/connection',
primaryColor: '000000', primaryColor: '000000',
supportsConnections: true, supportsConnections: true,
beforeRequest: [addAuthHeader, addNotionVersionHeader], beforeRequest: [addAuthHeader, addNotionVersionHeader],

View File

@@ -7,7 +7,7 @@ export default defineApp({
name: 'Ntfy', name: 'Ntfy',
key: 'ntfy', key: 'ntfy',
iconUrl: '{BASE_URL}/apps/ntfy/assets/favicon.svg', iconUrl: '{BASE_URL}/apps/ntfy/assets/favicon.svg',
authDocUrl: '{DOCS_URL}/apps/ntfy/connection', authDocUrl: 'https://automatisch.io/docs/apps/ntfy/connection',
supportsConnections: true, supportsConnections: true,
baseUrl: 'https://ntfy.sh', baseUrl: 'https://ntfy.sh',
apiBaseUrl: 'https://ntfy.sh', apiBaseUrl: 'https://ntfy.sh',

View File

@@ -6,7 +6,7 @@ export default defineApp({
name: 'Odoo', name: 'Odoo',
key: 'odoo', key: 'odoo',
iconUrl: '{BASE_URL}/apps/odoo/assets/favicon.svg', iconUrl: '{BASE_URL}/apps/odoo/assets/favicon.svg',
authDocUrl: '{DOCS_URL}/apps/odoo/connection', authDocUrl: 'https://automatisch.io/docs/apps/odoo/connection',
supportsConnections: true, supportsConnections: true,
baseUrl: 'https://odoo.com', baseUrl: 'https://odoo.com',
apiBaseUrl: '', apiBaseUrl: '',

View File

@@ -10,7 +10,7 @@ export default defineApp({
baseUrl: 'https://openai.com', baseUrl: 'https://openai.com',
apiBaseUrl: 'https://api.openai.com', apiBaseUrl: 'https://api.openai.com',
iconUrl: '{BASE_URL}/apps/openai/assets/favicon.svg', iconUrl: '{BASE_URL}/apps/openai/assets/favicon.svg',
authDocUrl: '{DOCS_URL}/apps/openai/connection', authDocUrl: 'https://automatisch.io/docs/apps/openai/connection',
primaryColor: '000000', primaryColor: '000000',
supportsConnections: true, supportsConnections: true,
beforeRequest: [addAuthHeader], beforeRequest: [addAuthHeader],

View File

@@ -64,18 +64,33 @@ export default defineAction({
value: '1', value: '1',
description: description:
'The ID of the stage this deal will be added to. If omitted, the deal will be placed in the first stage of the default pipeline.', 'The ID of the stage this deal will be added to. If omitted, the deal will be placed in the first stage of the default pipeline.',
variables: true, options: [
source: {
type: 'query',
name: 'getDynamicData',
arguments: [
{ {
name: 'key', label: 'Qualified (Pipeline)',
value: 'listStages', value: 1,
},
{
label: 'Contact Made (Pipeline)',
value: 2,
},
{
label: 'Prospect Qualified (Pipeline)',
value: 3,
},
{
label: 'Needs Defined (Pipeline)',
value: 4,
},
{
label: 'Proposal Made (Pipeline)',
value: 5,
},
{
label: 'Negotiations Started (Pipeline)',
value: 6,
}, },
], ],
}, },
},
{ {
label: 'Owner', label: 'Owner',
key: 'userId', key: 'userId',

View File

@@ -1,25 +1,23 @@
import listActivityTypes from './list-activity-types/index.js'; import listActivityTypes from './list-activity-types/index.js';
import listCurrencies from './list-currencies/index.js'; import listCurrencies from './list-currencies/index.js';
import listDeals from './list-deals/index.js'; import listDeals from './list-deals/index.js';
import listLeadLabels from './list-lead-labels/index.js';
import listLeads from './list-leads/index.js'; import listLeads from './list-leads/index.js';
import listOrganizationLabelField from './list-organization-label-field/index.js'; import listLeadLabels from './list-lead-labels/index.js';
import listOrganizations from './list-organizations/index.js'; import listOrganizations from './list-organizations/index.js';
import listOrganizationLabelField from './list-organization-label-field/index.js';
import listPersonLabelField from './list-person-label-field/index.js'; import listPersonLabelField from './list-person-label-field/index.js';
import listPersons from './list-persons/index.js'; import listPersons from './list-persons/index.js';
import listStages from './list-stages/index.js';
import listUsers from './list-users/index.js'; import listUsers from './list-users/index.js';
export default [ export default [
listActivityTypes, listActivityTypes,
listCurrencies, listCurrencies,
listDeals, listDeals,
listLeadLabels,
listLeads, listLeads,
listOrganizationLabelField, listLeadLabels,
listOrganizations, listOrganizations,
listOrganizationLabelField,
listPersonLabelField, listPersonLabelField,
listPersons, listPersons,
listStages,
listUsers, listUsers,
]; ];

View File

@@ -1,23 +0,0 @@
export default {
name: 'List stages',
key: 'listStages',
async run($) {
const stages = {
data: [],
};
const { data } = await $.http.get('/api/v1/stages');
if (data.data?.length) {
for (const stage of data.data) {
stages.data.push({
value: stage.id,
name: stage.name,
});
}
}
return stages;
},
};

View File

@@ -12,7 +12,7 @@ export default defineApp({
baseUrl: '', baseUrl: '',
apiBaseUrl: '', apiBaseUrl: '',
iconUrl: '{BASE_URL}/apps/pipedrive/assets/favicon.svg', iconUrl: '{BASE_URL}/apps/pipedrive/assets/favicon.svg',
authDocUrl: '{DOCS_URL}/apps/pipedrive/connection', authDocUrl: 'https://automatisch.io/docs/apps/pipedrive/connection',
primaryColor: 'FFFFFF', primaryColor: 'FFFFFF',
supportsConnections: true, supportsConnections: true,
beforeRequest: [setBaseUrl, addAuthHeader], beforeRequest: [setBaseUrl, addAuthHeader],

View File

@@ -8,7 +8,7 @@ export default defineApp({
name: 'Placetel', name: 'Placetel',
key: 'placetel', key: 'placetel',
iconUrl: '{BASE_URL}/apps/placetel/assets/favicon.svg', iconUrl: '{BASE_URL}/apps/placetel/assets/favicon.svg',
authDocUrl: '{DOCS_URL}/apps/placetel/connection', authDocUrl: 'https://automatisch.io/docs/apps/placetel/connection',
supportsConnections: true, supportsConnections: true,
baseUrl: 'https://placetel.de', baseUrl: 'https://placetel.de',
apiBaseUrl: 'https://api.placetel.de', apiBaseUrl: 'https://api.placetel.de',

View File

@@ -6,7 +6,7 @@ export default defineApp({
name: 'PostgreSQL', name: 'PostgreSQL',
key: 'postgresql', key: 'postgresql',
iconUrl: '{BASE_URL}/apps/postgresql/assets/favicon.svg', iconUrl: '{BASE_URL}/apps/postgresql/assets/favicon.svg',
authDocUrl: '{DOCS_URL}/apps/postgresql/connection', authDocUrl: 'https://automatisch.io/docs/apps/postgresql/connection',
supportsConnections: true, supportsConnections: true,
baseUrl: '', baseUrl: '',
apiBaseUrl: '', apiBaseUrl: '',

View File

@@ -9,7 +9,7 @@ export default defineApp({
baseUrl: 'https://pushover.net', baseUrl: 'https://pushover.net',
apiBaseUrl: 'https://api.pushover.net', apiBaseUrl: 'https://api.pushover.net',
iconUrl: '{BASE_URL}/apps/pushover/assets/favicon.svg', iconUrl: '{BASE_URL}/apps/pushover/assets/favicon.svg',
authDocUrl: '{DOCS_URL}/apps/pushover/connection', authDocUrl: 'https://automatisch.io/docs/apps/pushover/connection',
primaryColor: '249DF1', primaryColor: '249DF1',
supportsConnections: true, supportsConnections: true,
auth, auth,

View File

@@ -10,7 +10,7 @@ export default defineApp({
baseUrl: 'https://www.reddit.com', baseUrl: 'https://www.reddit.com',
apiBaseUrl: 'https://oauth.reddit.com', apiBaseUrl: 'https://oauth.reddit.com',
iconUrl: '{BASE_URL}/apps/reddit/assets/favicon.svg', iconUrl: '{BASE_URL}/apps/reddit/assets/favicon.svg',
authDocUrl: '{DOCS_URL}/apps/reddit/connection', authDocUrl: 'https://automatisch.io/docs/apps/reddit/connection',
primaryColor: 'FF4500', primaryColor: 'FF4500',
supportsConnections: true, supportsConnections: true,
beforeRequest: [addAuthHeader], beforeRequest: [addAuthHeader],

View File

@@ -7,7 +7,7 @@ export default defineApp({
name: 'Remove.bg', name: 'Remove.bg',
key: 'removebg', key: 'removebg',
iconUrl: '{BASE_URL}/apps/removebg/assets/favicon.svg', iconUrl: '{BASE_URL}/apps/removebg/assets/favicon.svg',
authDocUrl: '{DOCS_URL}/apps/removebg/connection', authDocUrl: 'https://automatisch.io/docs/apps/removebg/connection',
supportsConnections: true, supportsConnections: true,
baseUrl: 'https://www.remove.bg', baseUrl: 'https://www.remove.bg',
apiBaseUrl: 'https://api.remove.bg/v1.0', apiBaseUrl: 'https://api.remove.bg/v1.0',

View File

@@ -5,7 +5,7 @@ export default defineApp({
name: 'RSS', name: 'RSS',
key: 'rss', key: 'rss',
iconUrl: '{BASE_URL}/apps/rss/assets/favicon.svg', iconUrl: '{BASE_URL}/apps/rss/assets/favicon.svg',
authDocUrl: '{DOCS_URL}/apps/rss/connection', authDocUrl: 'https://automatisch.io/docs/apps/rss/connection',
supportsConnections: false, supportsConnections: false,
baseUrl: '', baseUrl: '',
apiBaseUrl: '', apiBaseUrl: '',

View File

@@ -9,7 +9,7 @@ export default defineApp({
name: 'Salesforce', name: 'Salesforce',
key: 'salesforce', key: 'salesforce',
iconUrl: '{BASE_URL}/apps/salesforce/assets/favicon.svg', iconUrl: '{BASE_URL}/apps/salesforce/assets/favicon.svg',
authDocUrl: '{DOCS_URL}/connections/salesforce', authDocUrl: 'https://automatisch.io/docs/connections/salesforce',
supportsConnections: true, supportsConnections: true,
baseUrl: 'https://salesforce.com', baseUrl: 'https://salesforce.com',
apiBaseUrl: '', apiBaseUrl: '',

View File

@@ -6,7 +6,7 @@ export default defineApp({
key: 'scheduler', key: 'scheduler',
iconUrl: '{BASE_URL}/apps/scheduler/assets/favicon.svg', iconUrl: '{BASE_URL}/apps/scheduler/assets/favicon.svg',
docUrl: 'https://automatisch.io/docs/scheduler', docUrl: 'https://automatisch.io/docs/scheduler',
authDocUrl: '{DOCS_URL}/apps/scheduler/connection', authDocUrl: 'https://automatisch.io/docs/apps/scheduler/connection',
baseUrl: '', baseUrl: '',
apiBaseUrl: '', apiBaseUrl: '',
primaryColor: '0059F7', primaryColor: '0059F7',

View File

@@ -11,7 +11,7 @@ export default defineApp({
baseUrl: '', baseUrl: '',
apiBaseUrl: '', apiBaseUrl: '',
iconUrl: '{BASE_URL}/apps/self-hosted-llm/assets/favicon.svg', iconUrl: '{BASE_URL}/apps/self-hosted-llm/assets/favicon.svg',
authDocUrl: '{DOCS_URL}/apps/self-hosted-llm/connection', authDocUrl: 'https://automatisch.io/docs/apps/self-hosted-llm/connection',
primaryColor: '000000', primaryColor: '000000',
supportsConnections: true, supportsConnections: true,
beforeRequest: [setBaseUrl, addAuthHeader], beforeRequest: [setBaseUrl, addAuthHeader],

View File

@@ -9,7 +9,7 @@ export default defineApp({
name: 'SignalWire', name: 'SignalWire',
key: 'signalwire', key: 'signalwire',
iconUrl: '{BASE_URL}/apps/signalwire/assets/favicon.svg', iconUrl: '{BASE_URL}/apps/signalwire/assets/favicon.svg',
authDocUrl: '{DOCS_URL}/apps/signalwire/connection', authDocUrl: 'https://automatisch.io/docs/apps/signalwire/connection',
supportsConnections: true, supportsConnections: true,
baseUrl: 'https://signalwire.com', baseUrl: 'https://signalwire.com',
apiBaseUrl: '', apiBaseUrl: '',

View File

@@ -9,7 +9,7 @@ export default defineApp({
name: 'Slack', name: 'Slack',
key: 'slack', key: 'slack',
iconUrl: '{BASE_URL}/apps/slack/assets/favicon.svg', iconUrl: '{BASE_URL}/apps/slack/assets/favicon.svg',
authDocUrl: '{DOCS_URL}/apps/slack/connection', authDocUrl: 'https://automatisch.io/docs/apps/slack/connection',
supportsConnections: true, supportsConnections: true,
baseUrl: 'https://slack.com', baseUrl: 'https://slack.com',
apiBaseUrl: 'https://slack.com/api', apiBaseUrl: 'https://slack.com/api',

View File

@@ -6,7 +6,7 @@ export default defineApp({
name: 'SMTP', name: 'SMTP',
key: 'smtp', key: 'smtp',
iconUrl: '{BASE_URL}/apps/smtp/assets/favicon.svg', iconUrl: '{BASE_URL}/apps/smtp/assets/favicon.svg',
authDocUrl: '{DOCS_URL}/apps/smtp/connection', authDocUrl: 'https://automatisch.io/docs/apps/smtp/connection',
supportsConnections: true, supportsConnections: true,
baseUrl: '', baseUrl: '',
apiBaseUrl: '', apiBaseUrl: '',

View File

@@ -7,7 +7,7 @@ export default defineApp({
name: 'Spotify', name: 'Spotify',
key: 'spotify', key: 'spotify',
iconUrl: '{BASE_URL}/apps/spotify/assets/favicon.svg', iconUrl: '{BASE_URL}/apps/spotify/assets/favicon.svg',
authDocUrl: '{DOCS_URL}/apps/spotify/connection', authDocUrl: 'https://automatisch.io/docs/apps/spotify/connection',
supportsConnections: true, supportsConnections: true,
baseUrl: 'https://spotify.com', baseUrl: 'https://spotify.com',
apiBaseUrl: 'https://api.spotify.com', apiBaseUrl: 'https://api.spotify.com',

View File

@@ -7,7 +7,7 @@ export default defineApp({
name: 'Strava', name: 'Strava',
key: 'strava', key: 'strava',
iconUrl: '{BASE_URL}/apps/strava/assets/favicon.svg', iconUrl: '{BASE_URL}/apps/strava/assets/favicon.svg',
authDocUrl: '{DOCS_URL}/connections/strava', authDocUrl: 'https://automatisch.io/docs/connections/strava',
supportsConnections: true, supportsConnections: true,
baseUrl: 'https://www.strava.com', baseUrl: 'https://www.strava.com',
apiBaseUrl: 'https://www.strava.com/api', apiBaseUrl: 'https://www.strava.com/api',

View File

@@ -7,7 +7,7 @@ export default defineApp({
name: 'Stripe', name: 'Stripe',
key: 'stripe', key: 'stripe',
iconUrl: '{BASE_URL}/apps/stripe/assets/favicon.svg', iconUrl: '{BASE_URL}/apps/stripe/assets/favicon.svg',
authDocUrl: '{DOCS_URL}/apps/stripe/connection', authDocUrl: 'https://automatisch.io/docs/apps/stripe/connection',
supportsConnections: true, supportsConnections: true,
baseUrl: 'https://stripe.com', baseUrl: 'https://stripe.com',
apiBaseUrl: 'https://api.stripe.com', apiBaseUrl: 'https://api.stripe.com',

View File

@@ -7,7 +7,7 @@ export default defineApp({
name: 'Telegram', name: 'Telegram',
key: 'telegram-bot', key: 'telegram-bot',
iconUrl: '{BASE_URL}/apps/telegram-bot/assets/favicon.svg', iconUrl: '{BASE_URL}/apps/telegram-bot/assets/favicon.svg',
authDocUrl: '{DOCS_URL}/apps/telegram-bot/connection', authDocUrl: 'https://automatisch.io/docs/apps/telegram-bot/connection',
supportsConnections: true, supportsConnections: true,
baseUrl: 'https://telegram.org', baseUrl: 'https://telegram.org',
apiBaseUrl: 'https://api.telegram.org', apiBaseUrl: 'https://api.telegram.org',

View File

@@ -9,7 +9,7 @@ export default defineApp({
name: 'Todoist', name: 'Todoist',
key: 'todoist', key: 'todoist',
iconUrl: '{BASE_URL}/apps/todoist/assets/favicon.svg', iconUrl: '{BASE_URL}/apps/todoist/assets/favicon.svg',
authDocUrl: '{DOCS_URL}/apps/todoist/connection', authDocUrl: 'https://automatisch.io/docs/apps/todoist/connection',
supportsConnections: true, supportsConnections: true,
baseUrl: 'https://todoist.com', baseUrl: 'https://todoist.com',
apiBaseUrl: 'https://api.todoist.com/rest/v2', apiBaseUrl: 'https://api.todoist.com/rest/v2',

View File

@@ -10,7 +10,7 @@ export default defineApp({
baseUrl: 'https://trello.com/', baseUrl: 'https://trello.com/',
apiBaseUrl: 'https://api.trello.com', apiBaseUrl: 'https://api.trello.com',
iconUrl: '{BASE_URL}/apps/trello/assets/favicon.svg', iconUrl: '{BASE_URL}/apps/trello/assets/favicon.svg',
authDocUrl: '{DOCS_URL}/apps/trello/connection', authDocUrl: 'https://automatisch.io/docs/apps/trello/connection',
supportsConnections: true, supportsConnections: true,
primaryColor: '0079bf', primaryColor: '0079bf',
beforeRequest: [addAuthHeader], beforeRequest: [addAuthHeader],

View File

@@ -9,7 +9,7 @@ export default defineApp({
name: 'Twilio', name: 'Twilio',
key: 'twilio', key: 'twilio',
iconUrl: '{BASE_URL}/apps/twilio/assets/favicon.svg', iconUrl: '{BASE_URL}/apps/twilio/assets/favicon.svg',
authDocUrl: '{DOCS_URL}/apps/twilio/connection', authDocUrl: 'https://automatisch.io/docs/apps/twilio/connection',
supportsConnections: true, supportsConnections: true,
baseUrl: 'https://twilio.com', baseUrl: 'https://twilio.com',
apiBaseUrl: 'https://api.twilio.com', apiBaseUrl: 'https://api.twilio.com',

View File

@@ -8,7 +8,7 @@ export default defineApp({
name: 'Twitter', name: 'Twitter',
key: 'twitter', key: 'twitter',
iconUrl: '{BASE_URL}/apps/twitter/assets/favicon.svg', iconUrl: '{BASE_URL}/apps/twitter/assets/favicon.svg',
authDocUrl: '{DOCS_URL}/apps/twitter/connection', authDocUrl: 'https://automatisch.io/docs/apps/twitter/connection',
supportsConnections: true, supportsConnections: true,
baseUrl: 'https://twitter.com', baseUrl: 'https://twitter.com',
apiBaseUrl: 'https://api.twitter.com', apiBaseUrl: 'https://api.twitter.com',

View File

@@ -8,7 +8,7 @@ export default defineApp({
name: 'Typeform', name: 'Typeform',
key: 'typeform', key: 'typeform',
iconUrl: '{BASE_URL}/apps/typeform/assets/favicon.svg', iconUrl: '{BASE_URL}/apps/typeform/assets/favicon.svg',
authDocUrl: '{DOCS_URL}/apps/typeform/connection', authDocUrl: 'https://automatisch.io/docs/apps/typeform/connection',
supportsConnections: true, supportsConnections: true,
baseUrl: 'https://typeform.com', baseUrl: 'https://typeform.com',
apiBaseUrl: 'https://api.typeform.com', apiBaseUrl: 'https://api.typeform.com',

View File

@@ -1,3 +0,0 @@
import respondWith from './respond-with/index.js';
export default [respondWith];

View File

@@ -1,69 +0,0 @@
import defineAction from '../../../../helpers/define-action.js';
export default defineAction({
name: 'Respond with',
key: 'respondWith',
description: 'Respond with defined JSON body.',
arguments: [
{
label: 'Status code',
key: 'statusCode',
type: 'string',
required: true,
variables: true,
value: '200',
},
{
label: 'Headers',
key: 'headers',
type: 'dynamic',
required: false,
description: 'Add or remove headers as needed',
fields: [
{
label: 'Key',
key: 'key',
type: 'string',
required: true,
description: 'Header key',
variables: true,
},
{
label: 'Value',
key: 'value',
type: 'string',
required: true,
description: 'Header value',
variables: true,
},
],
},
{
label: 'Body',
key: 'body',
type: 'string',
required: true,
description: 'The content of the response body.',
variables: true,
},
],
async run($) {
const statusCode = parseInt($.step.parameters.statusCode, 10);
const body = $.step.parameters.body;
const headers = $.step.parameters.headers.reduce((result, entry) => {
return {
...result,
[entry.key]: entry.value,
};
}, {});
$.setActionItem({
raw: {
headers,
body,
statusCode,
},
});
},
});

View File

@@ -1,16 +1,14 @@
import defineApp from '../../helpers/define-app.js'; import defineApp from '../../helpers/define-app.js';
import actions from './actions/index.js';
import triggers from './triggers/index.js'; import triggers from './triggers/index.js';
export default defineApp({ export default defineApp({
name: 'Webhook', name: 'Webhook',
key: 'webhook', key: 'webhook',
iconUrl: '{BASE_URL}/apps/webhook/assets/favicon.svg', iconUrl: '{BASE_URL}/apps/webhook/assets/favicon.svg',
authDocUrl: '{DOCS_URL}/apps/webhook/connection', authDocUrl: 'https://automatisch.io/docs/apps/webhook/connection',
supportsConnections: false, supportsConnections: false,
baseUrl: '', baseUrl: '',
apiBaseUrl: '', apiBaseUrl: '',
primaryColor: '0059F7', primaryColor: '0059F7',
actions,
triggers, triggers,
}); });

View File

@@ -7,20 +7,7 @@ export default defineTrigger({
key: 'catchRawWebhook', key: 'catchRawWebhook',
type: 'webhook', type: 'webhook',
showWebhookUrl: true, showWebhookUrl: true,
description: description: 'Triggers when the webhook receives a request.',
'Triggers (immediately if configured) when the webhook receives a request.',
arguments: [
{
label: 'Wait until flow is done',
key: 'workSynchronously',
type: 'dropdown',
required: true,
options: [
{ label: 'Yes', value: true },
{ label: 'No', value: false },
],
},
],
async run($) { async run($) {
const dataItem = { const dataItem = {

View File

@@ -9,7 +9,7 @@ export default defineApp({
name: 'WordPress', name: 'WordPress',
key: 'wordpress', key: 'wordpress',
iconUrl: '{BASE_URL}/apps/wordpress/assets/favicon.svg', iconUrl: '{BASE_URL}/apps/wordpress/assets/favicon.svg',
authDocUrl: '{DOCS_URL}/apps/wordpress/connection', authDocUrl: 'https://automatisch.io/docs/apps/wordpress/connection',
supportsConnections: true, supportsConnections: true,
baseUrl: 'https://wordpress.com', baseUrl: 'https://wordpress.com',
apiBaseUrl: '', apiBaseUrl: '',

View File

@@ -10,7 +10,7 @@ export default defineApp({
baseUrl: 'https://go.xero.com', baseUrl: 'https://go.xero.com',
apiBaseUrl: 'https://api.xero.com', apiBaseUrl: 'https://api.xero.com',
iconUrl: '{BASE_URL}/apps/xero/assets/favicon.svg', iconUrl: '{BASE_URL}/apps/xero/assets/favicon.svg',
authDocUrl: '{DOCS_URL}/apps/xero/connection', authDocUrl: 'https://automatisch.io/docs/apps/xero/connection',
primaryColor: '13B5EA', primaryColor: '13B5EA',
supportsConnections: true, supportsConnections: true,
beforeRequest: [addAuthHeader], beforeRequest: [addAuthHeader],

View File

@@ -9,7 +9,7 @@ export default defineApp({
baseUrl: 'https://www.youtube.com/', baseUrl: 'https://www.youtube.com/',
apiBaseUrl: 'https://www.googleapis.com/youtube', apiBaseUrl: 'https://www.googleapis.com/youtube',
iconUrl: '{BASE_URL}/apps/youtube/assets/favicon.svg', iconUrl: '{BASE_URL}/apps/youtube/assets/favicon.svg',
authDocUrl: '{DOCS_URL}/apps/youtube/connection', authDocUrl: 'https://automatisch.io/docs/apps/youtube/connection',
primaryColor: 'FF0000', primaryColor: 'FF0000',
supportsConnections: true, supportsConnections: true,
beforeRequest: [addAuthHeader], beforeRequest: [addAuthHeader],

View File

@@ -11,7 +11,7 @@ export default defineApp({
baseUrl: 'https://zendesk.com/', baseUrl: 'https://zendesk.com/',
apiBaseUrl: '', apiBaseUrl: '',
iconUrl: '{BASE_URL}/apps/zendesk/assets/favicon.svg', iconUrl: '{BASE_URL}/apps/zendesk/assets/favicon.svg',
authDocUrl: '{DOCS_URL}/apps/zendesk/connection', authDocUrl: 'https://automatisch.io/docs/apps/zendesk/connection',
primaryColor: '17494d', primaryColor: '17494d',
supportsConnections: true, supportsConnections: true,
beforeRequest: [addAuthHeader], beforeRequest: [addAuthHeader],

View File

@@ -38,9 +38,6 @@ if (process.env.WEB_APP_URL) {
let webhookUrl = new URL(process.env.WEBHOOK_URL || apiUrl).toString(); let webhookUrl = new URL(process.env.WEBHOOK_URL || apiUrl).toString();
webhookUrl = webhookUrl.substring(0, webhookUrl.length - 1); webhookUrl = webhookUrl.substring(0, webhookUrl.length - 1);
const publicDocsUrl = 'https://automatisch.io/docs';
const docsUrl = process.env.DOCS_URL || publicDocsUrl;
const appEnv = process.env.APP_ENV || 'development'; const appEnv = process.env.APP_ENV || 'development';
const appConfig = { const appConfig = {
@@ -76,7 +73,6 @@ const appConfig = {
baseUrl: apiUrl, baseUrl: apiUrl,
webAppUrl, webAppUrl,
webhookUrl, webhookUrl,
docsUrl,
telemetryEnabled: process.env.TELEMETRY_ENABLED === 'false' ? false : true, telemetryEnabled: process.env.TELEMETRY_ENABLED === 'false' ? false : true,
requestBodySizeLimit: '1mb', requestBodySizeLimit: '1mb',
smtpHost: process.env.SMTP_HOST, smtpHost: process.env.SMTP_HOST,
@@ -98,6 +94,8 @@ const appConfig = {
disableFavicon: process.env.DISABLE_FAVICON === 'true', disableFavicon: process.env.DISABLE_FAVICON === 'true',
additionalDrawerLink: process.env.ADDITIONAL_DRAWER_LINK, additionalDrawerLink: process.env.ADDITIONAL_DRAWER_LINK,
additionalDrawerLinkText: process.env.ADDITIONAL_DRAWER_LINK_TEXT, additionalDrawerLinkText: process.env.ADDITIONAL_DRAWER_LINK_TEXT,
seedUserEmail: process.env.SEED_USER_EMAIL || 'user@automatisch.io',
seedUserPassword: process.env.SEED_USER_PASSWORD || 'sample',
}; };
if (!appConfig.encryptionKey) { if (!appConfig.encryptionKey) {

View File

@@ -2,7 +2,7 @@ import appConfig from './app.js';
const corsOptions = { const corsOptions = {
origin: appConfig.webAppUrl, origin: appConfig.webAppUrl,
methods: 'GET,HEAD,POST,DELETE', methods: 'POST',
credentials: true, credentials: true,
optionsSuccessStatus: 200, optionsSuccessStatus: 200,
}; };

View File

@@ -1,13 +0,0 @@
import User from '../../../../models/user.js';
import { renderObject, renderError } from '../../../../helpers/renderer.js';
export default async (request, response) => {
const { email, password } = request.body;
const token = await User.authenticate(email, password);
if (token) {
return renderObject(response, { token });
}
renderError(response, [{ general: ['Incorrect email or password.'] }]);
};

View File

@@ -1,39 +0,0 @@
import { describe, it, expect, beforeEach } from 'vitest';
import request from 'supertest';
import app from '../../../../app.js';
import { createUser } from '../../../../../test/factories/user';
describe('POST /api/v1/access-tokens', () => {
beforeEach(async () => {
await createUser({
email: 'user@automatisch.io',
password: 'password',
});
});
it('should return the token data with correct credentials', async () => {
const response = await request(app)
.post('/api/v1/access-tokens')
.send({
email: 'user@automatisch.io',
password: 'password',
})
.expect(200);
expect(response.body.data.token.length).toBeGreaterThan(0);
});
it('should return error with incorrect credentials', async () => {
const response = await request(app)
.post('/api/v1/access-tokens')
.send({
email: 'incorrect@email.com',
password: 'incorrectpassword',
})
.expect(422);
expect(response.body.errors.general).toEqual([
'Incorrect email or password.',
]);
});
});

View File

@@ -1,15 +0,0 @@
export default async (request, response) => {
const token = request.params.token;
const accessToken = await request.currentUser
.$relatedQuery('accessTokens')
.findOne({
token,
revoked_at: null,
})
.throwIfNotFound();
await accessToken.revoke();
response.status(204).send();
};

View File

@@ -1,54 +0,0 @@
import { expect, describe, it, beforeEach } from 'vitest';
import request from 'supertest';
import app from '../../../../app.js';
import createAuthTokenByUserId from '../../../../helpers/create-auth-token-by-user-id';
import { createUser } from '../../../../../test/factories/user.js';
import AccessToken from '../../../../models/access-token.js';
describe('DELETE /api/v1/access-tokens/:token', () => {
let token;
beforeEach(async () => {
const currentUser = await createUser({
email: 'user@automatisch.io',
password: 'password',
});
token = await createAuthTokenByUserId(currentUser.id);
});
it('should respond with HTTP 204 with correct token', async () => {
await request(app)
.delete(`/api/v1/access-tokens/${token}`)
.set('Authorization', token)
.expect(204);
const revokedToken = await AccessToken.query().findOne({ token });
expect(revokedToken).toBeDefined();
expect(revokedToken.revokedAt).not.toBeNull();
});
it('should respond with HTTP 401 with incorrect credentials', async () => {
await request(app)
.delete(`/api/v1/access-tokens/${token}`)
.set('Authorization', 'wrong-token')
.expect(401);
const unrevokedToken = await AccessToken.query().findOne({ token });
expect(unrevokedToken).toBeDefined();
expect(unrevokedToken.revokedAt).toBeNull();
});
it('should respond with HTTP 404 with correct credentials, but non-valid token', async () => {
await request(app)
.delete('/api/v1/access-tokens/wrong-token')
.set('Authorization', token)
.expect(404);
const unrevokedToken = await AccessToken.query().findOne({ token });
expect(unrevokedToken).toBeDefined();
expect(unrevokedToken.revokedAt).toBeNull();
});
});

View File

@@ -4,7 +4,6 @@ import AppAuthClient from '../../../../../models/app-auth-client.js';
export default async (request, response) => { export default async (request, response) => {
const appAuthClient = await AppAuthClient.query() const appAuthClient = await AppAuthClient.query()
.findById(request.params.appAuthClientId) .findById(request.params.appAuthClientId)
.where({ app_key: request.params.appKey })
.throwIfNotFound(); .throwIfNotFound();
renderObject(response, appAuthClient); renderObject(response, appAuthClient);

View File

@@ -0,0 +1,52 @@
import { vi, describe, it, expect, beforeEach } from 'vitest';
import request from 'supertest';
import Crypto from 'crypto';
import app from '../../../../../app.js';
import createAuthTokenByUserId from '../../../../../helpers/create-auth-token-by-user-id.js';
import { createUser } from '../../../../../../test/factories/user.js';
import getAdminAppAuthClientMock from '../../../../../../test/mocks/rest/api/v1/admin/get-app-auth-client.js';
import { createAppAuthClient } from '../../../../../../test/factories/app-auth-client.js';
import { createRole } from '../../../../../../test/factories/role.js';
import * as license from '../../../../../helpers/license.ee.js';
describe('GET /api/v1/admin/app-auth-clients/:appAuthClientId', () => {
let currentUser, currentUserRole, currentAppAuthClient, token;
describe('with valid license key', () => {
beforeEach(async () => {
vi.spyOn(license, 'hasValidLicense').mockResolvedValue(true);
currentUserRole = await createRole({ key: 'admin' });
currentUser = await createUser({ roleId: currentUserRole.id });
currentAppAuthClient = await createAppAuthClient();
token = createAuthTokenByUserId(currentUser.id);
});
it('should return specified app auth client info', async () => {
const response = await request(app)
.get(`/api/v1/admin/app-auth-clients/${currentAppAuthClient.id}`)
.set('Authorization', token)
.expect(200);
const expectedPayload = getAdminAppAuthClientMock(currentAppAuthClient);
expect(response.body).toEqual(expectedPayload);
});
it('should return not found response for not existing app auth client UUID', async () => {
const notExistingAppAuthClientUUID = Crypto.randomUUID();
await request(app)
.get(`/api/v1/admin/app-auth-clients/${notExistingAppAuthClientUUID}`)
.set('Authorization', token)
.expect(404);
});
it('should return bad request response for invalid UUID', async () => {
await request(app)
.get('/api/v1/admin/app-auth-clients/invalidAppAuthClientUUID')
.set('Authorization', token)
.expect(400);
});
});
});

View File

@@ -1,55 +0,0 @@
import { vi, describe, it, expect, beforeEach } from 'vitest';
import request from 'supertest';
import Crypto from 'crypto';
import app from '../../../../../app.js';
import createAuthTokenByUserId from '../../../../../helpers/create-auth-token-by-user-id.js';
import { createUser } from '../../../../../../test/factories/user.js';
import { createRole } from '../../../../../../test/factories/role.js';
import getAppAuthClientMock from '../../../../../../test/mocks/rest/api/v1/admin/apps/get-auth-client.js';
import { createAppAuthClient } from '../../../../../../test/factories/app-auth-client.js';
import * as license from '../../../../../helpers/license.ee.js';
describe('GET /api/v1/admin/apps/:appKey/auth-clients/:appAuthClientId', () => {
let currentUser, adminRole, currentAppAuthClient, token;
beforeEach(async () => {
vi.spyOn(license, 'hasValidLicense').mockResolvedValue(true);
adminRole = await createRole({ key: 'admin' });
currentUser = await createUser({ roleId: adminRole.id });
currentAppAuthClient = await createAppAuthClient({
appKey: 'deepl',
});
token = await createAuthTokenByUserId(currentUser.id);
});
it('should return specified app auth client', async () => {
const response = await request(app)
.get(`/api/v1/admin/apps/deepl/auth-clients/${currentAppAuthClient.id}`)
.set('Authorization', token)
.expect(200);
const expectedPayload = getAppAuthClientMock(currentAppAuthClient);
expect(response.body).toEqual(expectedPayload);
});
it('should return not found response for not existing app auth client ID', async () => {
const notExistingAppAuthClientUUID = Crypto.randomUUID();
await request(app)
.get(
`/api/v1/admin/apps/deepl/auth-clients/${notExistingAppAuthClientUUID}`
)
.set('Authorization', token)
.expect(404);
});
it('should return bad request response for invalid UUID', async () => {
await request(app)
.get('/api/v1/admin/apps/deepl/auth-clients/invalidAppAuthClientUUID')
.set('Authorization', token)
.expect(400);
});
});

View File

@@ -1,10 +0,0 @@
import { renderObject } from '../../../../../helpers/renderer.js';
import AppAuthClient from '../../../../../models/app-auth-client.js';
export default async (request, response) => {
const appAuthClients = await AppAuthClient.query()
.where({ app_key: request.params.appKey })
.orderBy('created_at', 'desc');
renderObject(response, appAuthClients);
};

View File

@@ -1,44 +0,0 @@
import { vi, describe, it, expect, beforeEach } from 'vitest';
import request from 'supertest';
import app from '../../../../../app.js';
import createAuthTokenByUserId from '../../../../../helpers/create-auth-token-by-user-id.js';
import { createUser } from '../../../../../../test/factories/user.js';
import { createRole } from '../../../../../../test/factories/role.js';
import getAuthClientsMock from '../../../../../../test/mocks/rest/api/v1/admin/apps/get-auth-clients.js';
import { createAppAuthClient } from '../../../../../../test/factories/app-auth-client.js';
import * as license from '../../../../../helpers/license.ee.js';
describe('GET /api/v1/admin/apps/:appKey/auth-clients', () => {
let currentUser, adminRole, token;
beforeEach(async () => {
vi.spyOn(license, 'hasValidLicense').mockResolvedValue(true);
adminRole = await createRole({ key: 'admin' });
currentUser = await createUser({ roleId: adminRole.id });
token = await createAuthTokenByUserId(currentUser.id);
});
it('should return specified app auth client info', async () => {
const appAuthClientOne = await createAppAuthClient({
appKey: 'deepl',
});
const appAuthClientTwo = await createAppAuthClient({
appKey: 'deepl',
});
const response = await request(app)
.get('/api/v1/admin/apps/deepl/auth-clients')
.set('Authorization', token)
.expect(200);
const expectedPayload = getAuthClientsMock([
appAuthClientTwo,
appAuthClientOne,
]);
expect(response.body).toEqual(expectedPayload);
});
});

View File

@@ -14,7 +14,7 @@ describe('GET /api/v1/admin/permissions/catalog', () => {
role = await createRole({ key: 'admin' }); role = await createRole({ key: 'admin' });
currentUser = await createUser({ roleId: role.id }); currentUser = await createUser({ roleId: role.id });
token = await createAuthTokenByUserId(currentUser.id); token = createAuthTokenByUserId(currentUser.id);
}); });
it('should return roles', async () => { it('should return roles', async () => {

View File

@@ -18,7 +18,7 @@ describe('GET /api/v1/admin/roles/:roleId', () => {
permissionTwo = await createPermission({ roleId: role.id }); permissionTwo = await createPermission({ roleId: role.id });
currentUser = await createUser({ roleId: role.id }); currentUser = await createUser({ roleId: role.id });
token = await createAuthTokenByUserId(currentUser.id); token = createAuthTokenByUserId(currentUser.id);
}); });
it('should return role', async () => { it('should return role', async () => {

View File

@@ -15,7 +15,7 @@ describe('GET /api/v1/admin/roles', () => {
roleTwo = await createRole({ key: 'user' }); roleTwo = await createRole({ key: 'user' });
currentUser = await createUser({ roleId: roleOne.id }); currentUser = await createUser({ roleId: roleOne.id });
token = await createAuthTokenByUserId(currentUser.id); token = createAuthTokenByUserId(currentUser.id);
}); });
it('should return roles', async () => { it('should return roles', async () => {

View File

@@ -1,14 +0,0 @@
import { renderObject } from '../../../../../helpers/renderer.js';
import SamlAuthProvider from '../../../../../models/saml-auth-provider.ee.js';
export default async (request, response) => {
const samlAuthProvider = await SamlAuthProvider.query()
.findById(request.params.samlAuthProviderId)
.throwIfNotFound();
const roleMappings = await samlAuthProvider
.$relatedQuery('samlAuthProvidersRoleMappings')
.orderBy('remote_role_name', 'asc');
renderObject(response, roleMappings);
};

View File

@@ -1,51 +0,0 @@
import { vi, describe, it, expect, beforeEach } from 'vitest';
import request from 'supertest';
import app from '../../../../../app.js';
import createAuthTokenByUserId from '../../../../../helpers/create-auth-token-by-user-id.js';
import { createRole } from '../../../../../../test/factories/role.js';
import { createUser } from '../../../../../../test/factories/user.js';
import { createSamlAuthProvider } from '../../../../../../test/factories/saml-auth-provider.ee.js';
import { createRoleMapping } from '../../../../../../test/factories/role-mapping.js';
import getRoleMappingsMock from '../../../../../../test/mocks/rest/api/v1/admin/saml-auth-providers/get-role-mappings.ee.js';
import * as license from '../../../../../helpers/license.ee.js';
describe('GET /api/v1/admin/saml-auth-providers/:samlAuthProviderId/role-mappings', () => {
let roleMappingOne, roleMappingTwo, samlAuthProvider, currentUser, token;
beforeEach(async () => {
const role = await createRole({ key: 'admin' });
currentUser = await createUser({ roleId: role.id });
samlAuthProvider = await createSamlAuthProvider();
roleMappingOne = await createRoleMapping({
samlAuthProviderId: samlAuthProvider.id,
remoteRoleName: 'Admin',
});
roleMappingTwo = await createRoleMapping({
samlAuthProviderId: samlAuthProvider.id,
remoteRoleName: 'User',
});
token = await createAuthTokenByUserId(currentUser.id);
});
it('should return role mappings', async () => {
vi.spyOn(license, 'hasValidLicense').mockResolvedValue(true);
const response = await request(app)
.get(
`/api/v1/admin/saml-auth-providers/${samlAuthProvider.id}/role-mappings`
)
.set('Authorization', token)
.expect(200);
const expectedPayload = await getRoleMappingsMock([
roleMappingOne,
roleMappingTwo,
]);
expect(response.body).toEqual(expectedPayload);
});
});

View File

@@ -6,7 +6,5 @@ export default async (request, response) => {
.findById(request.params.samlAuthProviderId) .findById(request.params.samlAuthProviderId)
.throwIfNotFound(); .throwIfNotFound();
renderObject(response, samlAuthProvider, { renderObject(response, samlAuthProvider);
serializer: 'AdminSamlAuthProvider',
});
}; };

View File

@@ -17,7 +17,7 @@ describe('GET /api/v1/admin/saml-auth-provider/:samlAuthProviderId', () => {
currentUser = await createUser({ roleId: role.id }); currentUser = await createUser({ roleId: role.id });
samlAuthProvider = await createSamlAuthProvider(); samlAuthProvider = await createSamlAuthProvider();
token = await createAuthTokenByUserId(currentUser.id); token = createAuthTokenByUserId(currentUser.id);
}); });
it('should return saml auth provider with specified id', async () => { it('should return saml auth provider with specified id', async () => {

View File

@@ -7,7 +7,5 @@ export default async (request, response) => {
'desc' 'desc'
); );
renderObject(response, samlAuthProviders, { renderObject(response, samlAuthProviders);
serializer: 'AdminSamlAuthProvider',
});
}; };

View File

@@ -18,7 +18,7 @@ describe('GET /api/v1/admin/saml-auth-providers', () => {
samlAuthProviderOne = await createSamlAuthProvider(); samlAuthProviderOne = await createSamlAuthProvider();
samlAuthProviderTwo = await createSamlAuthProvider(); samlAuthProviderTwo = await createSamlAuthProvider();
token = await createAuthTokenByUserId(currentUser.id); token = createAuthTokenByUserId(currentUser.id);
}); });
it('should return saml auth providers', async () => { it('should return saml auth providers', async () => {

View File

@@ -18,7 +18,7 @@ describe('GET /api/v1/admin/users/:userId', () => {
anotherUser = await createUser(); anotherUser = await createUser();
anotherUserRole = await anotherUser.$relatedQuery('role'); anotherUserRole = await anotherUser.$relatedQuery('role');
token = await createAuthTokenByUserId(currentUser.id); token = createAuthTokenByUserId(currentUser.id);
}); });
it('should return specified user info', async () => { it('should return specified user info', async () => {

View File

@@ -28,7 +28,7 @@ describe('GET /api/v1/admin/users', () => {
fullName: 'Another User', fullName: 'Another User',
}); });
token = await createAuthTokenByUserId(currentUser.id); token = createAuthTokenByUserId(currentUser.id);
}); });
it('should return users data', async () => { it('should return users data', async () => {

Some files were not shown because too many files have changed in this diff Show More