Compare commits

..

18 Commits

Author SHA1 Message Date
Faruk AYDIN
62b656add1 feat: Move canCustomConnect logic to static db field for AppConfig 2024-03-28 00:58:20 +01:00
Faruk AYDIN
40636119fb feat: Move canConnect logic into the database column for AppConfig 2024-03-28 00:49:20 +01:00
Faruk AYDIN
beb3b2cf45 chore: Correct the folder of get auth client mock 2024-03-27 14:04:16 +01:00
Faruk AYDIN
c2375ed3d4 chore: Remove old app auth client routers 2024-03-27 14:01:20 +01:00
Faruk AYDIN
4942cf8dae feat: Implement new admin get app auth client API endpoint 2024-03-27 14:00:16 +01:00
Faruk AYDIN
8f444eafa7 chore: Remove old admin app auth clients API endpoint 2024-03-27 13:44:01 +01:00
Faruk AYDIN
2484a0e631 feat: Implement new admin get auth clients API endpoint 2024-03-27 13:42:41 +01:00
Faruk AYDIN
d3747ad050 fix: Typo for the get auth clients test file 2024-03-27 13:42:18 +01:00
Faruk AYDIN
bb68a75636 feat: Implement new get app auth clients API endpoint 2024-03-26 23:58:35 +01:00
Faruk AYDIN
98131d633e refactor: Remove redundant appConfigId from get auth clients mock 2024-03-26 21:27:38 +01:00
Faruk AYDIN
e8193e0e17 feat: Make appKey column of app auth clients not nullable 2024-03-26 21:23:22 +01:00
Faruk AYDIN
74b7dd8f34 chore: Remove old app auth clients API endpoint 2024-03-26 21:19:44 +01:00
Faruk AYDIN
4f500e2d04 feat: Implement new get auth clients api endpoint 2024-03-26 21:17:58 +01:00
Faruk AYDIN
b53ddca8ce feat: Remove app config relation from app auth clients 2024-03-26 21:00:26 +01:00
Faruk AYDIN
70f30034ab feat: Remove app auth clients relation from app configs 2024-03-26 20:59:33 +01:00
Faruk AYDIN
fcd83909f7 feat: Remove app config id from app auth clients 2024-03-26 20:58:51 +01:00
Faruk AYDIN
eadb472af9 feat: Migrate app config id to app key 2024-03-26 20:56:50 +01:00
Faruk AYDIN
600316577e feat: Add appKey to app auth clients 2024-03-26 20:49:53 +01:00
272 changed files with 1986 additions and 2873 deletions

View File

@@ -1,25 +1,14 @@
# syntax=docker/dockerfile:1
FROM node:18-alpine
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 ./docker/entrypoint.sh /entrypoint.sh
COPY ./entrypoint.sh /entrypoint.sh
EXPOSE 3000
ENTRYPOINT ["sh", "/entrypoint.sh"]

View File

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

View File

@@ -31,7 +31,7 @@
"accounting": "^0.4.1",
"ajv-formats": "^2.1.1",
"axios": "1.6.0",
"bcrypt": "^5.1.0",
"bcrypt": "^5.0.1",
"bullmq": "^3.0.0",
"cors": "^2.8.5",
"crypto-js": "^4.1.1",
@@ -95,7 +95,6 @@
"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: '{DOCS_URL}/apps/azure-openai/connection',
authDocUrl: 'https://automatisch.io/docs/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: '{DOCS_URL}/apps/carbone/connection',
authDocUrl: 'https://automatisch.io/docs/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: '{DOCS_URL}/apps/datastore/connection',
authDocUrl: 'https://automatisch.io/docs/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: '{DOCS_URL}/apps/deepl/connection',
authDocUrl: 'https://automatisch.io/docs/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: '{DOCS_URL}/apps/delay/connection',
authDocUrl: 'https://automatisch.io/docs/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: '{DOCS_URL}/apps/discord/connection',
authDocUrl: 'https://automatisch.io/docs/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: '{DOCS_URL}/apps/dropbox/connection',
authDocUrl: 'https://automatisch.io/docs/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: '{DOCS_URL}/apps/filter/connection',
authDocUrl: 'https://automatisch.io/docs/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: '{DOCS_URL}/apps/flickr/connection',
authDocUrl: 'https://automatisch.io/docs/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: '{DOCS_URL}/apps/flowers-software/connection',
authDocUrl: 'https://automatisch.io/docs/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: '{DOCS_URL}/apps/formatter/connection',
authDocUrl: 'https://automatisch.io/docs/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: '{DOCS_URL}/apps/ghost/connection',
authDocUrl: 'https://automatisch.io/docs/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: '{DOCS_URL}/apps/github/connection',
authDocUrl: 'https://automatisch.io/docs/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: '{DOCS_URL}/apps/gitlab/connection',
authDocUrl: 'https://automatisch.io/docs/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: '{DOCS_URL}/apps/google-calendar/connection',
authDocUrl: 'https://automatisch.io/docs/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: '{DOCS_URL}/apps/google-drive/connection',
authDocUrl: 'https://automatisch.io/docs/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: '{DOCS_URL}/apps/google-forms/connection',
authDocUrl: 'https://automatisch.io/docs/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: '{DOCS_URL}/apps/google-sheets/connection',
authDocUrl: 'https://automatisch.io/docs/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: '{DOCS_URL}/apps/helix/connection',
authDocUrl: 'https://automatisch.io/docs/apps/helix/connection',
primaryColor: '000000',
supportsConnections: true,
beforeRequest: [setBaseUrl, addAuthHeader],

View File

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

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: '{DOCS_URL}/apps/http-request/connection',
authDocUrl: 'https://automatisch.io/docs/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: '{DOCS_URL}/apps/hubspot/connection',
authDocUrl: 'https://automatisch.io/docs/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: '{DOCS_URL}/apps/invoice-ninja/connection',
authDocUrl: 'https://automatisch.io/docs/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: '{DOCS_URL}/apps/mattermost/connection',
authDocUrl: 'https://automatisch.io/docs/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: '{DOCS_URL}/apps/miro/connection',
authDocUrl: 'https://automatisch.io/docs/apps/miro/connection',
primaryColor: 'F2CA02',
supportsConnections: true,
beforeRequest: [addAuthHeader],

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: '{DOCS_URL}/apps/notion/connection',
authDocUrl: 'https://automatisch.io/docs/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: '{DOCS_URL}/apps/ntfy/connection',
authDocUrl: 'https://automatisch.io/docs/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: '{DOCS_URL}/apps/odoo/connection',
authDocUrl: 'https://automatisch.io/docs/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: '{DOCS_URL}/apps/openai/connection',
authDocUrl: 'https://automatisch.io/docs/apps/openai/connection',
primaryColor: '000000',
supportsConnections: true,
beforeRequest: [addAuthHeader],

View File

@@ -64,17 +64,32 @@ export default defineAction({
value: '1',
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.',
variables: true,
source: {
type: 'query',
name: 'getDynamicData',
arguments: [
{
name: 'key',
value: 'listStages',
},
],
},
options: [
{
label: 'Qualified (Pipeline)',
value: 1,
},
{
label: 'Contact Made (Pipeline)',
value: 2,
},
{
label: 'Prospect Qualified (Pipeline)',
value: 3,
},
{
label: 'Needs Defined (Pipeline)',
value: 4,
},
{
label: 'Proposal Made (Pipeline)',
value: 5,
},
{
label: 'Negotiations Started (Pipeline)',
value: 6,
},
],
},
{
label: 'Owner',

View File

@@ -1,25 +1,23 @@
import listActivityTypes from './list-activity-types/index.js';
import listCurrencies from './list-currencies/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 listOrganizationLabelField from './list-organization-label-field/index.js';
import listLeadLabels from './list-lead-labels/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 listPersons from './list-persons/index.js';
import listStages from './list-stages/index.js';
import listUsers from './list-users/index.js';
export default [
listActivityTypes,
listCurrencies,
listDeals,
listLeadLabels,
listLeads,
listOrganizationLabelField,
listLeadLabels,
listOrganizations,
listOrganizationLabelField,
listPersonLabelField,
listPersons,
listStages,
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: '',
apiBaseUrl: '',
iconUrl: '{BASE_URL}/apps/pipedrive/assets/favicon.svg',
authDocUrl: '{DOCS_URL}/apps/pipedrive/connection',
authDocUrl: 'https://automatisch.io/docs/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: '{DOCS_URL}/apps/placetel/connection',
authDocUrl: 'https://automatisch.io/docs/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: '{DOCS_URL}/apps/postgresql/connection',
authDocUrl: 'https://automatisch.io/docs/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: '{DOCS_URL}/apps/pushover/connection',
authDocUrl: 'https://automatisch.io/docs/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: '{DOCS_URL}/apps/reddit/connection',
authDocUrl: 'https://automatisch.io/docs/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: '{DOCS_URL}/apps/removebg/connection',
authDocUrl: 'https://automatisch.io/docs/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: '{DOCS_URL}/apps/rss/connection',
authDocUrl: 'https://automatisch.io/docs/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: '{DOCS_URL}/connections/salesforce',
authDocUrl: 'https://automatisch.io/docs/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: '{DOCS_URL}/apps/scheduler/connection',
authDocUrl: 'https://automatisch.io/docs/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: '{DOCS_URL}/apps/self-hosted-llm/connection',
authDocUrl: 'https://automatisch.io/docs/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: '{DOCS_URL}/apps/signalwire/connection',
authDocUrl: 'https://automatisch.io/docs/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: '{DOCS_URL}/apps/slack/connection',
authDocUrl: 'https://automatisch.io/docs/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: '{DOCS_URL}/apps/smtp/connection',
authDocUrl: 'https://automatisch.io/docs/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: '{DOCS_URL}/apps/spotify/connection',
authDocUrl: 'https://automatisch.io/docs/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: '{DOCS_URL}/connections/strava',
authDocUrl: 'https://automatisch.io/docs/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: '{DOCS_URL}/apps/stripe/connection',
authDocUrl: 'https://automatisch.io/docs/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: '{DOCS_URL}/apps/telegram-bot/connection',
authDocUrl: 'https://automatisch.io/docs/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: '{DOCS_URL}/apps/todoist/connection',
authDocUrl: 'https://automatisch.io/docs/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: '{DOCS_URL}/apps/trello/connection',
authDocUrl: 'https://automatisch.io/docs/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: '{DOCS_URL}/apps/twilio/connection',
authDocUrl: 'https://automatisch.io/docs/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: '{DOCS_URL}/apps/twitter/connection',
authDocUrl: 'https://automatisch.io/docs/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: '{DOCS_URL}/apps/typeform/connection',
authDocUrl: 'https://automatisch.io/docs/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: '{DOCS_URL}/apps/webhook/connection',
authDocUrl: 'https://automatisch.io/docs/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: '{DOCS_URL}/apps/wordpress/connection',
authDocUrl: 'https://automatisch.io/docs/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: '{DOCS_URL}/apps/xero/connection',
authDocUrl: 'https://automatisch.io/docs/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: '{DOCS_URL}/apps/youtube/connection',
authDocUrl: 'https://automatisch.io/docs/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: '{DOCS_URL}/apps/zendesk/connection',
authDocUrl: 'https://automatisch.io/docs/apps/zendesk/connection',
primaryColor: '17494d',
supportsConnections: true,
beforeRequest: [addAuthHeader],

View File

@@ -38,9 +38,6 @@ 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 = {
@@ -76,7 +73,6 @@ 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: 'GET,HEAD,POST,DELETE',
methods: 'POST',
credentials: true,
optionsSuccessStatus: 200,
};

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

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

View File

@@ -3,9 +3,6 @@ import AppConfig from '../../../../models/app-config.js';
export default async (request, response) => {
const appConfig = await AppConfig.query()
.withGraphFetched({
appAuthClients: true,
})
.findOne({
key: request.params.appKey,
})

View File

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

View File

@@ -1,24 +0,0 @@
import { renderObject } from '../../../../helpers/renderer.js';
import App from '../../../../models/app.js';
export default async (request, response) => {
const app = await App.findOneByKey(request.params.appKey);
const connections = await request.currentUser.authorizedConnections
.clone()
.select('connections.*')
.withGraphFetched({
appConfig: true,
appAuthClient: true,
})
.fullOuterJoinRelated('steps')
.where({
'connections.key': app.key,
'connections.draft': false,
})
.countDistinct('steps.flow_id as flowCount')
.groupBy('connections.id')
.orderBy('created_at', 'desc');
renderObject(response, connections);
};

View File

@@ -1,101 +0,0 @@
import { describe, it, expect, beforeEach } from 'vitest';
import request from 'supertest';
import app from '../../../../app.js';
import createAuthTokenByUserId from '../../../../helpers/create-auth-token-by-user-id.js';
import { createUser } from '../../../../../test/factories/user.js';
import { createConnection } from '../../../../../test/factories/connection.js';
import { createPermission } from '../../../../../test/factories/permission.js';
import getConnectionsMock from '../../../../../test/mocks/rest/api/v1/apps/get-connections.js';
describe('GET /api/v1/apps/:appKey/connections', () => {
let currentUser, currentUserRole, token;
beforeEach(async () => {
currentUser = await createUser();
currentUserRole = await currentUser.$relatedQuery('role');
token = await createAuthTokenByUserId(currentUser.id);
});
it('should return the connections data of specified app for current user', async () => {
const currentUserConnectionOne = await createConnection({
userId: currentUser.id,
key: 'deepl',
draft: false,
});
const currentUserConnectionTwo = await createConnection({
userId: currentUser.id,
key: 'deepl',
draft: false,
});
await createPermission({
action: 'read',
subject: 'Connection',
roleId: currentUserRole.id,
conditions: ['isCreator'],
});
const response = await request(app)
.get('/api/v1/apps/deepl/connections')
.set('Authorization', token)
.expect(200);
const expectedPayload = await getConnectionsMock([
currentUserConnectionTwo,
currentUserConnectionOne,
]);
expect(response.body).toEqual(expectedPayload);
});
it('should return the connections data of specified app for another user', async () => {
const anotherUser = await createUser();
const anotherUserConnectionOne = await createConnection({
userId: anotherUser.id,
key: 'deepl',
draft: false,
});
const anotherUserConnectionTwo = await createConnection({
userId: anotherUser.id,
key: 'deepl',
draft: false,
});
await createPermission({
action: 'read',
subject: 'Connection',
roleId: currentUserRole.id,
conditions: [],
});
const response = await request(app)
.get('/api/v1/apps/deepl/connections')
.set('Authorization', token)
.expect(200);
const expectedPayload = await getConnectionsMock([
anotherUserConnectionTwo,
anotherUserConnectionOne,
]);
expect(response.body).toEqual(expectedPayload);
});
it('should return not found response for invalid connection UUID', async () => {
await createPermission({
action: 'update',
subject: 'Connection',
roleId: currentUserRole.id,
conditions: ['isCreator'],
});
await request(app)
.get('/api/v1/connections/invalid-connection-id/connections')
.set('Authorization', token)
.expect(404);
});
});

View File

@@ -15,7 +15,7 @@ describe('GET /api/v1/apps/:appKey/flows', () => {
currentUser = await createUser();
currentUserRole = await currentUser.$relatedQuery('role');
token = await createAuthTokenByUserId(currentUser.id);
token = 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 = await createAuthTokenByUserId(currentUser.id);
token = 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 = await createAuthTokenByUserId(currentUser.id);
token = createAuthTokenByUserId(currentUser.id);
});
it('should return the app triggers', async () => {

View File

@@ -1,14 +0,0 @@
import { renderObject } from '../../../../helpers/renderer.js';
export default async (request, response) => {
let connection = await request.currentUser.authorizedConnections
.clone()
.findOne({
id: request.params.connectionId,
})
.throwIfNotFound();
connection = await connection.testAndUpdateConnection();
renderObject(response, connection);
};

View File

@@ -1,123 +0,0 @@
import { 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 { createConnection } from '../../../../../test/factories/connection.js';
import { createPermission } from '../../../../../test/factories/permission.js';
describe('POST /api/v1/connections/:connectionId/test', () => {
let currentUser, currentUserRole, token;
beforeEach(async () => {
currentUser = await createUser();
currentUserRole = await currentUser.$relatedQuery('role');
token = await createAuthTokenByUserId(currentUser.id);
});
it('should update the connection as not verified for current user', async () => {
const currentUserConnection = await createConnection({
userId: currentUser.id,
key: 'deepl',
verified: true,
});
await createPermission({
action: 'read',
subject: 'Connection',
roleId: currentUserRole.id,
conditions: ['isCreator'],
});
await createPermission({
action: 'update',
subject: 'Connection',
roleId: currentUserRole.id,
conditions: ['isCreator'],
});
const response = await request(app)
.post(`/api/v1/connections/${currentUserConnection.id}/test`)
.set('Authorization', token)
.expect(200);
expect(response.body.data.verified).toEqual(false);
});
it('should update the connection as not verified for another user', async () => {
const anotherUser = await createUser();
const anotherUserConnection = await createConnection({
userId: anotherUser.id,
key: 'deepl',
verified: true,
});
await createPermission({
action: 'read',
subject: 'Connection',
roleId: currentUserRole.id,
conditions: [],
});
await createPermission({
action: 'update',
subject: 'Connection',
roleId: currentUserRole.id,
conditions: [],
});
const response = await request(app)
.post(`/api/v1/connections/${anotherUserConnection.id}/test`)
.set('Authorization', token)
.expect(200);
expect(response.body.data.verified).toEqual(false);
});
it('should return not found response for not existing connection UUID', async () => {
const notExistingConnectionUUID = Crypto.randomUUID();
await createPermission({
action: 'read',
subject: 'Connection',
roleId: currentUserRole.id,
conditions: ['isCreator'],
});
await createPermission({
action: 'update',
subject: 'Connection',
roleId: currentUserRole.id,
conditions: ['isCreator'],
});
await request(app)
.post(`/api/v1/connections/${notExistingConnectionUUID}/test`)
.set('Authorization', token)
.expect(404);
});
it('should return bad request response for invalid UUID', async () => {
await createPermission({
action: 'read',
subject: 'Connection',
roleId: currentUserRole.id,
conditions: ['isCreator'],
});
await createPermission({
action: 'update',
subject: 'Connection',
roleId: currentUserRole.id,
conditions: ['isCreator'],
});
await request(app)
.post('/api/v1/connections/invalidConnectionUUID/test')
.set('Authorization', token)
.expect(400);
});
});

View File

@@ -16,7 +16,7 @@ describe('GET /api/v1/connections/:connectionId/flows', () => {
currentUser = await createUser();
currentUserRole = await currentUser.$relatedQuery('role');
token = await createAuthTokenByUserId(currentUser.id);
token = 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 = await createAuthTokenByUserId(currentUser.id);
token = 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 = await createAuthTokenByUserId(currentUser.id);
token = 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 = await createAuthTokenByUserId(currentUser.id);
token = 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 = await createAuthTokenByUserId(currentUser.id);
token = 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 = await createAuthTokenByUserId(currentUser.id);
token = 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 = await createAuthTokenByUserId(user.id);
token = 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 = await createAuthTokenByUserId(user.id);
token = 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