Compare commits

...

30 Commits

Author SHA1 Message Date
Rıdvan Akca
2295507a2c feat(monday): add monday integration 2024-05-03 14:04:57 +02:00
Ömer Faruk Aydın
788530be45 Merge pull request #1843 from automatisch/dockerignore
chore: Add .env and yarn error log files to dockerignore
2024-04-26 17:27:55 +02:00
Faruk AYDIN
7ed392e854 chore: Add .env and yarn error log files to dockerignore 2024-04-26 17:19:18 +02:00
Ömer Faruk Aydın
3932e554da Merge pull request #1842 from automatisch/node-gyp
chore: Explicitly install node-gyp
2024-04-26 16:45:30 +02:00
Faruk AYDIN
1a21624618 chore: Explicitly install node-gyp 2024-04-26 16:39:14 +02:00
Ömer Faruk Aydın
9f292ff018 Merge pull request #1840 from automatisch/update-bcrypt
chore: Update bcrypt version to 5.1.0
2024-04-26 15:43:47 +02:00
Faruk AYDIN
dbb24b3a9b chore: Update bcrypt version to 5.1.0 2024-04-26 15:36:36 +02:00
Ali BARIN
35b2639837 Merge pull request #1839 from automatisch/dockerfile-revision
chore: direct builds in docker
2024-04-26 15:02:37 +02:00
Ali BARIN
35951199cd chore: direct builds in docker 2024-04-26 14:42:56 +02:00
Ali BARIN
79af909c51 Merge pull request #1832 from automatisch/align-404-page-center
fix: align 404 page content to the center
2024-04-26 14:22:26 +02:00
Ali BARIN
3482aa7b76 Merge pull request #1837 from automatisch/logout-endpoint-web-implementation
feat: implement revoke access token with RQ
2024-04-26 14:20:49 +02:00
Ali BARIN
5dbc1f59ef Merge pull request #1835 from automatisch/logout-endpoint
feat: add DELETE /access-tokens/:token
2024-04-26 14:18:59 +02:00
Ali BARIN
2166a3220e style: add break line before variable declaration and beforeEach 2024-04-26 12:02:38 +00:00
Ali BARIN
24a7d1ef10 Merge pull request #1833 from automatisch/aut-931
feat: remove static page title
2024-04-26 11:51:03 +02:00
Ali BARIN
18ffbb7317 fix(AccountDropdownMenu): await token revocation request 2024-04-26 09:27:41 +00:00
Rıdvan Akca
363874de6a feat: implement revoke access token with RQ 2024-04-26 09:25:50 +00:00
Ali BARIN
68d1719b11 feat: add new methods to cors options 2024-04-26 09:25:27 +00:00
Ali BARIN
1a75d81268 test: add test for revoking access token 2024-04-26 09:16:53 +00:00
Ali BARIN
2163be4227 feat: add DELETE /access-tokens/:token 2024-04-24 15:31:22 +00:00
Ali BARIN
b54afcd922 Merge pull request #1825 from automatisch/access-tokens
feat: Use persisted access tokens for authentication
2024-04-24 16:39:57 +02:00
Ali BARIN
0a86641a0f feat: remove static page title 2024-04-24 15:27:37 +02:00
kasia.oczkowska
18464c746a fix: align 404 page content to the center 2024-04-24 13:20:07 +01:00
Ömer Faruk Aydın
ba92cddae1 Merge pull request #1828 from automatisch/aut-932
feat: compute DOCS_URL in authDocUrl
2024-04-24 12:09:19 +02:00
Faruk AYDIN
2a4f8ed45f feat: Add indexes to token and userId columns of access tokens 2024-04-24 12:03:45 +02:00
Ali BARIN
135a0028be feat: introduce DOCS_URL in authDocUrl properties 2024-04-23 12:39:38 +00:00
Ali BARIN
4da6e8372f feat: compute DOCS_URL in authDocUrl 2024-04-23 12:21:51 +00:00
Faruk AYDIN
6a7cdf2570 feat: Use persisted access tokens for authentication 2024-04-22 16:57:34 +02:00
Faruk AYDIN
73c929f25e feat: Create access tokens model 2024-04-22 15:19:17 +02:00
Ali BARIN
754c2d41c2 Merge pull request #1814 from automatisch/AUT-892
feat: remove chatwood
2024-04-17 14:40:17 +02:00
Rıdvan Akca
7201e48111 feat: remove chatwood 2024-04-17 14:29:54 +02:00
140 changed files with 827 additions and 263 deletions

View File

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

View File

@@ -1,14 +1,25 @@
# syntax=docker/dockerfile:1
FROM node:18-alpine
WORKDIR /automatisch
ENV PORT 3000
RUN \
apk --no-cache add --virtual build-dependencies python3 build-base git
WORKDIR /automatisch
# copy the app, note .dockerignore
COPY . /automatisch
RUN yarn
RUN cd packages/web && yarn build
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/ && \
apk del build-dependencies
COPY ./entrypoint.sh /entrypoint.sh
COPY ./docker/entrypoint.sh /entrypoint.sh
EXPOSE 3000
ENTRYPOINT ["sh", "/entrypoint.sh"]

View File

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

View File

@@ -31,7 +31,7 @@
"accounting": "^0.4.1",
"ajv-formats": "^2.1.1",
"axios": "1.6.0",
"bcrypt": "^5.0.1",
"bcrypt": "^5.1.0",
"bullmq": "^3.0.0",
"cors": "^2.8.5",
"crypto-js": "^4.1.1",
@@ -95,6 +95,7 @@
"url": "https://github.com/automatisch/automatisch/issues"
},
"devDependencies": {
"node-gyp": "^10.1.0",
"nodemon": "^2.0.13",
"supertest": "^6.3.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',
apiBaseUrl: '',
iconUrl: '{BASE_URL}/apps/azure-openai/assets/favicon.svg',
authDocUrl: 'https://automatisch.io/docs/apps/azure-openai/connection',
authDocUrl: '{DOCS_URL}/apps/azure-openai/connection',
primaryColor: '000000',
supportsConnections: true,
beforeRequest: [setBaseUrl, addAuthHeader],

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -10,7 +10,7 @@ export default defineApp({
name: 'Mattermost',
key: 'mattermost',
iconUrl: '{BASE_URL}/apps/mattermost/assets/favicon.svg',
authDocUrl: 'https://automatisch.io/docs/apps/mattermost/connection',
authDocUrl: '{DOCS_URL}/apps/mattermost/connection',
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
primaryColor: '4a154b',

View File

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

View File

@@ -0,0 +1,8 @@
<?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>

After

Width:  |  Height:  |  Size: 1.4 KiB

View File

@@ -0,0 +1,21 @@
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

@@ -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,18 @@
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

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

View File

@@ -0,0 +1,16 @@
import defineApp from '../../helpers/define-app.js';
import addAuthHeader from './common/add-auth-header.js';
import auth from './auth/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,
});

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -38,6 +38,9 @@ if (process.env.WEB_APP_URL) {
let webhookUrl = new URL(process.env.WEBHOOK_URL || apiUrl).toString();
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 appConfig = {
@@ -73,6 +76,7 @@ const appConfig = {
baseUrl: apiUrl,
webAppUrl,
webhookUrl,
docsUrl,
telemetryEnabled: process.env.TELEMETRY_ENABLED === 'false' ? false : true,
requestBodySizeLimit: '1mb',
smtpHost: process.env.SMTP_HOST,

View File

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

View File

@@ -0,0 +1,15 @@
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

@@ -0,0 +1,54 @@
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

@@ -22,7 +22,7 @@ describe('GET /api/v1/admin/apps/:appKey/auth-clients/:appAuthClientId', () => {
appKey: 'deepl',
});
token = createAuthTokenByUserId(currentUser.id);
token = await createAuthTokenByUserId(currentUser.id);
});
it('should return specified app auth client', async () => {

View File

@@ -17,7 +17,7 @@ describe('GET /api/v1/admin/apps/:appKey/auth-clients', () => {
adminRole = await createRole({ key: 'admin' });
currentUser = await createUser({ roleId: adminRole.id });
token = createAuthTokenByUserId(currentUser.id);
token = await createAuthTokenByUserId(currentUser.id);
});
it('should return specified app auth client info', async () => {

View File

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

View File

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

View File

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

View File

@@ -28,7 +28,7 @@ describe('GET /api/v1/admin/saml-auth-providers/:samlAuthProviderId/role-mapping
remoteRoleName: 'User',
});
token = createAuthTokenByUserId(currentUser.id);
token = await createAuthTokenByUserId(currentUser.id);
});
it('should return role mappings', async () => {

View File

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

View File

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

View File

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

View File

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

View File

@@ -11,7 +11,7 @@ describe('GET /api/v1/apps/:appKey/actions/:actionKey/substeps', () => {
beforeEach(async () => {
currentUser = await createUser();
token = createAuthTokenByUserId(currentUser.id);
token = await createAuthTokenByUserId(currentUser.id);
exampleApp = await App.findOneByKey('github');
});

View File

@@ -11,7 +11,7 @@ describe('GET /api/v1/apps/:appKey/actions', () => {
beforeEach(async () => {
currentUser = await createUser();
token = createAuthTokenByUserId(currentUser.id);
token = await createAuthTokenByUserId(currentUser.id);
});
it('should return the app actions', async () => {

View File

@@ -11,7 +11,7 @@ describe('GET /api/v1/apps/:appKey', () => {
beforeEach(async () => {
currentUser = await createUser();
token = createAuthTokenByUserId(currentUser.id);
token = await createAuthTokenByUserId(currentUser.id);
});
it('should return the app info', async () => {

View File

@@ -11,7 +11,7 @@ describe('GET /api/v1/apps', () => {
beforeEach(async () => {
currentUser = await createUser();
token = createAuthTokenByUserId(currentUser.id);
token = await createAuthTokenByUserId(currentUser.id);
apps = await App.findAll();
});

View File

@@ -19,7 +19,7 @@ describe('GET /api/v1/apps/:appKey/auth-clients/:appAuthClientId', () => {
appKey: 'deepl',
});
token = createAuthTokenByUserId(currentUser.id);
token = await createAuthTokenByUserId(currentUser.id);
});
it('should return specified app auth client', async () => {

View File

@@ -15,7 +15,7 @@ describe('GET /api/v1/apps/:appKey/auth-clients', () => {
currentUser = await createUser();
token = createAuthTokenByUserId(currentUser.id);
token = await createAuthTokenByUserId(currentUser.id);
});
it('should return specified app auth client info', async () => {

View File

@@ -11,7 +11,7 @@ describe('GET /api/v1/apps/:appKey/auth', () => {
beforeEach(async () => {
currentUser = await createUser();
token = createAuthTokenByUserId(currentUser.id);
token = await createAuthTokenByUserId(currentUser.id);
});
it('should return the app auth info', async () => {

View File

@@ -22,7 +22,7 @@ describe('GET /api/v1/apps/:appKey/config', () => {
disabled: false,
});
token = createAuthTokenByUserId(currentUser.id);
token = await createAuthTokenByUserId(currentUser.id);
});
it('should return specified app config info', async () => {

View File

@@ -14,7 +14,7 @@ describe('GET /api/v1/apps/:appKey/connections', () => {
currentUser = await createUser();
currentUserRole = await currentUser.$relatedQuery('role');
token = createAuthTokenByUserId(currentUser.id);
token = await createAuthTokenByUserId(currentUser.id);
});
it('should return the connections data of specified app for current user', async () => {

View File

@@ -15,7 +15,7 @@ describe('GET /api/v1/apps/:appKey/flows', () => {
currentUser = await createUser();
currentUserRole = await currentUser.$relatedQuery('role');
token = createAuthTokenByUserId(currentUser.id);
token = await createAuthTokenByUserId(currentUser.id);
});
it('should return the flows data of specified app for current user', async () => {

View File

@@ -11,7 +11,7 @@ describe('GET /api/v1/apps/:appKey/triggers/:triggerKey/substeps', () => {
beforeEach(async () => {
currentUser = await createUser();
token = createAuthTokenByUserId(currentUser.id);
token = await createAuthTokenByUserId(currentUser.id);
exampleApp = await App.findOneByKey('github');
});

View File

@@ -11,7 +11,7 @@ describe('GET /api/v1/apps/:appKey/triggers', () => {
beforeEach(async () => {
currentUser = await createUser();
token = createAuthTokenByUserId(currentUser.id);
token = await createAuthTokenByUserId(currentUser.id);
});
it('should return the app triggers', async () => {

View File

@@ -14,7 +14,7 @@ describe('POST /api/v1/connections/:connectionId/test', () => {
currentUser = await createUser();
currentUserRole = await currentUser.$relatedQuery('role');
token = createAuthTokenByUserId(currentUser.id);
token = await createAuthTokenByUserId(currentUser.id);
});
it('should update the connection as not verified for current user', async () => {

View File

@@ -16,7 +16,7 @@ describe('GET /api/v1/connections/:connectionId/flows', () => {
currentUser = await createUser();
currentUserRole = await currentUser.$relatedQuery('role');
token = createAuthTokenByUserId(currentUser.id);
token = await createAuthTokenByUserId(currentUser.id);
});
it('should return the flows data of specified connection for current user', async () => {

View File

@@ -20,7 +20,7 @@ describe('GET /api/v1/executions/:executionId/execution-steps', () => {
anotherUser = await createUser();
token = createAuthTokenByUserId(currentUser.id);
token = await createAuthTokenByUserId(currentUser.id);
});
it('should return the execution steps of current user execution', async () => {

View File

@@ -17,7 +17,7 @@ describe('GET /api/v1/executions/:executionId', () => {
currentUser = await createUser();
currentUserRole = await currentUser.$relatedQuery('role');
token = createAuthTokenByUserId(currentUser.id);
token = await createAuthTokenByUserId(currentUser.id);
});
it('should return the execution data of current user', async () => {

View File

@@ -18,7 +18,7 @@ describe('GET /api/v1/executions', () => {
anotherUser = await createUser();
token = createAuthTokenByUserId(currentUser.id);
token = await createAuthTokenByUserId(currentUser.id);
});
it('should return the executions of current user', async () => {

View File

@@ -16,7 +16,7 @@ describe('GET /api/v1/flows/:flowId', () => {
currentUser = await createUser();
currentUserRole = await currentUser.$relatedQuery('role');
token = createAuthTokenByUserId(currentUser.id);
token = await createAuthTokenByUserId(currentUser.id);
});
it('should return the flow data of current user', async () => {

View File

@@ -15,7 +15,7 @@ describe('GET /api/v1/flows', () => {
currentUser = await createUser();
currentUserRole = await currentUser.$relatedQuery('role');
token = createAuthTokenByUserId(currentUser.id);
token = await createAuthTokenByUserId(currentUser.id);
});
it('should return the flows data of current user', async () => {

View File

@@ -12,7 +12,7 @@ describe('GET /api/v1/payment/paddle-info', () => {
beforeEach(async () => {
user = await createUser();
token = createAuthTokenByUserId(user.id);
token = await createAuthTokenByUserId(user.id);
vi.spyOn(appConfig, 'isCloud', 'get').mockReturnValue(true);
vi.spyOn(billing.paddleInfo, 'vendorId', 'get').mockReturnValue(

View File

@@ -11,7 +11,7 @@ describe('GET /api/v1/payment/plans', () => {
beforeEach(async () => {
user = await createUser();
token = createAuthTokenByUserId(user.id);
token = await createAuthTokenByUserId(user.id);
vi.spyOn(appConfig, 'isCloud', 'get').mockReturnValue(true);
});

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