Compare commits
1 Commits
Author | SHA1 | Date | |
---|---|---|---|
![]() |
8e45a42a6b |
@@ -28,7 +28,7 @@ cd packages/web
|
||||
rm -rf .env
|
||||
echo "
|
||||
PORT=$WEB_PORT
|
||||
REACT_APP_BACKEND_URL=http://localhost:$BACKEND_PORT
|
||||
REACT_APP_GRAPHQL_URL=http://localhost:$BACKEND_PORT/graphql
|
||||
" >> .env
|
||||
cd $CURRENT_DIR
|
||||
|
||||
|
@@ -4,9 +4,5 @@
|
||||
**/.devcontainer
|
||||
**/.github
|
||||
**/.vscode
|
||||
**/.env
|
||||
**/.env.test
|
||||
**/.env.production
|
||||
**/yarn-error.log
|
||||
packages/docs
|
||||
packages/e2e-test
|
||||
|
18
.eslintrc.js
Normal file
18
.eslintrc.js
Normal file
@@ -0,0 +1,18 @@
|
||||
module.exports = {
|
||||
root: true,
|
||||
parser: '@typescript-eslint/parser',
|
||||
plugins: ['@typescript-eslint'],
|
||||
extends: [
|
||||
'eslint:recommended',
|
||||
'plugin:@typescript-eslint/recommended',
|
||||
'prettier',
|
||||
],
|
||||
overrides: [
|
||||
{
|
||||
files: ['**/*.test.ts', '**/test/**/*.ts'],
|
||||
rules: {
|
||||
'@typescript-eslint/ban-ts-comment': ['off'],
|
||||
},
|
||||
},
|
||||
],
|
||||
};
|
2
.github/workflows/ci.yml
vendored
2
.github/workflows/ci.yml
vendored
@@ -22,7 +22,7 @@ jobs:
|
||||
- run: echo "💡 The ${{ github.repository }} repository has been cloned to the runner."
|
||||
- run: echo "🖥️ The workflow is now ready to test your code on the runner."
|
||||
- run: yarn --frozen-lockfile
|
||||
- run: cd packages/backend && yarn lint
|
||||
- run: yarn lint
|
||||
- run: echo "🍏 This job's status is ${{ job.status }}."
|
||||
start-backend-server:
|
||||
runs-on: ubuntu-latest
|
||||
|
32
.github/workflows/docs-change.yml
vendored
32
.github/workflows/docs-change.yml
vendored
@@ -1,32 +0,0 @@
|
||||
name: Automatisch Docs Change
|
||||
on:
|
||||
pull_request:
|
||||
paths:
|
||||
- 'packages/docs/**'
|
||||
jobs:
|
||||
label:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v3
|
||||
- name: Label PR
|
||||
uses: actions/github-script@v6
|
||||
with:
|
||||
script: |
|
||||
const { pull_request } = context.payload;
|
||||
|
||||
const label = 'documentation-change';
|
||||
const hasLabel = pull_request.labels.some(({ name }) => name === label);
|
||||
|
||||
if (!hasLabel) {
|
||||
await github.rest.issues.addLabels({
|
||||
owner: context.repo.owner,
|
||||
repo: context.repo.repo,
|
||||
issue_number: pull_request.number,
|
||||
labels: [label],
|
||||
});
|
||||
|
||||
console.log(`Label "${label}" added to PR #${pull_request.number}`);
|
||||
} else {
|
||||
console.log(`Label "${label}" already exists on PR #${pull_request.number}`);
|
||||
}
|
5
.github/workflows/playwright.yml
vendored
5
.github/workflows/playwright.yml
vendored
@@ -62,9 +62,8 @@ jobs:
|
||||
run: yarn && yarn lerna bootstrap
|
||||
- name: Install Playwright Browsers
|
||||
run: yarn playwright install --with-deps
|
||||
- name: Build Automatisch web
|
||||
working-directory: ./packages/web
|
||||
run: yarn build
|
||||
- name: Build Automatisch
|
||||
run: yarn lerna run --scope=@*/{web,cli} build
|
||||
env:
|
||||
# Keep this until we clean up warnings in build processes
|
||||
CI: false
|
||||
|
@@ -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"]
|
||||
|
@@ -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
|
||||
|
@@ -6,6 +6,7 @@
|
||||
"start": "lerna run --stream --parallel --scope=@*/{web,backend} dev",
|
||||
"start:web": "lerna run --stream --scope=@*/web dev",
|
||||
"start:backend": "lerna run --stream --scope=@*/backend dev",
|
||||
"lint": "lerna run --no-bail --stream --parallel --scope=@*/{web,backend} lint",
|
||||
"build:docs": "cd ./packages/docs && yarn install && yarn build"
|
||||
},
|
||||
"workspaces": {
|
||||
@@ -20,6 +21,8 @@
|
||||
]
|
||||
},
|
||||
"devDependencies": {
|
||||
"@typescript-eslint/eslint-plugin": "^5.9.1",
|
||||
"@typescript-eslint/parser": "^5.9.1",
|
||||
"eslint": "^8.13.0",
|
||||
"eslint-config-prettier": "^8.3.0",
|
||||
"eslint-plugin-prettier": "^4.0.0",
|
||||
|
@@ -11,7 +11,7 @@
|
||||
"start:worker": "node src/worker.js",
|
||||
"pretest": "APP_ENV=test node ./test/setup/prepare-test-env.js",
|
||||
"test": "APP_ENV=test vitest run",
|
||||
"lint": "eslint .",
|
||||
"lint": "eslint . --ignore-path ../../.eslintignore",
|
||||
"db:create": "node ./bin/database/create.js",
|
||||
"db:seed:user": "node ./bin/database/seed-user.js",
|
||||
"db:drop": "node ./bin/database/drop.js",
|
||||
@@ -31,14 +31,13 @@
|
||||
"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",
|
||||
"debug": "~2.6.9",
|
||||
"dotenv": "^10.0.0",
|
||||
"express": "~4.18.2",
|
||||
"express-async-handler": "^1.2.0",
|
||||
"express-basic-auth": "^1.2.1",
|
||||
"express-graphql": "^0.12.0",
|
||||
"fast-xml-parser": "^4.0.11",
|
||||
@@ -95,7 +94,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"
|
||||
|
@@ -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],
|
||||
|
@@ -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',
|
||||
|
@@ -1,27 +0,0 @@
|
||||
import defineAction from '../../../../helpers/define-action.js';
|
||||
|
||||
export default defineAction({
|
||||
name: 'Get value',
|
||||
key: 'getValue',
|
||||
description: 'Get value from the persistent datastore.',
|
||||
arguments: [
|
||||
{
|
||||
label: 'Key',
|
||||
key: 'key',
|
||||
type: 'string',
|
||||
required: true,
|
||||
description: 'The key of your value to get.',
|
||||
variables: true,
|
||||
},
|
||||
],
|
||||
|
||||
async run($) {
|
||||
const keyValuePair = await $.datastore.get({
|
||||
key: $.step.parameters.key,
|
||||
});
|
||||
|
||||
$.setActionItem({
|
||||
raw: keyValuePair,
|
||||
});
|
||||
},
|
||||
});
|
@@ -1,4 +0,0 @@
|
||||
import getValue from './get-value/index.js';
|
||||
import setValue from './set-value/index.js';
|
||||
|
||||
export default [getValue, setValue];
|
@@ -1,36 +0,0 @@
|
||||
import defineAction from '../../../../helpers/define-action.js';
|
||||
|
||||
export default defineAction({
|
||||
name: 'Set value',
|
||||
key: 'setValue',
|
||||
description: 'Set value to the persistent datastore.',
|
||||
arguments: [
|
||||
{
|
||||
label: 'Key',
|
||||
key: 'key',
|
||||
type: 'string',
|
||||
required: true,
|
||||
description: 'The key of your value to set.',
|
||||
variables: true,
|
||||
},
|
||||
{
|
||||
label: 'Value',
|
||||
key: 'value',
|
||||
type: 'string',
|
||||
required: true,
|
||||
description: 'The value to set.',
|
||||
variables: true,
|
||||
},
|
||||
],
|
||||
|
||||
async run($) {
|
||||
const keyValuePair = await $.datastore.set({
|
||||
key: $.step.parameters.key,
|
||||
value: $.step.parameters.value,
|
||||
});
|
||||
|
||||
$.setActionItem({
|
||||
raw: keyValuePair,
|
||||
});
|
||||
},
|
||||
});
|
@@ -1,13 +0,0 @@
|
||||
<?xml version="1.0"?>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" fill="#000000" width="800px" height="800px" viewBox="0 0 32 32" id="icon">
|
||||
<defs>
|
||||
<style>.cls-1{fill:none;}</style>
|
||||
</defs>
|
||||
<title>datastore</title>
|
||||
<circle cx="23" cy="23" r="1"/>
|
||||
<rect x="8" y="22" width="12" height="2"/>
|
||||
<circle cx="23" cy="9" r="1"/>
|
||||
<rect x="8" y="8" width="12" height="2"/>
|
||||
<path d="M26,14a2,2,0,0,0,2-2V6a2,2,0,0,0-2-2H6A2,2,0,0,0,4,6v6a2,2,0,0,0,2,2H8v4H6a2,2,0,0,0-2,2v6a2,2,0,0,0,2,2H26a2,2,0,0,0,2-2V20a2,2,0,0,0-2-2H24V14ZM6,6H26v6H6ZM26,26H6V20H26Zm-4-8H10V14H22Z"/>
|
||||
<rect id="_Transparent_Rectangle_" data-name="<Transparent Rectangle>" class="cls-1" width="32" height="32"/>
|
||||
</svg>
|
Before Width: | Height: | Size: 704 B |
@@ -1,14 +0,0 @@
|
||||
import defineApp from '../../helpers/define-app.js';
|
||||
import actions from './actions/index.js';
|
||||
|
||||
export default defineApp({
|
||||
name: 'Datastore',
|
||||
key: 'datastore',
|
||||
iconUrl: '{BASE_URL}/apps/datastore/assets/favicon.svg',
|
||||
authDocUrl: '{DOCS_URL}/apps/datastore/connection',
|
||||
supportsConnections: false,
|
||||
baseUrl: '',
|
||||
apiBaseUrl: '',
|
||||
primaryColor: '001F52',
|
||||
actions,
|
||||
});
|
@@ -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',
|
||||
|
@@ -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: '',
|
||||
|
@@ -0,0 +1,120 @@
|
||||
import defineAction from '../../../../helpers/define-action.js';
|
||||
|
||||
export default defineAction({
|
||||
name: 'Change a scheduled event',
|
||||
key: 'changeScheduledEvent',
|
||||
description: 'Changes a scheduled event',
|
||||
arguments: [
|
||||
{
|
||||
label: 'Scheduled Event',
|
||||
key: 'scheduledEventId',
|
||||
type: 'dropdown',
|
||||
required: true,
|
||||
description: '',
|
||||
variables: false,
|
||||
source: {
|
||||
type: 'query',
|
||||
name: 'getDynamicData',
|
||||
arguments: [
|
||||
{
|
||||
name: 'key',
|
||||
value: 'listScheduledEvents',
|
||||
},
|
||||
],
|
||||
},
|
||||
},
|
||||
{
|
||||
label: 'Status',
|
||||
key: 'status',
|
||||
type: 'dropdown',
|
||||
required: false,
|
||||
description:
|
||||
'After the status has been changed to COMPLETED or CANCELED, it becomes immutable and cannot be modified further.',
|
||||
variables: true,
|
||||
options: [
|
||||
{ label: 'SCHEDULED', value: 1 },
|
||||
{ label: 'ACTIVE', value: 2 },
|
||||
{ label: 'COMPLETED', value: 3 },
|
||||
{ label: 'CANCELED', value: 4 },
|
||||
],
|
||||
},
|
||||
{
|
||||
label: 'Type',
|
||||
key: 'entityType',
|
||||
type: 'dropdown',
|
||||
required: true,
|
||||
variables: true,
|
||||
options: [
|
||||
{ label: 'Stage channel', value: 1 },
|
||||
{ label: 'Voice channel', value: 2 },
|
||||
{ label: 'External', value: 3 },
|
||||
],
|
||||
additionalFields: {
|
||||
type: 'query',
|
||||
name: 'getDynamicFields',
|
||||
arguments: [
|
||||
{
|
||||
name: 'key',
|
||||
value: 'listScheduledEventFieldsForChange',
|
||||
},
|
||||
{
|
||||
name: 'parameters.entityType',
|
||||
value: '{parameters.entityType}',
|
||||
},
|
||||
],
|
||||
},
|
||||
},
|
||||
{
|
||||
label: 'Name',
|
||||
key: 'name',
|
||||
type: 'string',
|
||||
required: false,
|
||||
variables: true,
|
||||
},
|
||||
{
|
||||
label: 'Description',
|
||||
key: 'description',
|
||||
type: 'string',
|
||||
required: false,
|
||||
variables: true,
|
||||
},
|
||||
{
|
||||
label: 'Image',
|
||||
key: 'image',
|
||||
type: 'string',
|
||||
required: false,
|
||||
description:
|
||||
'Image as DataURI scheme [data:image/<jpeg/png/gif>;base64,BASE64_ENCODED_<JPEG/PNG/GIF>_IMAGE_DATA]',
|
||||
variables: true,
|
||||
},
|
||||
],
|
||||
|
||||
async run($) {
|
||||
const data = {
|
||||
channel_id: $.step.parameters.channel_id,
|
||||
name: $.step.parameters.name,
|
||||
scheduled_start_time: $.step.parameters.scheduledStartTime,
|
||||
scheduled_end_time: $.step.parameters.scheduledEndTime,
|
||||
description: $.step.parameters.description,
|
||||
entity_type: $.step.parameters.entityType,
|
||||
image: $.step.parameters.image,
|
||||
};
|
||||
|
||||
const isExternal = $.step.parameters.entityType === 3;
|
||||
|
||||
if (isExternal) {
|
||||
data.entity_metadata = {
|
||||
location: $.step.parameters.location,
|
||||
};
|
||||
|
||||
data.channel_id = null;
|
||||
}
|
||||
|
||||
const response = await $.http?.patch(
|
||||
`/guilds/${$.auth.data.guildId}/scheduled-events/${$.step.parameters.scheduledEventId}`,
|
||||
data
|
||||
);
|
||||
|
||||
$.setActionItem({ raw: response.data });
|
||||
},
|
||||
});
|
@@ -1,4 +1,9 @@
|
||||
import changeScheduledEvent from './change-scheduled-event/index.js';
|
||||
import sendMessageToChannel from './send-message-to-channel/index.js';
|
||||
import createScheduledEvent from './create-scheduled-event/index.js';
|
||||
|
||||
export default [sendMessageToChannel, createScheduledEvent];
|
||||
export default [
|
||||
changeScheduledEvent,
|
||||
sendMessageToChannel,
|
||||
createScheduledEvent,
|
||||
];
|
||||
|
@@ -1,4 +1,5 @@
|
||||
import listChannels from './list-channels/index.js';
|
||||
import listScheduledEvents from './list-scheduled-events/index.js';
|
||||
import listVoiceChannels from './list-voice-channels/index.js';
|
||||
|
||||
export default [listChannels, listVoiceChannels];
|
||||
export default [listChannels, listScheduledEvents, listVoiceChannels];
|
||||
|
@@ -0,0 +1,24 @@
|
||||
export default {
|
||||
name: 'List scheduled events',
|
||||
key: 'listScheduledEvents',
|
||||
|
||||
async run($) {
|
||||
const scheduledEvents = {
|
||||
data: [],
|
||||
error: null,
|
||||
};
|
||||
|
||||
const response = await $.http.get(
|
||||
`/guilds/${$.auth.data.guildId}/scheduled-events`
|
||||
);
|
||||
|
||||
scheduledEvents.data = response.data.map((scheduledEvent) => {
|
||||
return {
|
||||
value: scheduledEvent.id,
|
||||
name: scheduledEvent.name,
|
||||
};
|
||||
});
|
||||
|
||||
return scheduledEvents;
|
||||
},
|
||||
};
|
@@ -1,3 +1,7 @@
|
||||
import listExternalScheduledEventFields from './list-external-scheduled-event-fields/index.js';
|
||||
import listScheduledEventFieldsForChange from './list-scheduled-event-fields-for-change/index.js';
|
||||
|
||||
export default [listExternalScheduledEventFields];
|
||||
export default [
|
||||
listExternalScheduledEventFields,
|
||||
listScheduledEventFieldsForChange,
|
||||
];
|
||||
|
@@ -0,0 +1,87 @@
|
||||
export default {
|
||||
name: 'List scheduled event fields for change',
|
||||
key: 'listScheduledEventFieldsForChange',
|
||||
|
||||
async run($) {
|
||||
const isExternal = $.step.parameters.entityType === 3;
|
||||
|
||||
if (isExternal) {
|
||||
return [
|
||||
{
|
||||
label: 'Location',
|
||||
key: 'location',
|
||||
type: 'string',
|
||||
required: true,
|
||||
description:
|
||||
'The location of the event (1-100 characters). This will be omitted if type is NOT EXTERNAL',
|
||||
variables: true,
|
||||
},
|
||||
{
|
||||
label: 'Start-Time',
|
||||
key: 'scheduledStartTime',
|
||||
type: 'string',
|
||||
required: false,
|
||||
description: 'The time the event will start [ISO8601]',
|
||||
variables: true,
|
||||
},
|
||||
{
|
||||
label: 'End-Time',
|
||||
key: 'scheduledEndTime',
|
||||
type: 'string',
|
||||
required: true,
|
||||
description:
|
||||
'The time the event will end [ISO8601]. This will be omitted if type is NOT EXTERNAL',
|
||||
variables: true,
|
||||
},
|
||||
];
|
||||
}
|
||||
|
||||
return [
|
||||
{
|
||||
label: 'Channel',
|
||||
key: 'channel_id',
|
||||
type: 'dropdown',
|
||||
required: true,
|
||||
description:
|
||||
'Pick a voice or stage channel to link the event to. This will be omitted if type is EXTERNAL',
|
||||
variables: true,
|
||||
source: {
|
||||
type: 'query',
|
||||
name: 'getDynamicData',
|
||||
arguments: [
|
||||
{
|
||||
name: 'key',
|
||||
value: 'listVoiceChannels',
|
||||
},
|
||||
],
|
||||
},
|
||||
},
|
||||
{
|
||||
label: 'Location',
|
||||
key: 'location',
|
||||
type: 'string',
|
||||
required: false,
|
||||
description:
|
||||
'The location of the event (1-100 characters). This will be omitted if type is NOT EXTERNAL',
|
||||
variables: true,
|
||||
},
|
||||
{
|
||||
label: 'Start-Time',
|
||||
key: 'scheduledStartTime',
|
||||
type: 'string',
|
||||
required: false,
|
||||
description: 'The time the event will start [ISO8601]',
|
||||
variables: true,
|
||||
},
|
||||
{
|
||||
label: 'End-Time',
|
||||
key: 'scheduledEndTime',
|
||||
type: 'string',
|
||||
required: false,
|
||||
description:
|
||||
'The time the event will end [ISO8601]. This will be omitted if type is NOT EXTERNAL',
|
||||
variables: true,
|
||||
},
|
||||
];
|
||||
},
|
||||
};
|
@@ -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',
|
||||
|
@@ -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',
|
||||
|
@@ -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: '',
|
||||
|
@@ -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,
|
||||
|
@@ -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',
|
||||
|
@@ -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: '',
|
||||
|
@@ -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],
|
||||
|
@@ -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],
|
||||
|
@@ -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],
|
||||
|
@@ -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],
|
||||
|
@@ -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],
|
||||
|
@@ -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],
|
||||
|
@@ -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],
|
||||
|
@@ -1,3 +1,4 @@
|
||||
import FormData from 'form-data';
|
||||
import defineAction from '../../../../helpers/define-action.js';
|
||||
|
||||
export default defineAction({
|
||||
@@ -5,51 +6,45 @@ export default defineAction({
|
||||
key: 'newChat',
|
||||
description: 'Create a new chat session for Helix AI.',
|
||||
arguments: [
|
||||
{
|
||||
label: 'Session ID',
|
||||
key: 'sessionId',
|
||||
type: 'string',
|
||||
required: false,
|
||||
description:
|
||||
'ID of the chat session to continue. Leave empty to start a new chat.',
|
||||
variables: true,
|
||||
},
|
||||
{
|
||||
label: 'System Prompt',
|
||||
key: 'systemPrompt',
|
||||
type: 'string',
|
||||
required: false,
|
||||
description:
|
||||
'Optional system prompt to start the chat with. It will be used only for new chat sessions.',
|
||||
variables: true,
|
||||
},
|
||||
{
|
||||
label: 'Input',
|
||||
key: 'input',
|
||||
type: 'string',
|
||||
required: true,
|
||||
description: 'User input to start the chat with.',
|
||||
description: 'Prompt to start the chat with.',
|
||||
variables: true,
|
||||
},
|
||||
],
|
||||
|
||||
async run($) {
|
||||
const response = await $.http.post('/api/v1/sessions/chat', {
|
||||
session_id: $.step.parameters.sessionId,
|
||||
system: $.step.parameters.systemPrompt,
|
||||
messages: [
|
||||
{
|
||||
role: 'user',
|
||||
content: {
|
||||
content_type: 'text',
|
||||
parts: [$.step.parameters.input],
|
||||
},
|
||||
},
|
||||
],
|
||||
const formData = new FormData();
|
||||
formData.append('input', $.step.parameters.input);
|
||||
formData.append('mode', 'inference');
|
||||
formData.append('type', 'text');
|
||||
|
||||
const sessionResponse = await $.http.post('/api/v1/sessions', formData, {
|
||||
headers: {
|
||||
...formData.getHeaders(),
|
||||
},
|
||||
});
|
||||
|
||||
$.setActionItem({
|
||||
raw: response.data,
|
||||
});
|
||||
const sessionId = sessionResponse.data.id;
|
||||
|
||||
let chatGenerated = false;
|
||||
|
||||
while (!chatGenerated) {
|
||||
const response = await $.http.get(`/api/v1/sessions/${sessionId}`);
|
||||
|
||||
const message =
|
||||
response.data.interactions[response.data.interactions.length - 1];
|
||||
|
||||
if (message.creator === 'system' && message.state === 'complete') {
|
||||
$.setActionItem({
|
||||
raw: message,
|
||||
});
|
||||
|
||||
chatGenerated = true;
|
||||
}
|
||||
}
|
||||
},
|
||||
});
|
||||
|
@@ -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],
|
||||
|
@@ -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');
|
||||
}
|
||||
|
||||
|
@@ -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: '',
|
||||
|
@@ -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',
|
||||
|
@@ -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],
|
||||
|
@@ -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',
|
||||
|
@@ -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],
|
||||
|
@@ -1,70 +0,0 @@
|
||||
import defineAction from '../../../../helpers/define-action.js';
|
||||
|
||||
export default defineAction({
|
||||
name: 'Create board',
|
||||
key: 'createBoard',
|
||||
description: 'Creates a new board.',
|
||||
arguments: [
|
||||
{
|
||||
label: 'Board Name',
|
||||
key: 'boardName',
|
||||
type: 'string',
|
||||
required: true,
|
||||
description: 'Title for the board.',
|
||||
variables: true,
|
||||
},
|
||||
{
|
||||
label: 'Board Kind',
|
||||
key: 'boardKind',
|
||||
type: 'dropdown',
|
||||
required: true,
|
||||
description: '',
|
||||
variables: true,
|
||||
options: [
|
||||
{
|
||||
label: 'Main',
|
||||
value: 'public',
|
||||
},
|
||||
{
|
||||
label: 'Private',
|
||||
value: 'private',
|
||||
},
|
||||
{
|
||||
label: 'Shareable',
|
||||
value: 'share',
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
label: 'Template ID',
|
||||
key: 'templateId',
|
||||
type: 'string',
|
||||
required: false,
|
||||
description:
|
||||
"When you switch on developer mode, you'll spot the template IDs in your template store. Additionally, you have the option to utilize the Board ID from any board you've saved as a template.",
|
||||
variables: true,
|
||||
},
|
||||
],
|
||||
|
||||
async run($) {
|
||||
const { boardName, boardKind, templateId } = $.step.parameters;
|
||||
|
||||
const body = {
|
||||
query: `mutation {
|
||||
create_board (board_name: "${boardName}", board_kind: ${boardKind}${
|
||||
templateId ? `, template_id: ${templateId}` : ''
|
||||
}) {
|
||||
id
|
||||
name
|
||||
board_kind
|
||||
}
|
||||
}`,
|
||||
};
|
||||
|
||||
const { data } = await $.http.post('/', body);
|
||||
|
||||
$.setActionItem({
|
||||
raw: data,
|
||||
});
|
||||
},
|
||||
});
|
@@ -1,3 +0,0 @@
|
||||
import createBoard from './create-board/index.js';
|
||||
|
||||
export default [createBoard];
|
@@ -1,8 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<svg width="256px" height="156px" viewBox="0 0 256 156" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" preserveAspectRatio="xMidYMid">
|
||||
<g>
|
||||
<path d="M31.8458633,153.488694 C20.3244423,153.513586 9.68073708,147.337265 3.98575204,137.321731 C-1.62714067,127.367831 -1.29055839,115.129325 4.86093879,105.498969 L62.2342919,15.4033556 C68.2125882,5.54538256 79.032489,-0.333585033 90.5563073,0.0146553508 C102.071737,0.290611552 112.546041,6.74705604 117.96667,16.9106216 C123.315033,27.0238906 122.646488,39.1914174 116.240607,48.6847625 L58.9037201,138.780375 C52.9943022,147.988884 42.7873202,153.537154 31.8458633,153.488694 L31.8458633,153.488694 Z" fill="#F62B54"></path>
|
||||
<path d="M130.25575,153.488484 C118.683837,153.488484 108.035731,147.301291 102.444261,137.358197 C96.8438154,127.431292 97.1804475,115.223704 103.319447,105.620522 L160.583402,15.7315506 C166.47539,5.73210989 177.327374,-0.284878136 188.929728,0.0146553508 C200.598885,0.269918151 211.174058,6.7973526 216.522421,17.0078646 C221.834319,27.2183766 221.056375,39.4588356 214.456008,48.9278699 L157.204209,138.816842 C151.313487,147.985468 141.153618,153.5168 130.25575,153.488484 Z" fill="#FFCC00"></path>
|
||||
<ellipse fill="#00CA72" cx="226.465527" cy="125.324379" rx="29.5375538" ry="28.9176274"></ellipse>
|
||||
</g>
|
||||
</svg>
|
Before Width: | Height: | Size: 1.4 KiB |
@@ -1,21 +0,0 @@
|
||||
import verifyCredentials from './verify-credentials.js';
|
||||
import isStillVerified from './is-still-verified.js';
|
||||
|
||||
export default {
|
||||
fields: [
|
||||
{
|
||||
key: 'apiToken',
|
||||
label: 'API Token',
|
||||
type: 'string',
|
||||
required: true,
|
||||
readOnly: false,
|
||||
value: null,
|
||||
placeholder: null,
|
||||
description: 'Monday.com API token of your account.',
|
||||
clickToCopy: false,
|
||||
},
|
||||
],
|
||||
|
||||
verifyCredentials,
|
||||
isStillVerified,
|
||||
};
|
@@ -1,8 +0,0 @@
|
||||
import verifyCredentials from './verify-credentials.js';
|
||||
|
||||
const isStillVerified = async ($) => {
|
||||
await verifyCredentials($);
|
||||
return true;
|
||||
};
|
||||
|
||||
export default isStillVerified;
|
@@ -1,18 +0,0 @@
|
||||
const verifyCredentials = async ($) => {
|
||||
const body = {
|
||||
query: 'query { me { name, email } }',
|
||||
};
|
||||
|
||||
const { data } = await $.http.post('/', body);
|
||||
|
||||
const screenName = [data.data.me.name, data.data.me.email]
|
||||
.filter(Boolean)
|
||||
.join(' @ ');
|
||||
|
||||
await $.auth.set({
|
||||
screenName,
|
||||
apiToken: $.auth.data.apiToken,
|
||||
});
|
||||
};
|
||||
|
||||
export default verifyCredentials;
|
@@ -1,9 +0,0 @@
|
||||
const addAuthHeader = ($, requestConfig) => {
|
||||
if ($.auth.data?.apiToken) {
|
||||
requestConfig.headers.Authorization = $.auth.data.apiToken;
|
||||
}
|
||||
|
||||
return requestConfig;
|
||||
};
|
||||
|
||||
export default addAuthHeader;
|
@@ -1,20 +0,0 @@
|
||||
import defineApp from '../../helpers/define-app.js';
|
||||
import addAuthHeader from './common/add-auth-header.js';
|
||||
import auth from './auth/index.js';
|
||||
import triggers from './triggers/index.js';
|
||||
import actions from './actions/index.js';
|
||||
|
||||
export default defineApp({
|
||||
name: 'Monday',
|
||||
key: 'monday',
|
||||
iconUrl: '{BASE_URL}/apps/monday/assets/favicon.svg',
|
||||
authDocUrl: '{DOCS_URL}/apps/monday/connection',
|
||||
supportsConnections: true,
|
||||
baseUrl: 'https://monday.com',
|
||||
apiBaseUrl: 'https://api.monday.com/v2',
|
||||
primaryColor: 'F62B54',
|
||||
beforeRequest: [addAuthHeader],
|
||||
auth,
|
||||
triggers,
|
||||
actions,
|
||||
});
|
@@ -1,3 +0,0 @@
|
||||
import newBoards from './new-boards/index.js';
|
||||
|
||||
export default [newBoards];
|
@@ -1,29 +0,0 @@
|
||||
import defineTrigger from '../../../../helpers/define-trigger.js';
|
||||
|
||||
export default defineTrigger({
|
||||
name: 'New board',
|
||||
key: 'newBoard',
|
||||
pollInterval: 15,
|
||||
description: 'Triggers when a new board is created.',
|
||||
|
||||
async run($) {
|
||||
const body = {
|
||||
query: 'query { boards { id, name } }',
|
||||
};
|
||||
|
||||
const { data } = await $.http.post('/', body);
|
||||
|
||||
if (!data?.data?.boards?.length) {
|
||||
return;
|
||||
}
|
||||
|
||||
for (const board of data.data.boards) {
|
||||
$.pushTriggerItem({
|
||||
raw: board,
|
||||
meta: {
|
||||
internalId: board.id,
|
||||
},
|
||||
});
|
||||
}
|
||||
},
|
||||
});
|
@@ -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],
|
||||
|
@@ -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',
|
||||
|
@@ -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: '',
|
||||
|
@@ -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],
|
||||
|
@@ -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',
|
||||
|
@@ -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,
|
||||
];
|
||||
|
@@ -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;
|
||||
},
|
||||
};
|
@@ -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],
|
||||
|
@@ -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',
|
||||
|
@@ -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: '',
|
||||
|
@@ -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,
|
||||
|
@@ -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],
|
||||
|
@@ -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',
|
||||
|
@@ -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: '',
|
||||
|
@@ -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: '',
|
||||
|
@@ -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',
|
||||
|
@@ -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],
|
||||
|
@@ -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: '',
|
||||
|
@@ -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',
|
||||
|
@@ -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: '',
|
||||
|
@@ -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',
|
||||
|
@@ -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',
|
||||
|
@@ -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',
|
||||
|
@@ -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',
|
||||
|
@@ -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',
|
||||
|
@@ -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],
|
||||
|
@@ -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',
|
||||
|
@@ -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',
|
||||
|
@@ -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',
|
||||
|
@@ -1,3 +0,0 @@
|
||||
import respondWith from './respond-with/index.js';
|
||||
|
||||
export default [respondWith];
|
@@ -1,69 +0,0 @@
|
||||
import defineAction from '../../../../helpers/define-action.js';
|
||||
|
||||
export default defineAction({
|
||||
name: 'Respond with',
|
||||
key: 'respondWith',
|
||||
description: 'Respond with defined JSON body.',
|
||||
arguments: [
|
||||
{
|
||||
label: 'Status code',
|
||||
key: 'statusCode',
|
||||
type: 'string',
|
||||
required: true,
|
||||
variables: true,
|
||||
value: '200',
|
||||
},
|
||||
{
|
||||
label: 'Headers',
|
||||
key: 'headers',
|
||||
type: 'dynamic',
|
||||
required: false,
|
||||
description: 'Add or remove headers as needed',
|
||||
fields: [
|
||||
{
|
||||
label: 'Key',
|
||||
key: 'key',
|
||||
type: 'string',
|
||||
required: true,
|
||||
description: 'Header key',
|
||||
variables: true,
|
||||
},
|
||||
{
|
||||
label: 'Value',
|
||||
key: 'value',
|
||||
type: 'string',
|
||||
required: true,
|
||||
description: 'Header value',
|
||||
variables: true,
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
label: 'Body',
|
||||
key: 'body',
|
||||
type: 'string',
|
||||
required: true,
|
||||
description: 'The content of the response body.',
|
||||
variables: true,
|
||||
},
|
||||
],
|
||||
|
||||
async run($) {
|
||||
const statusCode = parseInt($.step.parameters.statusCode, 10);
|
||||
const body = $.step.parameters.body;
|
||||
const headers = $.step.parameters.headers.reduce((result, entry) => {
|
||||
return {
|
||||
...result,
|
||||
[entry.key]: entry.value,
|
||||
};
|
||||
}, {});
|
||||
|
||||
$.setActionItem({
|
||||
raw: {
|
||||
headers,
|
||||
body,
|
||||
statusCode,
|
||||
},
|
||||
});
|
||||
},
|
||||
});
|
@@ -1,16 +1,14 @@
|
||||
import defineApp from '../../helpers/define-app.js';
|
||||
import actions from './actions/index.js';
|
||||
import triggers from './triggers/index.js';
|
||||
|
||||
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: '',
|
||||
primaryColor: '0059F7',
|
||||
actions,
|
||||
triggers,
|
||||
});
|
||||
|
@@ -7,20 +7,7 @@ export default defineTrigger({
|
||||
key: 'catchRawWebhook',
|
||||
type: 'webhook',
|
||||
showWebhookUrl: true,
|
||||
description:
|
||||
'Triggers (immediately if configured) when the webhook receives a request.',
|
||||
arguments: [
|
||||
{
|
||||
label: 'Wait until flow is done',
|
||||
key: 'workSynchronously',
|
||||
type: 'dropdown',
|
||||
required: true,
|
||||
options: [
|
||||
{ label: 'Yes', value: true },
|
||||
{ label: 'No', value: false },
|
||||
],
|
||||
},
|
||||
],
|
||||
description: 'Triggers when the webhook receives a request.',
|
||||
|
||||
async run($) {
|
||||
const dataItem = {
|
||||
|
@@ -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: '',
|
||||
|
@@ -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],
|
||||
|
@@ -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],
|
||||
|
@@ -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],
|
||||
|
@@ -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,
|
||||
|
@@ -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,
|
||||
};
|
||||
|
@@ -1,13 +0,0 @@
|
||||
import User from '../../../../models/user.js';
|
||||
import { renderObject, renderError } from '../../../../helpers/renderer.js';
|
||||
|
||||
export default async (request, response) => {
|
||||
const { email, password } = request.body;
|
||||
const token = await User.authenticate(email, password);
|
||||
|
||||
if (token) {
|
||||
return renderObject(response, { token });
|
||||
}
|
||||
|
||||
renderError(response, [{ general: ['Incorrect email or password.'] }]);
|
||||
};
|
@@ -1,39 +0,0 @@
|
||||
import { describe, it, expect, beforeEach } from 'vitest';
|
||||
import request from 'supertest';
|
||||
import app from '../../../../app.js';
|
||||
import { createUser } from '../../../../../test/factories/user';
|
||||
|
||||
describe('POST /api/v1/access-tokens', () => {
|
||||
beforeEach(async () => {
|
||||
await createUser({
|
||||
email: 'user@automatisch.io',
|
||||
password: 'password',
|
||||
});
|
||||
});
|
||||
|
||||
it('should return the token data with correct credentials', async () => {
|
||||
const response = await request(app)
|
||||
.post('/api/v1/access-tokens')
|
||||
.send({
|
||||
email: 'user@automatisch.io',
|
||||
password: 'password',
|
||||
})
|
||||
.expect(200);
|
||||
|
||||
expect(response.body.data.token.length).toBeGreaterThan(0);
|
||||
});
|
||||
|
||||
it('should return error with incorrect credentials', async () => {
|
||||
const response = await request(app)
|
||||
.post('/api/v1/access-tokens')
|
||||
.send({
|
||||
email: 'incorrect@email.com',
|
||||
password: 'incorrectpassword',
|
||||
})
|
||||
.expect(422);
|
||||
|
||||
expect(response.body.errors.general).toEqual([
|
||||
'Incorrect email or password.',
|
||||
]);
|
||||
});
|
||||
});
|
@@ -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();
|
||||
};
|
@@ -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();
|
||||
});
|
||||
});
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user