Compare commits

..

3 Commits

Author SHA1 Message Date
Rıdvan Akca
77f84944c7 feat(better-stack): add acknowledge incident action 2024-01-16 12:37:41 +03:00
Rıdvan Akca
8a8be21d56 test: make better stack first when creating a connection 2024-01-16 12:37:06 +03:00
Rıdvan Akca
e5c4e18fd5 feat(better-stack): add better stack integration 2024-01-16 12:37:06 +03:00
805 changed files with 10487 additions and 13926 deletions

View File

@@ -28,7 +28,7 @@ cd packages/web
rm -rf .env rm -rf .env
echo " echo "
PORT=$WEB_PORT PORT=$WEB_PORT
REACT_APP_BACKEND_URL=http://localhost:$BACKEND_PORT REACT_APP_GRAPHQL_URL=http://localhost:$BACKEND_PORT/graphql
" >> .env " >> .env
cd $CURRENT_DIR cd $CURRENT_DIR

View File

@@ -8,7 +8,7 @@
"version": "latest" "version": "latest"
}, },
"ghcr.io/devcontainers/features/node:1": { "ghcr.io/devcontainers/features/node:1": {
"version": 18 "version": 16
}, },
"ghcr.io/devcontainers/features/common-utils:1": { "ghcr.io/devcontainers/features/common-utils:1": {
"username": "vscode", "username": "vscode",

18
.eslintrc.js Normal file
View File

@@ -0,0 +1,18 @@
module.exports = {
root: true,
parser: '@typescript-eslint/parser',
plugins: ['@typescript-eslint'],
extends: [
'eslint:recommended',
'plugin:@typescript-eslint/recommended',
'prettier',
],
overrides: [
{
files: ['**/*.test.ts', '**/test/**/*.ts'],
rules: {
'@typescript-eslint/ban-ts-comment': ['off'],
},
},
],
};

View File

@@ -22,7 +22,7 @@ jobs:
- run: echo "💡 The ${{ github.repository }} repository has been cloned to the runner." - run: echo "💡 The ${{ github.repository }} repository has been cloned to the runner."
- run: echo "🖥️ The workflow is now ready to test your code on the runner." - run: echo "🖥️ The workflow is now ready to test your code on the runner."
- run: yarn --frozen-lockfile - run: yarn --frozen-lockfile
- run: cd packages/backend && yarn lint - run: yarn lint
- run: echo "🍏 This job's status is ${{ job.status }}." - run: echo "🍏 This job's status is ${{ job.status }}."
start-backend-server: start-backend-server:
runs-on: ubuntu-latest runs-on: ubuntu-latest

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

@@ -62,9 +62,8 @@ jobs:
run: yarn && yarn lerna bootstrap run: yarn && yarn lerna bootstrap
- name: Install Playwright Browsers - name: Install Playwright Browsers
run: yarn playwright install --with-deps run: yarn playwright install --with-deps
- name: Build Automatisch web - name: Build Automatisch
working-directory: ./packages/web run: yarn lerna run --scope=@*/{web,cli} build
run: yarn build
env: env:
# Keep this until we clean up warnings in build processes # Keep this until we clean up warnings in build processes
CI: false CI: false

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

@@ -6,6 +6,7 @@
"start": "lerna run --stream --parallel --scope=@*/{web,backend} dev", "start": "lerna run --stream --parallel --scope=@*/{web,backend} dev",
"start:web": "lerna run --stream --scope=@*/web dev", "start:web": "lerna run --stream --scope=@*/web dev",
"start:backend": "lerna run --stream --scope=@*/backend dev", "start:backend": "lerna run --stream --scope=@*/backend dev",
"lint": "lerna run --no-bail --stream --parallel --scope=@*/{web,backend} lint",
"build:docs": "cd ./packages/docs && yarn install && yarn build" "build:docs": "cd ./packages/docs && yarn install && yarn build"
}, },
"workspaces": { "workspaces": {
@@ -20,6 +21,8 @@
] ]
}, },
"devDependencies": { "devDependencies": {
"@typescript-eslint/eslint-plugin": "^5.9.1",
"@typescript-eslint/parser": "^5.9.1",
"eslint": "^8.13.0", "eslint": "^8.13.0",
"eslint-config-prettier": "^8.3.0", "eslint-config-prettier": "^8.3.0",
"eslint-plugin-prettier": "^4.0.0", "eslint-plugin-prettier": "^4.0.0",

View File

@@ -11,7 +11,7 @@
"start:worker": "node src/worker.js", "start:worker": "node src/worker.js",
"pretest": "APP_ENV=test node ./test/setup/prepare-test-env.js", "pretest": "APP_ENV=test node ./test/setup/prepare-test-env.js",
"test": "APP_ENV=test vitest run", "test": "APP_ENV=test vitest run",
"lint": "eslint .", "lint": "eslint . --ignore-path ../../.eslintignore",
"db:create": "node ./bin/database/create.js", "db:create": "node ./bin/database/create.js",
"db:seed:user": "node ./bin/database/seed-user.js", "db:seed:user": "node ./bin/database/seed-user.js",
"db:drop": "node ./bin/database/drop.js", "db:drop": "node ./bin/database/drop.js",
@@ -31,20 +31,21 @@
"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",
"copyfiles": "^2.4.1",
"cors": "^2.8.5", "cors": "^2.8.5",
"crypto-js": "^4.1.1", "crypto-js": "^4.1.1",
"debug": "~2.6.9", "debug": "~2.6.9",
"dotenv": "^10.0.0", "dotenv": "^10.0.0",
"express": "~4.18.2", "express": "~4.18.2",
"express-async-handler": "^1.2.0",
"express-basic-auth": "^1.2.1", "express-basic-auth": "^1.2.1",
"express-graphql": "^0.12.0", "express-graphql": "^0.12.0",
"fast-xml-parser": "^4.0.11", "fast-xml-parser": "^4.0.11",
"graphql-middleware": "^6.1.15", "graphql-middleware": "^6.1.15",
"graphql-shield": "^7.5.0", "graphql-shield": "^7.5.0",
"graphql-tools": "^8.2.0", "graphql-tools": "^8.2.0",
"graphql-type-json": "^0.3.2",
"handlebars": "^4.7.7", "handlebars": "^4.7.7",
"http-errors": "~1.6.3", "http-errors": "~1.6.3",
"http-proxy-agent": "^7.0.0", "http-proxy-agent": "^7.0.0",
@@ -67,6 +68,7 @@
"pluralize": "^8.0.0", "pluralize": "^8.0.0",
"raw-body": "^2.5.2", "raw-body": "^2.5.2",
"showdown": "^2.1.0", "showdown": "^2.1.0",
"stripe": "^11.13.0",
"winston": "^3.7.1", "winston": "^3.7.1",
"xmlrpc": "^1.3.2" "xmlrpc": "^1.3.2"
}, },
@@ -95,7 +97,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

@@ -0,0 +1,43 @@
import defineAction from '../../../../helpers/define-action.js';
export default defineAction({
name: 'Acknowledge incident',
key: 'acknowledgeIncident',
description: 'Acknowledges an incident.',
arguments: [
{
label: 'Incident ID',
key: 'incidentId',
type: 'string',
required: true,
variables: true,
description:
'This serves as the incident ID that requires your acknowledgment.',
},
{
label: 'Acknowledged by',
key: 'acknowledgedBy',
type: 'string',
required: false,
variables: true,
description:
"This refers to the individual's name, email, or another form of identification that the person who acknowledged the incident has provided.",
},
],
async run($) {
const acknowledgedBy = $.step.parameters.acknowledgedBy;
const incidentId = $.step.parameters.incidentId;
const body = {
acknowledged_by: acknowledgedBy,
};
const response = await $.http.post(
`/v2/incidents/${incidentId}/acknowledge`,
body
);
$.setActionItem({ raw: response.data.data });
},
});

View File

@@ -0,0 +1,3 @@
import acknowledgeIncident from './acknowledge-incident/index.js';
export default [acknowledgeIncident];

View File

@@ -0,0 +1,21 @@
<?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="200.000000pt" height="200.000000pt" viewBox="0 0 200.000000 200.000000"
preserveAspectRatio="xMidYMid meet">
<g transform="translate(0.000000,200.000000) scale(0.100000,-0.100000)"
fill="#000" stroke="none">
<path d="M0 1000 l0 -1000 1000 0 1000 0 0 1000 0 1000 -1000 0 -1000 0 0
-1000z m1162 460 c14 -11 113 -184 232 -408 228 -429 231 -439 175 -486 -35
-30 -30 -29 -140 -15 -89 12 -123 25 -152 56 -9 11 -72 147 -140 304 -113 263
-124 284 -149 287 -14 2 -29 10 -32 17 -8 21 67 214 94 242 28 29 78 30 112 3z
m-340 -148 c10 -10 72 -175 139 -367 114 -325 121 -351 108 -374 -8 -14 -27
-32 -41 -41 -25 -13 -34 -12 -126 18 -55 18 -111 43 -125 56 -19 17 -40 67
-76 182 -36 112 -58 164 -73 176 l-22 16 27 99 c63 224 66 232 95 248 31 17
69 12 94 -13z m-314 -219 c16 -15 26 -59 56 -243 42 -262 43 -285 17 -300 -11
-5 -24 -10 -30 -10 -19 0 -140 114 -150 141 -7 20 -4 76 10 191 10 90 19 171
19 181 0 18 33 57 49 57 5 0 18 -8 29 -17z"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

View File

@@ -0,0 +1,33 @@
import verifyCredentials from './verify-credentials.js';
import isStillVerified from './is-still-verified.js';
export default {
fields: [
{
key: 'screenName',
label: 'Screen Name',
type: 'string',
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',
required: true,
readOnly: false,
value: null,
placeholder: null,
description: 'Better Stack API key of your account.',
clickToCopy: false,
},
],
verifyCredentials,
isStillVerified,
};

View File

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

View File

@@ -0,0 +1,10 @@
const verifyCredentials = async ($) => {
await $.http.get('/v2/metadata');
await $.auth.set({
screenName: $.auth.data.screenName,
apiKey: $.auth.data.apiKey,
});
};
export default verifyCredentials;

View File

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

View File

@@ -0,0 +1,18 @@
import defineApp from '../../helpers/define-app.js';
import addAuthHeader from './common/add-auth-header.js';
import auth from './auth/index.js';
import actions from './actions/index.js';
export default defineApp({
name: 'Better Stack',
key: 'better-stack',
iconUrl: '{BASE_URL}/apps/better-stack/assets/favicon.svg',
authDocUrl: 'https://automatisch.io/docs/apps/better-stack/connection',
supportsConnections: true,
baseUrl: 'https://betterstack.com',
apiBaseUrl: 'https://uptime.betterstack.com/api',
primaryColor: '000000',
beforeRequest: [addAuthHeader],
auth,
actions,
});

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

@@ -1,27 +0,0 @@
import defineAction from '../../../../helpers/define-action.js';
export default defineAction({
name: 'Get value',
key: 'getValue',
description: 'Get value from the persistent datastore.',
arguments: [
{
label: 'Key',
key: 'key',
type: 'string',
required: true,
description: 'The key of your value to get.',
variables: true,
},
],
async run($) {
const keyValuePair = await $.datastore.get({
key: $.step.parameters.key,
});
$.setActionItem({
raw: keyValuePair,
});
},
});

View File

@@ -1,4 +0,0 @@
import getValue from './get-value/index.js';
import setValue from './set-value/index.js';
export default [getValue, setValue];

View File

@@ -1,36 +0,0 @@
import defineAction from '../../../../helpers/define-action.js';
export default defineAction({
name: 'Set value',
key: 'setValue',
description: 'Set value to the persistent datastore.',
arguments: [
{
label: 'Key',
key: 'key',
type: 'string',
required: true,
description: 'The key of your value to set.',
variables: true,
},
{
label: 'Value',
key: 'value',
type: 'string',
required: true,
description: 'The value to set.',
variables: true,
},
],
async run($) {
const keyValuePair = await $.datastore.set({
key: $.step.parameters.key,
value: $.step.parameters.value,
});
$.setActionItem({
raw: keyValuePair,
});
},
});

View File

@@ -1,13 +0,0 @@
<?xml version="1.0"?>
<svg xmlns="http://www.w3.org/2000/svg" fill="#000000" width="800px" height="800px" viewBox="0 0 32 32" id="icon">
<defs>
<style>.cls-1{fill:none;}</style>
</defs>
<title>datastore</title>
<circle cx="23" cy="23" r="1"/>
<rect x="8" y="22" width="12" height="2"/>
<circle cx="23" cy="9" r="1"/>
<rect x="8" y="8" width="12" height="2"/>
<path d="M26,14a2,2,0,0,0,2-2V6a2,2,0,0,0-2-2H6A2,2,0,0,0,4,6v6a2,2,0,0,0,2,2H8v4H6a2,2,0,0,0-2,2v6a2,2,0,0,0,2,2H26a2,2,0,0,0,2-2V20a2,2,0,0,0-2-2H24V14ZM6,6H26v6H6ZM26,26H6V20H26Zm-4-8H10V14H22Z"/>
<rect id="_Transparent_Rectangle_" data-name="&lt;Transparent Rectangle&gt;" class="cls-1" width="32" height="32"/>
</svg>

Before

Width:  |  Height:  |  Size: 704 B

View File

@@ -1,14 +0,0 @@
import defineApp from '../../helpers/define-app.js';
import actions from './actions/index.js';
export default defineApp({
name: 'Datastore',
key: 'datastore',
iconUrl: '{BASE_URL}/apps/datastore/assets/favicon.svg',
authDocUrl: '{DOCS_URL}/apps/datastore/connection',
supportsConnections: false,
baseUrl: '',
apiBaseUrl: '',
primaryColor: '001F52',
actions,
});

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

@@ -1,6 +1,5 @@
import defineAction from '../../../../helpers/define-action.js'; import defineAction from '../../../../helpers/define-action.js';
import base64ToString from './transformers/base64-to-string.js';
import capitalize from './transformers/capitalize.js'; import capitalize from './transformers/capitalize.js';
import extractEmailAddress from './transformers/extract-email-address.js'; import extractEmailAddress from './transformers/extract-email-address.js';
import extractNumber from './transformers/extract-number.js'; import extractNumber from './transformers/extract-number.js';
@@ -9,12 +8,10 @@ import lowercase from './transformers/lowercase.js';
import markdownToHtml from './transformers/markdown-to-html.js'; import markdownToHtml from './transformers/markdown-to-html.js';
import pluralize from './transformers/pluralize.js'; import pluralize from './transformers/pluralize.js';
import replace from './transformers/replace.js'; import replace from './transformers/replace.js';
import stringToBase64 from './transformers/string-to-base64.js';
import trimWhitespace from './transformers/trim-whitespace.js'; import trimWhitespace from './transformers/trim-whitespace.js';
import useDefaultValue from './transformers/use-default-value.js'; import useDefaultValue from './transformers/use-default-value.js';
const transformers = { const transformers = {
base64ToString,
capitalize, capitalize,
extractEmailAddress, extractEmailAddress,
extractNumber, extractNumber,
@@ -23,7 +20,6 @@ const transformers = {
markdownToHtml, markdownToHtml,
pluralize, pluralize,
replace, replace,
stringToBase64,
trimWhitespace, trimWhitespace,
useDefaultValue, useDefaultValue,
}; };
@@ -41,7 +37,6 @@ export default defineAction({
required: true, required: true,
variables: true, variables: true,
options: [ options: [
{ label: 'Base64 to String', value: 'base64ToString' },
{ label: 'Capitalize', value: 'capitalize' }, { label: 'Capitalize', value: 'capitalize' },
{ label: 'Convert HTML to Markdown', value: 'htmlToMarkdown' }, { label: 'Convert HTML to Markdown', value: 'htmlToMarkdown' },
{ label: 'Convert Markdown to HTML', value: 'markdownToHtml' }, { label: 'Convert Markdown to HTML', value: 'markdownToHtml' },
@@ -50,7 +45,6 @@ export default defineAction({
{ label: 'Lowercase', value: 'lowercase' }, { label: 'Lowercase', value: 'lowercase' },
{ label: 'Pluralize', value: 'pluralize' }, { label: 'Pluralize', value: 'pluralize' },
{ label: 'Replace', value: 'replace' }, { label: 'Replace', value: 'replace' },
{ label: 'String to Base64', value: 'stringToBase64' },
{ label: 'Trim Whitespace', value: 'trimWhitespace' }, { label: 'Trim Whitespace', value: 'trimWhitespace' },
{ label: 'Use Default Value', value: 'useDefaultValue' }, { label: 'Use Default Value', value: 'useDefaultValue' },
], ],

View File

@@ -1,8 +0,0 @@
const base64ToString = ($) => {
const input = $.step.parameters.input;
const decodedString = Buffer.from(input, 'base64').toString('utf8');
return decodedString;
};
export default base64ToString;

View File

@@ -1,8 +0,0 @@
const stringtoBase64 = ($) => {
const input = $.step.parameters.input;
const base64String = Buffer.from(input).toString('base64');
return base64String;
};
export default stringtoBase64;

View File

@@ -1,4 +1,3 @@
import base64ToString from './text/base64-to-string.js';
import capitalize from './text/capitalize.js'; import capitalize from './text/capitalize.js';
import extractEmailAddress from './text/extract-email-address.js'; import extractEmailAddress from './text/extract-email-address.js';
import extractNumber from './text/extract-number.js'; import extractNumber from './text/extract-number.js';
@@ -7,7 +6,6 @@ import lowercase from './text/lowercase.js';
import markdownToHtml from './text/markdown-to-html.js'; import markdownToHtml from './text/markdown-to-html.js';
import pluralize from './text/pluralize.js'; import pluralize from './text/pluralize.js';
import replace from './text/replace.js'; import replace from './text/replace.js';
import stringToBase64 from './text/string-to-base64.js';
import trimWhitespace from './text/trim-whitespace.js'; import trimWhitespace from './text/trim-whitespace.js';
import useDefaultValue from './text/use-default-value.js'; import useDefaultValue from './text/use-default-value.js';
import performMathOperation from './numbers/perform-math-operation.js'; import performMathOperation from './numbers/perform-math-operation.js';
@@ -17,7 +15,6 @@ import formatPhoneNumber from './numbers/format-phone-number.js';
import formatDateTime from './date-time/format-date-time.js'; import formatDateTime from './date-time/format-date-time.js';
const options = { const options = {
base64ToString,
capitalize, capitalize,
extractEmailAddress, extractEmailAddress,
extractNumber, extractNumber,
@@ -26,7 +23,6 @@ const options = {
markdownToHtml, markdownToHtml,
pluralize, pluralize,
replace, replace,
stringToBase64,
trimWhitespace, trimWhitespace,
useDefaultValue, useDefaultValue,
performMathOperation, performMathOperation,

View File

@@ -1,12 +0,0 @@
const base64ToString = [
{
label: 'Input',
key: 'input',
type: 'string',
required: true,
description: 'Text that will be converted from Base64 to string.',
variables: true,
},
];
export default base64ToString;

View File

@@ -1,12 +0,0 @@
const stringToBase64 = [
{
label: 'Input',
key: 'input',
type: 'string',
required: true,
description: 'Text that will be converted to Base64.',
variables: true,
},
];
export default stringToBase64;

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

@@ -1,3 +1,4 @@
import FormData from 'form-data';
import defineAction from '../../../../helpers/define-action.js'; import defineAction from '../../../../helpers/define-action.js';
export default defineAction({ export default defineAction({
@@ -5,51 +6,45 @@ export default defineAction({
key: 'newChat', key: 'newChat',
description: 'Create a new chat session for Helix AI.', description: 'Create a new chat session for Helix AI.',
arguments: [ arguments: [
{
label: 'Session ID',
key: 'sessionId',
type: 'string',
required: false,
description:
'ID of the chat session to continue. Leave empty to start a new chat.',
variables: true,
},
{
label: 'System Prompt',
key: 'systemPrompt',
type: 'string',
required: false,
description:
'Optional system prompt to start the chat with. It will be used only for new chat sessions.',
variables: true,
},
{ {
label: 'Input', label: 'Input',
key: 'input', key: 'input',
type: 'string', type: 'string',
required: true, required: true,
description: 'User input to start the chat with.', description: 'Prompt to start the chat with.',
variables: true, variables: true,
}, },
], ],
async run($) { async run($) {
const response = await $.http.post('/api/v1/sessions/chat', { const formData = new FormData();
session_id: $.step.parameters.sessionId, formData.append('input', $.step.parameters.input);
system: $.step.parameters.systemPrompt, formData.append('mode', 'inference');
messages: [ formData.append('type', 'text');
{
role: 'user', const sessionResponse = await $.http.post('/api/v1/sessions', formData, {
content: { headers: {
content_type: 'text', ...formData.getHeaders(),
parts: [$.step.parameters.input], },
},
},
],
}); });
$.setActionItem({ const sessionId = sessionResponse.data.id;
raw: response.data,
}); let chatGenerated = false;
while (!chatGenerated) {
const response = await $.http.get(`/api/v1/sessions/${sessionId}`);
const message =
response.data.interactions[response.data.interactions.length - 1];
if (message.creator === 'system' && message.state === 'complete') {
$.setActionItem({
raw: message,
});
chatGenerated = true;
}
}
}, },
}); });

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

@@ -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,17 +64,32 @@ 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', label: 'Qualified (Pipeline)',
name: 'getDynamicData', value: 1,
arguments: [ },
{ {
name: 'key', label: 'Contact Made (Pipeline)',
value: 'listStages', 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',

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

@@ -18,9 +18,7 @@ const port = process.env.PORT || '3000';
const serveWebAppSeparately = const serveWebAppSeparately =
process.env.SERVE_WEB_APP_SEPARATELY === 'true' ? true : false; process.env.SERVE_WEB_APP_SEPARATELY === 'true' ? true : false;
let apiUrl = new URL( let apiUrl = new URL(`${protocol}://${host}:${port}`).toString();
process.env.API_URL || `${protocol}://${host}:${port}`
).toString();
apiUrl = apiUrl.substring(0, apiUrl.length - 1); apiUrl = apiUrl.substring(0, apiUrl.length - 1);
// use apiUrl by default, which has less priority over the following cases // use apiUrl by default, which has less priority over the following cases
@@ -38,9 +36,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 +71,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,
@@ -94,10 +88,6 @@ const appConfig = {
licenseKey: process.env.LICENSE_KEY, licenseKey: process.env.LICENSE_KEY,
sentryDsn: process.env.SENTRY_DSN, sentryDsn: process.env.SENTRY_DSN,
CI: process.env.CI === 'true', CI: process.env.CI === 'true',
disableNotificationsPage: process.env.DISABLE_NOTIFICATIONS_PAGE === 'true',
disableFavicon: process.env.DISABLE_FAVICON === 'true',
additionalDrawerLink: process.env.ADDITIONAL_DRAWER_LINK,
additionalDrawerLinkText: process.env.ADDITIONAL_DRAWER_LINK_TEXT,
}; };
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

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

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);
});
});

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