Compare commits
34 Commits
gmail-inte
...
AUT-971
Author | SHA1 | Date | |
---|---|---|---|
![]() |
8c0a5a3bd3 | ||
![]() |
9b00cff2d9 | ||
![]() |
ff0dd0b415 | ||
![]() |
f0b5d85a7a | ||
![]() |
2295507a2c | ||
![]() |
788530be45 | ||
![]() |
7ed392e854 | ||
![]() |
3932e554da | ||
![]() |
1a21624618 | ||
![]() |
9f292ff018 | ||
![]() |
dbb24b3a9b | ||
![]() |
35b2639837 | ||
![]() |
35951199cd | ||
![]() |
79af909c51 | ||
![]() |
3482aa7b76 | ||
![]() |
5dbc1f59ef | ||
![]() |
2166a3220e | ||
![]() |
24a7d1ef10 | ||
![]() |
18ffbb7317 | ||
![]() |
363874de6a | ||
![]() |
68d1719b11 | ||
![]() |
1a75d81268 | ||
![]() |
2163be4227 | ||
![]() |
b54afcd922 | ||
![]() |
0a86641a0f | ||
![]() |
18464c746a | ||
![]() |
ba92cddae1 | ||
![]() |
2a4f8ed45f | ||
![]() |
135a0028be | ||
![]() |
4da6e8372f | ||
![]() |
6a7cdf2570 | ||
![]() |
73c929f25e | ||
![]() |
754c2d41c2 | ||
![]() |
7201e48111 |
@@ -4,5 +4,9 @@
|
||||
**/.devcontainer
|
||||
**/.github
|
||||
**/.vscode
|
||||
**/.env
|
||||
**/.env.test
|
||||
**/.env.production
|
||||
**/yarn-error.log
|
||||
packages/docs
|
||||
packages/e2e-test
|
||||
|
@@ -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"]
|
||||
|
@@ -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
|
||||
|
@@ -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"
|
||||
|
@@ -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],
|
||||
|
@@ -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',
|
||||
|
@@ -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: '',
|
||||
|
@@ -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',
|
||||
|
@@ -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: '',
|
||||
|
@@ -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',
|
||||
|
@@ -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',
|
||||
|
@@ -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: '',
|
||||
|
@@ -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,
|
||||
|
@@ -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',
|
||||
|
@@ -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: '',
|
||||
|
@@ -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],
|
||||
|
@@ -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],
|
||||
|
@@ -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],
|
||||
|
@@ -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],
|
||||
|
@@ -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],
|
||||
|
@@ -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],
|
||||
|
@@ -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],
|
||||
|
@@ -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],
|
||||
|
@@ -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: '',
|
||||
|
@@ -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',
|
||||
|
@@ -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],
|
||||
|
@@ -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',
|
||||
|
@@ -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],
|
||||
|
@@ -0,0 +1,70 @@
|
||||
import defineAction from '../../../../helpers/define-action.js';
|
||||
|
||||
export default defineAction({
|
||||
name: 'Create board',
|
||||
key: 'createBoard',
|
||||
description: 'Creates a new board.',
|
||||
arguments: [
|
||||
{
|
||||
label: 'Board Name',
|
||||
key: 'boardName',
|
||||
type: 'string',
|
||||
required: true,
|
||||
description: 'Title for the board.',
|
||||
variables: true,
|
||||
},
|
||||
{
|
||||
label: 'Board Kind',
|
||||
key: 'boardKind',
|
||||
type: 'dropdown',
|
||||
required: true,
|
||||
description: '',
|
||||
variables: true,
|
||||
options: [
|
||||
{
|
||||
label: 'Main',
|
||||
value: 'public',
|
||||
},
|
||||
{
|
||||
label: 'Private',
|
||||
value: 'private',
|
||||
},
|
||||
{
|
||||
label: 'Shareable',
|
||||
value: 'share',
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
label: 'Template ID',
|
||||
key: 'templateId',
|
||||
type: 'string',
|
||||
required: false,
|
||||
description:
|
||||
"When you switch on developer mode, you'll spot the template IDs in your template store. Additionally, you have the option to utilize the Board ID from any board you've saved as a template.",
|
||||
variables: true,
|
||||
},
|
||||
],
|
||||
|
||||
async run($) {
|
||||
const { boardName, boardKind, templateId } = $.step.parameters;
|
||||
|
||||
const body = {
|
||||
query: `mutation {
|
||||
create_board (board_name: "${boardName}", board_kind: ${boardKind}${
|
||||
templateId ? `, template_id: ${templateId}` : ''
|
||||
}) {
|
||||
id
|
||||
name
|
||||
board_kind
|
||||
}
|
||||
}`,
|
||||
};
|
||||
|
||||
const { data } = await $.http.post('/', body);
|
||||
|
||||
$.setActionItem({
|
||||
raw: data,
|
||||
});
|
||||
},
|
||||
});
|
@@ -0,0 +1,98 @@
|
||||
import defineAction from '../../../../helpers/define-action.js';
|
||||
|
||||
export default defineAction({
|
||||
name: 'Create column',
|
||||
key: 'createColumn',
|
||||
description: 'Creates a new column in a board.',
|
||||
arguments: [
|
||||
{
|
||||
label: 'Board',
|
||||
key: 'boardId',
|
||||
type: 'dropdown',
|
||||
required: true,
|
||||
description: '',
|
||||
variables: true,
|
||||
source: {
|
||||
type: 'query',
|
||||
name: 'getDynamicData',
|
||||
arguments: [
|
||||
{
|
||||
name: 'key',
|
||||
value: 'listBoards',
|
||||
},
|
||||
],
|
||||
},
|
||||
},
|
||||
{
|
||||
label: 'Column Title',
|
||||
key: 'columnTitle',
|
||||
type: 'string',
|
||||
required: true,
|
||||
description: '',
|
||||
variables: true,
|
||||
},
|
||||
{
|
||||
label: 'Column Type',
|
||||
key: 'columnType',
|
||||
type: 'dropdown',
|
||||
required: true,
|
||||
description: '',
|
||||
variables: true,
|
||||
options: [
|
||||
{ label: 'Button', value: 'button' },
|
||||
{ label: 'Checkbox', value: 'checkbox' },
|
||||
{ label: 'Color Picker', value: 'color_picker' },
|
||||
{ label: 'Connect Boards', value: 'board_relation' },
|
||||
{ label: 'Country', value: 'country' },
|
||||
{ label: 'Creation Log', value: 'creation_log' },
|
||||
{ label: 'Date', value: 'date' },
|
||||
{ label: 'Dependency', value: 'dependency' },
|
||||
{ label: 'Dropdown', value: 'dropdown' },
|
||||
{ label: 'Email', value: 'email' },
|
||||
{ label: 'Files', value: 'file' },
|
||||
{ label: 'Formula', value: 'formula' },
|
||||
{ label: 'Hour', value: 'hour' },
|
||||
{ label: 'Item ID', value: 'item_id' },
|
||||
{ label: 'Last Updated', value: 'last_updated' },
|
||||
{ label: 'Link', value: 'link' },
|
||||
{ label: 'Location', value: 'location' },
|
||||
{ label: 'Long Text', value: 'long_text' },
|
||||
{ label: 'Mirror', value: 'mirror' },
|
||||
{ label: 'monday Doc', value: 'doc' },
|
||||
{ label: 'Name', value: 'name' },
|
||||
{ label: 'Numbers', value: 'numbers' },
|
||||
{ label: 'People', value: 'people' },
|
||||
{ label: 'Phone', value: 'phone' },
|
||||
{ label: 'Rating', value: 'rating' },
|
||||
{ label: 'Status', value: 'status' },
|
||||
{ label: 'Tags', value: 'tags' },
|
||||
{ label: 'Text', value: 'text' },
|
||||
{ label: 'Timeline', value: 'timeline' },
|
||||
{ label: 'Time Tracking', value: 'time_tracking' },
|
||||
{ label: 'Vote', value: 'vote' },
|
||||
{ label: 'Week', value: 'week' },
|
||||
{ label: 'World Clock', value: 'world_clock' },
|
||||
],
|
||||
},
|
||||
],
|
||||
|
||||
async run($) {
|
||||
const { boardId, columnTitle, columnType } = $.step.parameters;
|
||||
|
||||
const body = {
|
||||
query: `
|
||||
mutation{
|
||||
create_column (board_id: ${boardId}, title: "${columnTitle}", column_type: ${columnType}) {
|
||||
id
|
||||
title
|
||||
}
|
||||
}`,
|
||||
};
|
||||
|
||||
const { data } = await $.http.post('/', body);
|
||||
|
||||
$.setActionItem({
|
||||
raw: data,
|
||||
});
|
||||
},
|
||||
});
|
112
packages/backend/src/apps/monday/actions/create-item/index.js
Normal file
112
packages/backend/src/apps/monday/actions/create-item/index.js
Normal file
@@ -0,0 +1,112 @@
|
||||
import defineAction from '../../../../helpers/define-action.js';
|
||||
|
||||
export default defineAction({
|
||||
name: 'Create item',
|
||||
key: 'createItem',
|
||||
description: 'Creates a new item in a board.',
|
||||
arguments: [
|
||||
{
|
||||
label: 'Board',
|
||||
key: 'boardId',
|
||||
type: 'dropdown',
|
||||
required: true,
|
||||
description: '',
|
||||
variables: true,
|
||||
source: {
|
||||
type: 'query',
|
||||
name: 'getDynamicData',
|
||||
arguments: [
|
||||
{
|
||||
name: 'key',
|
||||
value: 'listBoards',
|
||||
},
|
||||
],
|
||||
},
|
||||
},
|
||||
{
|
||||
label: 'Group',
|
||||
key: 'groupId',
|
||||
type: 'dropdown',
|
||||
required: false,
|
||||
description: '',
|
||||
dependsOn: ['parameters.boardId'],
|
||||
variables: true,
|
||||
source: {
|
||||
type: 'query',
|
||||
name: 'getDynamicData',
|
||||
arguments: [
|
||||
{
|
||||
name: 'key',
|
||||
value: 'listGroups',
|
||||
},
|
||||
{
|
||||
name: 'parameters.boardId',
|
||||
value: '{parameters.boardId}',
|
||||
},
|
||||
],
|
||||
},
|
||||
},
|
||||
{
|
||||
label: 'Item Name',
|
||||
key: 'itemName',
|
||||
type: 'string',
|
||||
required: true,
|
||||
description: '',
|
||||
variables: true,
|
||||
},
|
||||
{
|
||||
label: 'Subitem Names',
|
||||
key: 'subitemNames',
|
||||
type: 'dynamic',
|
||||
required: false,
|
||||
description: '',
|
||||
fields: [
|
||||
{
|
||||
label: 'Subitem Name',
|
||||
key: 'subitemName',
|
||||
type: 'string',
|
||||
required: false,
|
||||
description: '',
|
||||
variables: true,
|
||||
},
|
||||
],
|
||||
},
|
||||
],
|
||||
|
||||
async run($) {
|
||||
const { boardId, groupId, itemName, subitemNames } = $.step.parameters;
|
||||
const allSubitems = subitemNames.map((entry) => entry.subitemName);
|
||||
|
||||
const body = {
|
||||
query: `
|
||||
mutation {
|
||||
create_item (board_id: ${boardId}${
|
||||
groupId ? `, group_id: "${groupId}"` : ''
|
||||
}, item_name: "${itemName}") {
|
||||
id
|
||||
}
|
||||
}`,
|
||||
};
|
||||
|
||||
const { data } = await $.http.post('/', body);
|
||||
|
||||
const itemId = data.data.create_item.id;
|
||||
|
||||
for (let subitemName of allSubitems) {
|
||||
let body = {
|
||||
query: `
|
||||
mutation {
|
||||
create_subitem (parent_item_id:${itemId}, item_name:"${subitemName}") {
|
||||
id
|
||||
}
|
||||
}`,
|
||||
};
|
||||
|
||||
await $.http.post('/', body);
|
||||
}
|
||||
|
||||
$.setActionItem({
|
||||
raw: data,
|
||||
});
|
||||
},
|
||||
});
|
5
packages/backend/src/apps/monday/actions/index.js
Normal file
5
packages/backend/src/apps/monday/actions/index.js
Normal file
@@ -0,0 +1,5 @@
|
||||
import createBoard from './create-board/index.js';
|
||||
import createColumn from './create-column/index.js';
|
||||
import createItem from './create-item/index.js';
|
||||
|
||||
export default [createBoard, createColumn, createItem];
|
8
packages/backend/src/apps/monday/assets/favicon.svg
Normal file
8
packages/backend/src/apps/monday/assets/favicon.svg
Normal 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 |
21
packages/backend/src/apps/monday/auth/index.js
Normal file
21
packages/backend/src/apps/monday/auth/index.js
Normal 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,
|
||||
};
|
@@ -0,0 +1,8 @@
|
||||
import verifyCredentials from './verify-credentials.js';
|
||||
|
||||
const isStillVerified = async ($) => {
|
||||
await verifyCredentials($);
|
||||
return true;
|
||||
};
|
||||
|
||||
export default isStillVerified;
|
18
packages/backend/src/apps/monday/auth/verify-credentials.js
Normal file
18
packages/backend/src/apps/monday/auth/verify-credentials.js
Normal 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;
|
@@ -0,0 +1,9 @@
|
||||
const addAuthHeader = ($, requestConfig) => {
|
||||
if ($.auth.data?.apiToken) {
|
||||
requestConfig.headers.Authorization = $.auth.data.apiToken;
|
||||
}
|
||||
|
||||
return requestConfig;
|
||||
};
|
||||
|
||||
export default addAuthHeader;
|
4
packages/backend/src/apps/monday/dynamic-data/index.js
Normal file
4
packages/backend/src/apps/monday/dynamic-data/index.js
Normal file
@@ -0,0 +1,4 @@
|
||||
import listBoards from './list-boards/index.js';
|
||||
import listGroups from './list-groups/index.js';
|
||||
|
||||
export default [listBoards, listGroups];
|
@@ -0,0 +1,34 @@
|
||||
export default {
|
||||
name: 'List boards',
|
||||
key: 'listBoards',
|
||||
|
||||
async run($) {
|
||||
const boards = {
|
||||
data: [],
|
||||
};
|
||||
|
||||
const body = {
|
||||
query: `
|
||||
query {
|
||||
boards {
|
||||
id
|
||||
name
|
||||
}
|
||||
}
|
||||
`,
|
||||
};
|
||||
|
||||
const { data } = await $.http.post('/', body);
|
||||
|
||||
if (data.data.boards?.length) {
|
||||
for (const board of data.data.boards) {
|
||||
boards.data.push({
|
||||
value: board.id,
|
||||
name: board.name,
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
return boards;
|
||||
},
|
||||
};
|
@@ -0,0 +1,40 @@
|
||||
export default {
|
||||
name: 'List groups',
|
||||
key: 'listGroups',
|
||||
|
||||
async run($) {
|
||||
const groups = {
|
||||
data: [],
|
||||
};
|
||||
const boardId = $.step.parameters.parameters.boardId;
|
||||
|
||||
if (!boardId) {
|
||||
return groups;
|
||||
}
|
||||
|
||||
const body = {
|
||||
query: `query {
|
||||
boards (ids: ${boardId}) {
|
||||
groups {
|
||||
title
|
||||
id
|
||||
}
|
||||
}
|
||||
}
|
||||
`,
|
||||
};
|
||||
|
||||
const { data } = await $.http.post('/', body);
|
||||
|
||||
if (data.data.boards[0].groups.length) {
|
||||
for (const group of data.data.boards[0].groups) {
|
||||
groups.data.push({
|
||||
value: group.id,
|
||||
name: group.title,
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
return groups;
|
||||
},
|
||||
};
|
22
packages/backend/src/apps/monday/index.js
Normal file
22
packages/backend/src/apps/monday/index.js
Normal file
@@ -0,0 +1,22 @@
|
||||
import defineApp from '../../helpers/define-app.js';
|
||||
import addAuthHeader from './common/add-auth-header.js';
|
||||
import auth from './auth/index.js';
|
||||
import triggers from './triggers/index.js';
|
||||
import actions from './actions/index.js';
|
||||
import dynamicData from './dynamic-data/index.js';
|
||||
|
||||
export default defineApp({
|
||||
name: 'Monday',
|
||||
key: 'monday',
|
||||
iconUrl: '{BASE_URL}/apps/monday/assets/favicon.svg',
|
||||
authDocUrl: '{DOCS_URL}/apps/monday/connection',
|
||||
supportsConnections: true,
|
||||
baseUrl: 'https://monday.com',
|
||||
apiBaseUrl: 'https://api.monday.com/v2',
|
||||
primaryColor: 'F62B54',
|
||||
beforeRequest: [addAuthHeader],
|
||||
auth,
|
||||
triggers,
|
||||
actions,
|
||||
dynamicData,
|
||||
});
|
3
packages/backend/src/apps/monday/triggers/index.js
Normal file
3
packages/backend/src/apps/monday/triggers/index.js
Normal file
@@ -0,0 +1,3 @@
|
||||
import newBoards from './new-boards/index.js';
|
||||
|
||||
export default [newBoards];
|
@@ -0,0 +1,29 @@
|
||||
import defineTrigger from '../../../../helpers/define-trigger.js';
|
||||
|
||||
export default defineTrigger({
|
||||
name: 'New board',
|
||||
key: 'newBoard',
|
||||
pollInterval: 15,
|
||||
description: 'Triggers when a new board is created.',
|
||||
|
||||
async run($) {
|
||||
const body = {
|
||||
query: 'query { boards { id, name } }',
|
||||
};
|
||||
|
||||
const { data } = await $.http.post('/', body);
|
||||
|
||||
if (!data?.data?.boards?.length) {
|
||||
return;
|
||||
}
|
||||
|
||||
for (const board of data.data.boards) {
|
||||
$.pushTriggerItem({
|
||||
raw: board,
|
||||
meta: {
|
||||
internalId: board.id,
|
||||
},
|
||||
});
|
||||
}
|
||||
},
|
||||
});
|
@@ -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],
|
||||
|
@@ -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',
|
||||
|
@@ -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: '',
|
||||
|
@@ -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],
|
||||
|
@@ -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],
|
||||
|
@@ -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',
|
||||
|
@@ -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: '',
|
||||
|
@@ -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,
|
||||
|
@@ -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],
|
||||
|
@@ -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',
|
||||
|
@@ -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: '',
|
||||
|
@@ -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: '',
|
||||
|
@@ -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',
|
||||
|
@@ -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],
|
||||
|
@@ -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: '',
|
||||
|
@@ -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',
|
||||
|
@@ -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: '',
|
||||
|
@@ -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',
|
||||
|
@@ -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',
|
||||
|
@@ -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',
|
||||
|
@@ -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',
|
||||
|
@@ -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',
|
||||
|
@@ -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],
|
||||
|
@@ -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',
|
||||
|
@@ -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',
|
||||
|
@@ -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',
|
||||
|
@@ -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: '',
|
||||
|
@@ -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: '',
|
||||
|
@@ -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],
|
||||
|
@@ -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],
|
||||
|
@@ -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],
|
||||
|
@@ -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,
|
||||
|
@@ -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,
|
||||
};
|
||||
|
@@ -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();
|
||||
};
|
@@ -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();
|
||||
});
|
||||
});
|
@@ -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 () => {
|
||||
|
@@ -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 () => {
|
||||
|
@@ -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 () => {
|
||||
|
@@ -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 () => {
|
||||
|
@@ -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 () => {
|
||||
|
@@ -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 () => {
|
||||
|
@@ -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 () => {
|
||||
|
@@ -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 () => {
|
||||
|
@@ -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 () => {
|
||||
|
@@ -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 () => {
|
||||
|
@@ -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');
|
||||
});
|
||||
|
||||
|
@@ -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 () => {
|
||||
|
@@ -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 () => {
|
||||
|
@@ -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();
|
||||
});
|
||||
|
||||
|
@@ -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 () => {
|
||||
|
@@ -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 () => {
|
||||
|
@@ -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 () => {
|
||||
|
@@ -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 () => {
|
||||
|
@@ -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 () => {
|
||||
|
@@ -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 () => {
|
||||
|
@@ -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');
|
||||
});
|
||||
|
||||
|
@@ -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 () => {
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user