Compare commits
	
		
			1 Commits
		
	
	
		
			gitea
			...
			gmail-inte
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|   | b594a8e0f3 | 
| @@ -4,9 +4,5 @@ | |||||||
| **/.devcontainer | **/.devcontainer | ||||||
| **/.github | **/.github | ||||||
| **/.vscode | **/.vscode | ||||||
| **/.env |  | ||||||
| **/.env.test |  | ||||||
| **/.env.production |  | ||||||
| **/yarn-error.log |  | ||||||
| packages/docs | packages/docs | ||||||
| packages/e2e-test | packages/e2e-test | ||||||
|   | |||||||
| @@ -1,25 +1,14 @@ | |||||||
| # syntax=docker/dockerfile:1 | # syntax=docker/dockerfile:1 | ||||||
| FROM node:18-alpine | FROM node:18-alpine | ||||||
|  |  | ||||||
| ENV PORT 3000 |  | ||||||
|  |  | ||||||
| RUN \ |  | ||||||
|   apk --no-cache add --virtual build-dependencies python3 build-base git |  | ||||||
|  |  | ||||||
| WORKDIR /automatisch | WORKDIR /automatisch | ||||||
|  |  | ||||||
| # copy the app, note .dockerignore |  | ||||||
| COPY . /automatisch |  | ||||||
|  |  | ||||||
| RUN yarn |  | ||||||
|  |  | ||||||
| RUN cd packages/web && yarn build |  | ||||||
|  |  | ||||||
| RUN \ | RUN \ | ||||||
|  |   apk --no-cache add --virtual build-dependencies python3 build-base && \ | ||||||
|  |   yarn global add @automatisch/cli@0.10.0 --network-timeout 1000000 && \ | ||||||
|   rm -rf /usr/local/share/.cache/ && \ |   rm -rf /usr/local/share/.cache/ && \ | ||||||
|   apk del build-dependencies |   apk del build-dependencies | ||||||
|  |  | ||||||
| COPY ./docker/entrypoint.sh /entrypoint.sh | COPY ./entrypoint.sh /entrypoint.sh | ||||||
|  |  | ||||||
| EXPOSE 3000 | EXPOSE 3000 | ||||||
| ENTRYPOINT ["sh", "/entrypoint.sh"] | ENTRYPOINT ["sh", "/entrypoint.sh"] | ||||||
|   | |||||||
| @@ -2,12 +2,8 @@ | |||||||
|  |  | ||||||
| set -e | set -e | ||||||
|  |  | ||||||
| cd packages/backend |  | ||||||
|  |  | ||||||
| if [ -n "$WORKER" ]; then | if [ -n "$WORKER" ]; then | ||||||
|   yarn start:worker |   automatisch start-worker | ||||||
| else | else | ||||||
|   yarn db:migrate |   automatisch start | ||||||
|   yarn db:seed:user |  | ||||||
|   yarn start |  | ||||||
| fi | fi | ||||||
|   | |||||||
| @@ -31,7 +31,7 @@ | |||||||
|     "accounting": "^0.4.1", |     "accounting": "^0.4.1", | ||||||
|     "ajv-formats": "^2.1.1", |     "ajv-formats": "^2.1.1", | ||||||
|     "axios": "1.6.0", |     "axios": "1.6.0", | ||||||
|     "bcrypt": "^5.1.0", |     "bcrypt": "^5.0.1", | ||||||
|     "bullmq": "^3.0.0", |     "bullmq": "^3.0.0", | ||||||
|     "cors": "^2.8.5", |     "cors": "^2.8.5", | ||||||
|     "crypto-js": "^4.1.1", |     "crypto-js": "^4.1.1", | ||||||
| @@ -95,7 +95,6 @@ | |||||||
|     "url": "https://github.com/automatisch/automatisch/issues" |     "url": "https://github.com/automatisch/automatisch/issues" | ||||||
|   }, |   }, | ||||||
|   "devDependencies": { |   "devDependencies": { | ||||||
|     "node-gyp": "^10.1.0", |  | ||||||
|     "nodemon": "^2.0.13", |     "nodemon": "^2.0.13", | ||||||
|     "supertest": "^6.3.3", |     "supertest": "^6.3.3", | ||||||
|     "vitest": "^1.1.3" |     "vitest": "^1.1.3" | ||||||
|   | |||||||
| @@ -11,7 +11,7 @@ export default defineApp({ | |||||||
|     'https://azure.microsoft.com/en-us/products/ai-services/openai-service', |     'https://azure.microsoft.com/en-us/products/ai-services/openai-service', | ||||||
|   apiBaseUrl: '', |   apiBaseUrl: '', | ||||||
|   iconUrl: '{BASE_URL}/apps/azure-openai/assets/favicon.svg', |   iconUrl: '{BASE_URL}/apps/azure-openai/assets/favicon.svg', | ||||||
|   authDocUrl: '{DOCS_URL}/apps/azure-openai/connection', |   authDocUrl: 'https://automatisch.io/docs/apps/azure-openai/connection', | ||||||
|   primaryColor: '000000', |   primaryColor: '000000', | ||||||
|   supportsConnections: true, |   supportsConnections: true, | ||||||
|   beforeRequest: [setBaseUrl, addAuthHeader], |   beforeRequest: [setBaseUrl, addAuthHeader], | ||||||
|   | |||||||
| @@ -7,7 +7,7 @@ export default defineApp({ | |||||||
|   name: 'Carbone', |   name: 'Carbone', | ||||||
|   key: 'carbone', |   key: 'carbone', | ||||||
|   iconUrl: '{BASE_URL}/apps/carbone/assets/favicon.svg', |   iconUrl: '{BASE_URL}/apps/carbone/assets/favicon.svg', | ||||||
|   authDocUrl: '{DOCS_URL}/apps/carbone/connection', |   authDocUrl: 'https://automatisch.io/docs/apps/carbone/connection', | ||||||
|   supportsConnections: true, |   supportsConnections: true, | ||||||
|   baseUrl: 'https://carbone.io', |   baseUrl: 'https://carbone.io', | ||||||
|   apiBaseUrl: 'https://api.carbone.io', |   apiBaseUrl: 'https://api.carbone.io', | ||||||
|   | |||||||
| @@ -5,7 +5,7 @@ export default defineApp({ | |||||||
|   name: 'Datastore', |   name: 'Datastore', | ||||||
|   key: 'datastore', |   key: 'datastore', | ||||||
|   iconUrl: '{BASE_URL}/apps/datastore/assets/favicon.svg', |   iconUrl: '{BASE_URL}/apps/datastore/assets/favicon.svg', | ||||||
|   authDocUrl: '{DOCS_URL}/apps/datastore/connection', |   authDocUrl: 'https://automatisch.io/docs/apps/datastore/connection', | ||||||
|   supportsConnections: false, |   supportsConnections: false, | ||||||
|   baseUrl: '', |   baseUrl: '', | ||||||
|   apiBaseUrl: '', |   apiBaseUrl: '', | ||||||
|   | |||||||
| @@ -7,7 +7,7 @@ export default defineApp({ | |||||||
|   name: 'DeepL', |   name: 'DeepL', | ||||||
|   key: 'deepl', |   key: 'deepl', | ||||||
|   iconUrl: '{BASE_URL}/apps/deepl/assets/favicon.svg', |   iconUrl: '{BASE_URL}/apps/deepl/assets/favicon.svg', | ||||||
|   authDocUrl: '{DOCS_URL}/apps/deepl/connection', |   authDocUrl: 'https://automatisch.io/docs/apps/deepl/connection', | ||||||
|   supportsConnections: true, |   supportsConnections: true, | ||||||
|   baseUrl: 'https://deepl.com', |   baseUrl: 'https://deepl.com', | ||||||
|   apiBaseUrl: 'https://api.deepl.com', |   apiBaseUrl: 'https://api.deepl.com', | ||||||
|   | |||||||
| @@ -5,7 +5,7 @@ export default defineApp({ | |||||||
|   name: 'Delay', |   name: 'Delay', | ||||||
|   key: 'delay', |   key: 'delay', | ||||||
|   iconUrl: '{BASE_URL}/apps/delay/assets/favicon.svg', |   iconUrl: '{BASE_URL}/apps/delay/assets/favicon.svg', | ||||||
|   authDocUrl: '{DOCS_URL}/apps/delay/connection', |   authDocUrl: 'https://automatisch.io/docs/apps/delay/connection', | ||||||
|   supportsConnections: false, |   supportsConnections: false, | ||||||
|   baseUrl: '', |   baseUrl: '', | ||||||
|   apiBaseUrl: '', |   apiBaseUrl: '', | ||||||
|   | |||||||
| @@ -10,7 +10,7 @@ export default defineApp({ | |||||||
|   name: 'Discord', |   name: 'Discord', | ||||||
|   key: 'discord', |   key: 'discord', | ||||||
|   iconUrl: '{BASE_URL}/apps/discord/assets/favicon.svg', |   iconUrl: '{BASE_URL}/apps/discord/assets/favicon.svg', | ||||||
|   authDocUrl: '{DOCS_URL}/apps/discord/connection', |   authDocUrl: 'https://automatisch.io/docs/apps/discord/connection', | ||||||
|   supportsConnections: true, |   supportsConnections: true, | ||||||
|   baseUrl: 'https://discord.com', |   baseUrl: 'https://discord.com', | ||||||
|   apiBaseUrl: 'https://discord.com/api', |   apiBaseUrl: 'https://discord.com/api', | ||||||
|   | |||||||
| @@ -7,7 +7,7 @@ export default defineApp({ | |||||||
|   name: 'Dropbox', |   name: 'Dropbox', | ||||||
|   key: 'dropbox', |   key: 'dropbox', | ||||||
|   iconUrl: '{BASE_URL}/apps/dropbox/assets/favicon.svg', |   iconUrl: '{BASE_URL}/apps/dropbox/assets/favicon.svg', | ||||||
|   authDocUrl: '{DOCS_URL}/apps/dropbox/connection', |   authDocUrl: 'https://automatisch.io/docs/apps/dropbox/connection', | ||||||
|   supportsConnections: true, |   supportsConnections: true, | ||||||
|   baseUrl: 'https://dropbox.com', |   baseUrl: 'https://dropbox.com', | ||||||
|   apiBaseUrl: 'https://api.dropboxapi.com', |   apiBaseUrl: 'https://api.dropboxapi.com', | ||||||
|   | |||||||
| @@ -5,7 +5,7 @@ export default defineApp({ | |||||||
|   name: 'Filter', |   name: 'Filter', | ||||||
|   key: 'filter', |   key: 'filter', | ||||||
|   iconUrl: '{BASE_URL}/apps/filter/assets/favicon.svg', |   iconUrl: '{BASE_URL}/apps/filter/assets/favicon.svg', | ||||||
|   authDocUrl: '{DOCS_URL}/apps/filter/connection', |   authDocUrl: 'https://automatisch.io/docs/apps/filter/connection', | ||||||
|   supportsConnections: false, |   supportsConnections: false, | ||||||
|   baseUrl: '', |   baseUrl: '', | ||||||
|   apiBaseUrl: '', |   apiBaseUrl: '', | ||||||
|   | |||||||
| @@ -8,7 +8,7 @@ export default defineApp({ | |||||||
|   name: 'Flickr', |   name: 'Flickr', | ||||||
|   key: 'flickr', |   key: 'flickr', | ||||||
|   iconUrl: '{BASE_URL}/apps/flickr/assets/favicon.svg', |   iconUrl: '{BASE_URL}/apps/flickr/assets/favicon.svg', | ||||||
|   authDocUrl: '{DOCS_URL}/apps/flickr/connection', |   authDocUrl: 'https://automatisch.io/docs/apps/flickr/connection', | ||||||
|   docUrl: 'https://automatisch.io/docs/flickr', |   docUrl: 'https://automatisch.io/docs/flickr', | ||||||
|   primaryColor: '000000', |   primaryColor: '000000', | ||||||
|   supportsConnections: true, |   supportsConnections: true, | ||||||
|   | |||||||
| @@ -7,7 +7,7 @@ export default defineApp({ | |||||||
|   name: 'Flowers Software', |   name: 'Flowers Software', | ||||||
|   key: 'flowers-software', |   key: 'flowers-software', | ||||||
|   iconUrl: '{BASE_URL}/apps/flowers-software/assets/favicon.svg', |   iconUrl: '{BASE_URL}/apps/flowers-software/assets/favicon.svg', | ||||||
|   authDocUrl: '{DOCS_URL}/apps/flowers-software/connection', |   authDocUrl: 'https://automatisch.io/docs/apps/flowers-software/connection', | ||||||
|   supportsConnections: true, |   supportsConnections: true, | ||||||
|   baseUrl: 'https://flowers-software.com', |   baseUrl: 'https://flowers-software.com', | ||||||
|   apiBaseUrl: 'https://webapp.flowers-software.com/api', |   apiBaseUrl: 'https://webapp.flowers-software.com/api', | ||||||
|   | |||||||
| @@ -6,7 +6,7 @@ export default defineApp({ | |||||||
|   name: 'Formatter', |   name: 'Formatter', | ||||||
|   key: 'formatter', |   key: 'formatter', | ||||||
|   iconUrl: '{BASE_URL}/apps/formatter/assets/favicon.svg', |   iconUrl: '{BASE_URL}/apps/formatter/assets/favicon.svg', | ||||||
|   authDocUrl: '{DOCS_URL}/apps/formatter/connection', |   authDocUrl: 'https://automatisch.io/docs/apps/formatter/connection', | ||||||
|   supportsConnections: false, |   supportsConnections: false, | ||||||
|   baseUrl: '', |   baseUrl: '', | ||||||
|   apiBaseUrl: '', |   apiBaseUrl: '', | ||||||
|   | |||||||
| @@ -10,7 +10,7 @@ export default defineApp({ | |||||||
|   baseUrl: 'https://ghost.org', |   baseUrl: 'https://ghost.org', | ||||||
|   apiBaseUrl: '', |   apiBaseUrl: '', | ||||||
|   iconUrl: '{BASE_URL}/apps/ghost/assets/favicon.svg', |   iconUrl: '{BASE_URL}/apps/ghost/assets/favicon.svg', | ||||||
|   authDocUrl: '{DOCS_URL}/apps/ghost/connection', |   authDocUrl: 'https://automatisch.io/docs/apps/ghost/connection', | ||||||
|   primaryColor: '15171A', |   primaryColor: '15171A', | ||||||
|   supportsConnections: true, |   supportsConnections: true, | ||||||
|   beforeRequest: [setBaseUrl, addAuthHeader], |   beforeRequest: [setBaseUrl, addAuthHeader], | ||||||
|   | |||||||
| @@ -1 +0,0 @@ | |||||||
| <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 640 640" style="enable-background:new 0 0 640 640" xml:space="preserve" width="32" height="32"><path style="fill:#fff" d="m395.9 484.2-126.9-61c-12.5-6-17.9-21.2-11.8-33.8l61-126.9c6-12.5 21.2-17.9 33.8-11.8 17.2 8.3 27.1 13 27.1 13l-.1-109.2 16.7-.1.1 117.1s57.4 24.2 83.1 40.1c3.7 2.3 10.2 6.8 12.9 14.4 2.1 6.1 2 13.1-1 19.3l-61 126.9c-6.2 12.7-21.4 18.1-33.9 12z"/><path style="fill:#609926" d="M622.7 149.8c-4.1-4.1-9.6-4-9.6-4s-117.2 6.6-177.9 8c-13.3.3-26.5.6-39.6.7v117.2c-5.5-2.6-11.1-5.3-16.6-7.9 0-36.4-.1-109.2-.1-109.2-29 .4-89.2-2.2-89.2-2.2s-141.4-7.1-156.8-8.5c-9.8-.6-22.5-2.1-39 1.5-8.7 1.8-33.5 7.4-53.8 26.9C-4.9 212.4 6.6 276.2 8 285.8c1.7 11.7 6.9 44.2 31.7 72.5 45.8 56.1 144.4 54.8 144.4 54.8s12.1 28.9 30.6 55.5c25 33.1 50.7 58.9 75.7 62 63 0 188.9-.1 188.9-.1s12 .1 28.3-10.3c14-8.5 26.5-23.4 26.5-23.4S547 483 565 451.5c5.5-9.7 10.1-19.1 14.1-28 0 0 55.2-117.1 55.2-231.1-1.1-34.5-9.6-40.6-11.6-42.6zM125.6 353.9c-25.9-8.5-36.9-18.7-36.9-18.7S69.6 321.8 60 295.4c-16.5-44.2-1.4-71.2-1.4-71.2s8.4-22.5 38.5-30c13.8-3.7 31-3.1 31-3.1s7.1 59.4 15.7 94.2c7.2 29.2 24.8 77.7 24.8 77.7s-26.1-3.1-43-9.1zm300.3 107.6s-6.1 14.5-19.6 15.4c-5.8.4-10.3-1.2-10.3-1.2s-.3-.1-5.3-2.1l-112.9-55s-10.9-5.7-12.8-15.6c-2.2-8.1 2.7-18.1 2.7-18.1L322 273s4.8-9.7 12.2-13c.6-.3 2.3-1 4.5-1.5 8.1-2.1 18 2.8 18 2.8L467.4 315s12.6 5.7 15.3 16.2c1.9 7.4-.5 14-1.8 17.2-6.3 15.4-55 113.1-55 113.1z"/><path style="fill:#609926" d="M326.8 380.1c-8.2.1-15.4 5.8-17.3 13.8-1.9 8 2 16.3 9.1 20 7.7 4 17.5 1.8 22.7-5.4 5.1-7.1 4.3-16.9-1.8-23.1l24-49.1c1.5.1 3.7.2 6.2-.5 4.1-.9 7.1-3.6 7.1-3.6 4.2 1.8 8.6 3.8 13.2 6.1 4.8 2.4 9.3 4.9 13.4 7.3.9.5 1.8 1.1 2.8 1.9 1.6 1.3 3.4 3.1 4.7 5.5 1.9 5.5-1.9 14.9-1.9 14.9-2.3 7.6-18.4 40.6-18.4 40.6-8.1-.2-15.3 5-17.7 12.5-2.6 8.1 1.1 17.3 8.9 21.3 7.8 4 17.4 1.7 22.5-5.3 5-6.8 4.6-16.3-1.1-22.6 1.9-3.7 3.7-7.4 5.6-11.3 5-10.4 13.5-30.4 13.5-30.4.9-1.7 5.7-10.3 2.7-21.3-2.5-11.4-12.6-16.7-12.6-16.7-12.2-7.9-29.2-15.2-29.2-15.2s0-4.1-1.1-7.1c-1.1-3.1-2.8-5.1-3.9-6.3 4.7-9.7 9.4-19.3 14.1-29-4.1-2-8.1-4-12.2-6.1-4.8 9.8-9.7 19.7-14.5 29.5-6.7-.1-12.9 3.5-16.1 9.4-3.4 6.3-2.7 14.1 1.9 19.8l-24.6 50.4z"/></svg> |  | ||||||
| Before Width: | Height: | Size: 2.2 KiB | 
| @@ -1,6 +0,0 @@ | |||||||
| const getCurrentUser = async ($) => { |  | ||||||
|   const { data: currentUser } = await $.http.get(`/user`); |  | ||||||
|   return currentUser; |  | ||||||
| }; |  | ||||||
|  |  | ||||||
| export default getCurrentUser; |  | ||||||
| @@ -1,14 +0,0 @@ | |||||||
| const setBaseUrl = ($, requestConfig) => { |  | ||||||
|   if (requestConfig.additionalProperties?.skipAddingBaseUrl) |  | ||||||
|     return requestConfig; |  | ||||||
|  |  | ||||||
|   const instanceUrl = $.auth.data.instanceUrl; |  | ||||||
|  |  | ||||||
|   if (instanceUrl) { |  | ||||||
|     requestConfig.baseURL = `${instanceUrl}/api/v1`; |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|   return requestConfig; |  | ||||||
| }; |  | ||||||
|  |  | ||||||
| export default setBaseUrl; |  | ||||||
| @@ -1,17 +0,0 @@ | |||||||
| import defineApp from '../../helpers/define-app.js'; |  | ||||||
| import addAuthHeader from './common/add-auth-header.js'; |  | ||||||
| import auth from './auth/index.js'; |  | ||||||
| import setBaseUrl from './common/set-base-url.js'; |  | ||||||
|  |  | ||||||
| export default defineApp({ |  | ||||||
|   name: 'Gitea', |  | ||||||
|   key: 'gitea', |  | ||||||
|   iconUrl: '{BASE_URL}/apps/gitea/assets/favicon.svg', |  | ||||||
|   authDocUrl: '{DOCS_URL}/apps/gitea/connection', |  | ||||||
|   supportsConnections: true, |  | ||||||
|   baseUrl: '', |  | ||||||
|   apiBaseUrl: '', |  | ||||||
|   primaryColor: '609926', |  | ||||||
|   beforeRequest: [setBaseUrl, addAuthHeader], |  | ||||||
|   auth, |  | ||||||
| }); |  | ||||||
| @@ -11,7 +11,7 @@ export default defineApp({ | |||||||
|   baseUrl: 'https://github.com', |   baseUrl: 'https://github.com', | ||||||
|   apiBaseUrl: 'https://api.github.com', |   apiBaseUrl: 'https://api.github.com', | ||||||
|   iconUrl: '{BASE_URL}/apps/github/assets/favicon.svg', |   iconUrl: '{BASE_URL}/apps/github/assets/favicon.svg', | ||||||
|   authDocUrl: '{DOCS_URL}/apps/github/connection', |   authDocUrl: 'https://automatisch.io/docs/apps/github/connection', | ||||||
|   primaryColor: '000000', |   primaryColor: '000000', | ||||||
|   supportsConnections: true, |   supportsConnections: true, | ||||||
|   beforeRequest: [addAuthHeader], |   beforeRequest: [addAuthHeader], | ||||||
|   | |||||||
| @@ -11,7 +11,7 @@ export default defineApp({ | |||||||
|   baseUrl: 'https://gitlab.com', |   baseUrl: 'https://gitlab.com', | ||||||
|   apiBaseUrl: 'https://gitlab.com', |   apiBaseUrl: 'https://gitlab.com', | ||||||
|   iconUrl: '{BASE_URL}/apps/gitlab/assets/favicon.svg', |   iconUrl: '{BASE_URL}/apps/gitlab/assets/favicon.svg', | ||||||
|   authDocUrl: '{DOCS_URL}/apps/gitlab/connection', |   authDocUrl: 'https://automatisch.io/docs/apps/gitlab/connection', | ||||||
|   primaryColor: 'FC6D26', |   primaryColor: 'FC6D26', | ||||||
|   supportsConnections: true, |   supportsConnections: true, | ||||||
|   beforeRequest: [setBaseUrl, addAuthHeader], |   beforeRequest: [setBaseUrl, addAuthHeader], | ||||||
|   | |||||||
							
								
								
									
										11
									
								
								packages/backend/src/apps/gmail/assets/favicon.svg
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								packages/backend/src/apps/gmail/assets/favicon.svg
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,11 @@ | |||||||
|  | <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 49.4 512 399.42"> | ||||||
|  |   <g fill="none" fill-rule="evenodd"> | ||||||
|  |     <g fill-rule="nonzero"> | ||||||
|  |       <path fill="#4285f4" d="M34.91 448.818h81.454V251L0 163.727V413.91c0 19.287 15.622 34.91 34.91 34.91z"/> | ||||||
|  |       <path fill="#34a853" d="M395.636 448.818h81.455c19.287 0 34.909-15.622 34.909-34.909V163.727L395.636 251z"/> | ||||||
|  |       <path fill="#fbbc04" d="M395.636 99.727V251L512 163.727v-46.545c0-43.142-49.25-67.782-83.782-41.891z"/> | ||||||
|  |     </g> | ||||||
|  |     <path fill="#ea4335" d="M116.364 251V99.727L256 204.455 395.636 99.727V251L256 355.727z"/> | ||||||
|  |     <path fill="#c5221f" fill-rule="nonzero" d="M0 117.182v46.545L116.364 251V99.727L83.782 75.291C49.25 49.4 0 74.04 0 117.18z"/> | ||||||
|  |   </g> | ||||||
|  | </svg> | ||||||
| After Width: | Height: | Size: 720 B | 
| @@ -1,24 +1,23 @@ | |||||||
| import { URLSearchParams } from 'url'; | import { URLSearchParams } from 'url'; | ||||||
|  | import authScope from '../common/auth-scope.js'; | ||||||
| 
 | 
 | ||||||
| export default async function generateAuthUrl($) { | export default async function generateAuthUrl($) { | ||||||
|   const oauthRedirectUrlField = $.app.auth.fields.find( |   const oauthRedirectUrlField = $.app.auth.fields.find( | ||||||
|     (field) => field.key == 'oAuthRedirectUrl' |     (field) => field.key == 'oAuthRedirectUrl' | ||||||
|   ); |   ); | ||||||
|   const redirectUri = oauthRedirectUrlField.value; |   const redirectUri = oauthRedirectUrlField.value; | ||||||
|   const state = Math.random().toString(); |  | ||||||
|   const searchParams = new URLSearchParams({ |   const searchParams = new URLSearchParams({ | ||||||
|     client_id: $.auth.data.clientId, |     client_id: $.auth.data.clientId, | ||||||
|     redirect_uri: redirectUri, |     redirect_uri: redirectUri, | ||||||
|  |     prompt: 'select_account', | ||||||
|  |     scope: authScope.join(' '), | ||||||
|     response_type: 'code', |     response_type: 'code', | ||||||
|     state: state, |     access_type: 'offline', | ||||||
|   }); |   }); | ||||||
| 
 | 
 | ||||||
|   const url = `${ |   const url = `https://accounts.google.com/o/oauth2/v2/auth?${searchParams.toString()}`; | ||||||
|     $.auth.data.instanceUrl |  | ||||||
|   }/login/oauth/authorize?${searchParams.toString()}`;
 |  | ||||||
| 
 | 
 | ||||||
|   await $.auth.set({ |   await $.auth.set({ | ||||||
|     url, |     url, | ||||||
|     originalState: state, |  | ||||||
|   }); |   }); | ||||||
| } | } | ||||||
| @@ -11,23 +11,12 @@ export default { | |||||||
|       type: 'string', |       type: 'string', | ||||||
|       required: true, |       required: true, | ||||||
|       readOnly: true, |       readOnly: true, | ||||||
|       value: '{WEB_APP_URL}/app/gitea/connections/add', |       value: '{WEB_APP_URL}/app/gmail/connections/add', | ||||||
|       placeholder: null, |       placeholder: null, | ||||||
|       description: |       description: | ||||||
|         'When asked to input a redirect URL in Gitea, enter the URL above.', |         'When asked to input a redirect URL in Google Cloud, enter the URL above.', | ||||||
|       clickToCopy: true, |       clickToCopy: true, | ||||||
|     }, |     }, | ||||||
|     { |  | ||||||
|       key: 'instanceUrl', |  | ||||||
|       label: 'Instance URL', |  | ||||||
|       type: 'string', |  | ||||||
|       required: true, |  | ||||||
|       readOnly: false, |  | ||||||
|       value: null, |  | ||||||
|       placeholder: null, |  | ||||||
|       description: null, |  | ||||||
|       clickToCopy: false, |  | ||||||
|     }, |  | ||||||
|     { |     { | ||||||
|       key: 'clientId', |       key: 'clientId', | ||||||
|       label: 'Client ID', |       label: 'Client ID', | ||||||
| @@ -2,7 +2,7 @@ import getCurrentUser from '../common/get-current-user.js'; | |||||||
| 
 | 
 | ||||||
| const isStillVerified = async ($) => { | const isStillVerified = async ($) => { | ||||||
|   const currentUser = await getCurrentUser($); |   const currentUser = await getCurrentUser($); | ||||||
|   return !!currentUser.email; |   return !!currentUser.resourceName; | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| export default isStillVerified; | export default isStillVerified; | ||||||
| @@ -1,5 +1,7 @@ | |||||||
| import { URLSearchParams } from 'node:url'; | import { URLSearchParams } from 'node:url'; | ||||||
| 
 | 
 | ||||||
|  | import authScope from '../common/auth-scope.js'; | ||||||
|  | 
 | ||||||
| const refreshToken = async ($) => { | const refreshToken = async ($) => { | ||||||
|   const params = new URLSearchParams({ |   const params = new URLSearchParams({ | ||||||
|     client_id: $.auth.data.clientId, |     client_id: $.auth.data.clientId, | ||||||
| @@ -9,20 +11,15 @@ const refreshToken = async ($) => { | |||||||
|   }); |   }); | ||||||
| 
 | 
 | ||||||
|   const { data } = await $.http.post( |   const { data } = await $.http.post( | ||||||
|     `${$.auth.data.instanceUrl}/login/oauth/access_token`, |     'https://oauth2.googleapis.com/token', | ||||||
|     params.toString(), |     params.toString() | ||||||
|     { |  | ||||||
|       additionalProperties: { |  | ||||||
|         skipAddingBaseUrl: true, |  | ||||||
|       }, |  | ||||||
|     } |  | ||||||
|   ); |   ); | ||||||
| 
 | 
 | ||||||
|   await $.auth.set({ |   await $.auth.set({ | ||||||
|     accessToken: data.access_token, |     accessToken: data.access_token, | ||||||
|     expiresIn: data.expires_in, |     expiresIn: data.expires_in, | ||||||
|  |     scope: authScope.join(' '), | ||||||
|     tokenType: data.token_type, |     tokenType: data.token_type, | ||||||
|     refreshToken: data.refresh_token, |  | ||||||
|   }); |   }); | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| @@ -1,15 +1,11 @@ | |||||||
| import getCurrentUser from '../common/get-current-user.js'; | import getCurrentUser from '../common/get-current-user.js'; | ||||||
| import { URLSearchParams } from 'url'; |  | ||||||
| 
 | 
 | ||||||
| const verifyCredentials = async ($) => { | const verifyCredentials = async ($) => { | ||||||
|   if ($.auth.data.originalState !== $.auth.data.state) { |  | ||||||
|     throw new Error(`The 'state' parameter does not match.`); |  | ||||||
|   } |  | ||||||
|   const oauthRedirectUrlField = $.app.auth.fields.find( |   const oauthRedirectUrlField = $.app.auth.fields.find( | ||||||
|     (field) => field.key == 'oAuthRedirectUrl' |     (field) => field.key == 'oAuthRedirectUrl' | ||||||
|   ); |   ); | ||||||
|   const redirectUri = oauthRedirectUrlField.value; |   const redirectUri = oauthRedirectUrlField.value; | ||||||
|   const params = new URLSearchParams({ |   const { data } = await $.http.post(`https://oauth2.googleapis.com/token`, { | ||||||
|     client_id: $.auth.data.clientId, |     client_id: $.auth.data.clientId, | ||||||
|     client_secret: $.auth.data.clientSecret, |     client_secret: $.auth.data.clientSecret, | ||||||
|     code: $.auth.data.code, |     code: $.auth.data.code, | ||||||
| @@ -17,33 +13,29 @@ const verifyCredentials = async ($) => { | |||||||
|     redirect_uri: redirectUri, |     redirect_uri: redirectUri, | ||||||
|   }); |   }); | ||||||
| 
 | 
 | ||||||
|   const { data } = await $.http.post( |  | ||||||
|     `${$.auth.data.instanceUrl}/login/oauth/access_token`, |  | ||||||
|     params.toString(), |  | ||||||
|     { |  | ||||||
|       additionalProperties: { |  | ||||||
|         skipAddingBaseUrl: true, |  | ||||||
|       }, |  | ||||||
|     } |  | ||||||
|   ); |  | ||||||
| 
 |  | ||||||
|   await $.auth.set({ |   await $.auth.set({ | ||||||
|     accessToken: data.access_token, |     accessToken: data.access_token, | ||||||
|     tokenType: data.token_type, |     tokenType: data.token_type, | ||||||
|   }); |   }); | ||||||
| 
 | 
 | ||||||
|   const currentUser = await getCurrentUser($); |   const currentUser = await getCurrentUser($); | ||||||
|   const screenName = [currentUser.username, currentUser.email] | 
 | ||||||
|     .filter(Boolean) |   const { displayName } = currentUser.names.find( | ||||||
|     .join(' @ '); |     (name) => name.metadata.primary | ||||||
|  |   ); | ||||||
|  |   const { value: email } = currentUser.emailAddresses.find( | ||||||
|  |     (emailAddress) => emailAddress.metadata.primary | ||||||
|  |   ); | ||||||
| 
 | 
 | ||||||
|   await $.auth.set({ |   await $.auth.set({ | ||||||
|     clientId: $.auth.data.clientId, |     clientId: $.auth.data.clientId, | ||||||
|     clientSecret: $.auth.data.clientSecret, |     clientSecret: $.auth.data.clientSecret, | ||||||
|  |     scope: $.auth.data.scope, | ||||||
|  |     idToken: data.id_token, | ||||||
|     expiresIn: data.expires_in, |     expiresIn: data.expires_in, | ||||||
|     refreshToken: data.refresh_token, |     refreshToken: data.refresh_token, | ||||||
|     repoOwner: currentUser.username, |     resourceName: currentUser.resourceName, | ||||||
|     screenName, |     screenName: `${displayName} - ${email}`, | ||||||
|   }); |   }); | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
							
								
								
									
										8
									
								
								packages/backend/src/apps/gmail/common/auth-scope.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								packages/backend/src/apps/gmail/common/auth-scope.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,8 @@ | |||||||
|  | const authScope = [ | ||||||
|  |   'https://www.googleapis.com/auth/gmail.compose', | ||||||
|  |   'https://www.googleapis.com/auth/gmail.modify', | ||||||
|  |   'https://www.googleapis.com/auth/userinfo.email', | ||||||
|  |   'https://www.googleapis.com/auth/userinfo.profile', | ||||||
|  | ]; | ||||||
|  |  | ||||||
|  | export default authScope; | ||||||
| @@ -0,0 +1,8 @@ | |||||||
|  | const getCurrentUser = async ($) => { | ||||||
|  |   const { data: currentUser } = await $.http.get( | ||||||
|  |     'https://people.googleapis.com/v1/people/me?personFields=names,emailAddresses' | ||||||
|  |   ); | ||||||
|  |   return currentUser; | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | export default getCurrentUser; | ||||||
							
								
								
									
										15
									
								
								packages/backend/src/apps/gmail/index.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										15
									
								
								packages/backend/src/apps/gmail/index.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,15 @@ | |||||||
|  | import defineApp from '../../helpers/define-app.js'; | ||||||
|  | import addAuthHeader from './common/add-auth-header.js'; | ||||||
|  | import auth from './auth/index.js'; | ||||||
|  | export default defineApp({ | ||||||
|  |   name: 'Gmail', | ||||||
|  |   key: 'gmail', | ||||||
|  |   baseUrl: 'https://mail.google.com', | ||||||
|  |   apiBaseUrl: 'https://gmail.googleapis.com', | ||||||
|  |   iconUrl: '{BASE_URL}/apps/gmail/assets/favicon.svg', | ||||||
|  |   authDocUrl: 'https://automatisch.io/docs/apps/gmail/connection', | ||||||
|  |   primaryColor: 'ea4335', | ||||||
|  |   supportsConnections: true, | ||||||
|  |   beforeRequest: [addAuthHeader], | ||||||
|  |   auth, | ||||||
|  | }); | ||||||
| @@ -10,7 +10,7 @@ export default defineApp({ | |||||||
|   baseUrl: 'https://calendar.google.com', |   baseUrl: 'https://calendar.google.com', | ||||||
|   apiBaseUrl: 'https://www.googleapis.com/calendar', |   apiBaseUrl: 'https://www.googleapis.com/calendar', | ||||||
|   iconUrl: '{BASE_URL}/apps/google-calendar/assets/favicon.svg', |   iconUrl: '{BASE_URL}/apps/google-calendar/assets/favicon.svg', | ||||||
|   authDocUrl: '{DOCS_URL}/apps/google-calendar/connection', |   authDocUrl: 'https://automatisch.io/docs/apps/google-calendar/connection', | ||||||
|   primaryColor: '448AFF', |   primaryColor: '448AFF', | ||||||
|   supportsConnections: true, |   supportsConnections: true, | ||||||
|   beforeRequest: [addAuthHeader], |   beforeRequest: [addAuthHeader], | ||||||
|   | |||||||
| @@ -10,7 +10,7 @@ export default defineApp({ | |||||||
|   baseUrl: 'https://drive.google.com', |   baseUrl: 'https://drive.google.com', | ||||||
|   apiBaseUrl: 'https://www.googleapis.com/drive', |   apiBaseUrl: 'https://www.googleapis.com/drive', | ||||||
|   iconUrl: '{BASE_URL}/apps/google-drive/assets/favicon.svg', |   iconUrl: '{BASE_URL}/apps/google-drive/assets/favicon.svg', | ||||||
|   authDocUrl: '{DOCS_URL}/apps/google-drive/connection', |   authDocUrl: 'https://automatisch.io/docs/apps/google-drive/connection', | ||||||
|   primaryColor: '1FA463', |   primaryColor: '1FA463', | ||||||
|   supportsConnections: true, |   supportsConnections: true, | ||||||
|   beforeRequest: [addAuthHeader], |   beforeRequest: [addAuthHeader], | ||||||
|   | |||||||
| @@ -10,7 +10,7 @@ export default defineApp({ | |||||||
|   baseUrl: 'https://docs.google.com/forms', |   baseUrl: 'https://docs.google.com/forms', | ||||||
|   apiBaseUrl: 'https://forms.googleapis.com', |   apiBaseUrl: 'https://forms.googleapis.com', | ||||||
|   iconUrl: '{BASE_URL}/apps/google-forms/assets/favicon.svg', |   iconUrl: '{BASE_URL}/apps/google-forms/assets/favicon.svg', | ||||||
|   authDocUrl: '{DOCS_URL}/apps/google-forms/connection', |   authDocUrl: 'https://automatisch.io/docs/apps/google-forms/connection', | ||||||
|   primaryColor: '673AB7', |   primaryColor: '673AB7', | ||||||
|   supportsConnections: true, |   supportsConnections: true, | ||||||
|   beforeRequest: [addAuthHeader], |   beforeRequest: [addAuthHeader], | ||||||
|   | |||||||
| @@ -12,7 +12,7 @@ export default defineApp({ | |||||||
|   baseUrl: 'https://docs.google.com/spreadsheets', |   baseUrl: 'https://docs.google.com/spreadsheets', | ||||||
|   apiBaseUrl: 'https://sheets.googleapis.com', |   apiBaseUrl: 'https://sheets.googleapis.com', | ||||||
|   iconUrl: '{BASE_URL}/apps/google-sheets/assets/favicon.svg', |   iconUrl: '{BASE_URL}/apps/google-sheets/assets/favicon.svg', | ||||||
|   authDocUrl: '{DOCS_URL}/apps/google-sheets/connection', |   authDocUrl: 'https://automatisch.io/docs/apps/google-sheets/connection', | ||||||
|   primaryColor: '0F9D58', |   primaryColor: '0F9D58', | ||||||
|   supportsConnections: true, |   supportsConnections: true, | ||||||
|   beforeRequest: [addAuthHeader], |   beforeRequest: [addAuthHeader], | ||||||
|   | |||||||
| @@ -10,7 +10,7 @@ export default defineApp({ | |||||||
|   baseUrl: 'https://tryhelix.ai', |   baseUrl: 'https://tryhelix.ai', | ||||||
|   apiBaseUrl: 'https://app.tryhelix.ai', |   apiBaseUrl: 'https://app.tryhelix.ai', | ||||||
|   iconUrl: '{BASE_URL}/apps/helix/assets/favicon.svg', |   iconUrl: '{BASE_URL}/apps/helix/assets/favicon.svg', | ||||||
|   authDocUrl: '{DOCS_URL}/apps/helix/connection', |   authDocUrl: 'https://automatisch.io/docs/apps/helix/connection', | ||||||
|   primaryColor: '000000', |   primaryColor: '000000', | ||||||
|   supportsConnections: true, |   supportsConnections: true, | ||||||
|   beforeRequest: [setBaseUrl, addAuthHeader], |   beforeRequest: [setBaseUrl, addAuthHeader], | ||||||
|   | |||||||
| @@ -5,7 +5,7 @@ export default defineApp({ | |||||||
|   name: 'HTTP Request', |   name: 'HTTP Request', | ||||||
|   key: 'http-request', |   key: 'http-request', | ||||||
|   iconUrl: '{BASE_URL}/apps/http-request/assets/favicon.svg', |   iconUrl: '{BASE_URL}/apps/http-request/assets/favicon.svg', | ||||||
|   authDocUrl: '{DOCS_URL}/apps/http-request/connection', |   authDocUrl: 'https://automatisch.io/docs/apps/http-request/connection', | ||||||
|   supportsConnections: false, |   supportsConnections: false, | ||||||
|   baseUrl: '', |   baseUrl: '', | ||||||
|   apiBaseUrl: '', |   apiBaseUrl: '', | ||||||
|   | |||||||
| @@ -7,7 +7,7 @@ export default defineApp({ | |||||||
|   name: 'HubSpot', |   name: 'HubSpot', | ||||||
|   key: 'hubspot', |   key: 'hubspot', | ||||||
|   iconUrl: '{BASE_URL}/apps/hubspot/assets/favicon.svg', |   iconUrl: '{BASE_URL}/apps/hubspot/assets/favicon.svg', | ||||||
|   authDocUrl: '{DOCS_URL}/apps/hubspot/connection', |   authDocUrl: 'https://automatisch.io/docs/apps/hubspot/connection', | ||||||
|   supportsConnections: true, |   supportsConnections: true, | ||||||
|   baseUrl: 'https://www.hubspot.com', |   baseUrl: 'https://www.hubspot.com', | ||||||
|   apiBaseUrl: 'https://api.hubapi.com', |   apiBaseUrl: 'https://api.hubapi.com', | ||||||
|   | |||||||
| @@ -12,7 +12,7 @@ export default defineApp({ | |||||||
|   baseUrl: 'https://invoiceninja.com', |   baseUrl: 'https://invoiceninja.com', | ||||||
|   apiBaseUrl: 'https://invoicing.co/api', |   apiBaseUrl: 'https://invoicing.co/api', | ||||||
|   iconUrl: '{BASE_URL}/apps/invoice-ninja/assets/favicon.svg', |   iconUrl: '{BASE_URL}/apps/invoice-ninja/assets/favicon.svg', | ||||||
|   authDocUrl: '{DOCS_URL}/apps/invoice-ninja/connection', |   authDocUrl: 'https://automatisch.io/docs/apps/invoice-ninja/connection', | ||||||
|   primaryColor: '000000', |   primaryColor: '000000', | ||||||
|   supportsConnections: true, |   supportsConnections: true, | ||||||
|   beforeRequest: [setBaseUrl, addAuthHeader], |   beforeRequest: [setBaseUrl, addAuthHeader], | ||||||
|   | |||||||
| @@ -10,7 +10,7 @@ export default defineApp({ | |||||||
|   name: 'Mattermost', |   name: 'Mattermost', | ||||||
|   key: 'mattermost', |   key: 'mattermost', | ||||||
|   iconUrl: '{BASE_URL}/apps/mattermost/assets/favicon.svg', |   iconUrl: '{BASE_URL}/apps/mattermost/assets/favicon.svg', | ||||||
|   authDocUrl: '{DOCS_URL}/apps/mattermost/connection', |   authDocUrl: 'https://automatisch.io/docs/apps/mattermost/connection', | ||||||
|   baseUrl: 'https://mattermost.com', |   baseUrl: 'https://mattermost.com', | ||||||
|   apiBaseUrl: '', // there is no cloud version of this app, user always need to provide address of own instance when creating connection |   apiBaseUrl: '', // there is no cloud version of this app, user always need to provide address of own instance when creating connection | ||||||
|   primaryColor: '4a154b', |   primaryColor: '4a154b', | ||||||
|   | |||||||
| @@ -10,7 +10,7 @@ export default defineApp({ | |||||||
|   baseUrl: 'https://miro.com', |   baseUrl: 'https://miro.com', | ||||||
|   apiBaseUrl: 'https://api.miro.com', |   apiBaseUrl: 'https://api.miro.com', | ||||||
|   iconUrl: '{BASE_URL}/apps/miro/assets/favicon.svg', |   iconUrl: '{BASE_URL}/apps/miro/assets/favicon.svg', | ||||||
|   authDocUrl: '{DOCS_URL}/apps/miro/connection', |   authDocUrl: 'https://automatisch.io/docs/apps/miro/connection', | ||||||
|   primaryColor: 'F2CA02', |   primaryColor: 'F2CA02', | ||||||
|   supportsConnections: true, |   supportsConnections: true, | ||||||
|   beforeRequest: [addAuthHeader], |   beforeRequest: [addAuthHeader], | ||||||
|   | |||||||
| @@ -12,7 +12,7 @@ export default defineApp({ | |||||||
|   baseUrl: 'https://notion.com', |   baseUrl: 'https://notion.com', | ||||||
|   apiBaseUrl: 'https://api.notion.com', |   apiBaseUrl: 'https://api.notion.com', | ||||||
|   iconUrl: '{BASE_URL}/apps/notion/assets/favicon.svg', |   iconUrl: '{BASE_URL}/apps/notion/assets/favicon.svg', | ||||||
|   authDocUrl: '{DOCS_URL}/apps/notion/connection', |   authDocUrl: 'https://automatisch.io/docs/apps/notion/connection', | ||||||
|   primaryColor: '000000', |   primaryColor: '000000', | ||||||
|   supportsConnections: true, |   supportsConnections: true, | ||||||
|   beforeRequest: [addAuthHeader, addNotionVersionHeader], |   beforeRequest: [addAuthHeader, addNotionVersionHeader], | ||||||
|   | |||||||
| @@ -7,7 +7,7 @@ export default defineApp({ | |||||||
|   name: 'Ntfy', |   name: 'Ntfy', | ||||||
|   key: 'ntfy', |   key: 'ntfy', | ||||||
|   iconUrl: '{BASE_URL}/apps/ntfy/assets/favicon.svg', |   iconUrl: '{BASE_URL}/apps/ntfy/assets/favicon.svg', | ||||||
|   authDocUrl: '{DOCS_URL}/apps/ntfy/connection', |   authDocUrl: 'https://automatisch.io/docs/apps/ntfy/connection', | ||||||
|   supportsConnections: true, |   supportsConnections: true, | ||||||
|   baseUrl: 'https://ntfy.sh', |   baseUrl: 'https://ntfy.sh', | ||||||
|   apiBaseUrl: 'https://ntfy.sh', |   apiBaseUrl: 'https://ntfy.sh', | ||||||
|   | |||||||
| @@ -6,7 +6,7 @@ export default defineApp({ | |||||||
|   name: 'Odoo', |   name: 'Odoo', | ||||||
|   key: 'odoo', |   key: 'odoo', | ||||||
|   iconUrl: '{BASE_URL}/apps/odoo/assets/favicon.svg', |   iconUrl: '{BASE_URL}/apps/odoo/assets/favicon.svg', | ||||||
|   authDocUrl: '{DOCS_URL}/apps/odoo/connection', |   authDocUrl: 'https://automatisch.io/docs/apps/odoo/connection', | ||||||
|   supportsConnections: true, |   supportsConnections: true, | ||||||
|   baseUrl: 'https://odoo.com', |   baseUrl: 'https://odoo.com', | ||||||
|   apiBaseUrl: '', |   apiBaseUrl: '', | ||||||
|   | |||||||
| @@ -10,7 +10,7 @@ export default defineApp({ | |||||||
|   baseUrl: 'https://openai.com', |   baseUrl: 'https://openai.com', | ||||||
|   apiBaseUrl: 'https://api.openai.com', |   apiBaseUrl: 'https://api.openai.com', | ||||||
|   iconUrl: '{BASE_URL}/apps/openai/assets/favicon.svg', |   iconUrl: '{BASE_URL}/apps/openai/assets/favicon.svg', | ||||||
|   authDocUrl: '{DOCS_URL}/apps/openai/connection', |   authDocUrl: 'https://automatisch.io/docs/apps/openai/connection', | ||||||
|   primaryColor: '000000', |   primaryColor: '000000', | ||||||
|   supportsConnections: true, |   supportsConnections: true, | ||||||
|   beforeRequest: [addAuthHeader], |   beforeRequest: [addAuthHeader], | ||||||
|   | |||||||
| @@ -12,7 +12,7 @@ export default defineApp({ | |||||||
|   baseUrl: '', |   baseUrl: '', | ||||||
|   apiBaseUrl: '', |   apiBaseUrl: '', | ||||||
|   iconUrl: '{BASE_URL}/apps/pipedrive/assets/favicon.svg', |   iconUrl: '{BASE_URL}/apps/pipedrive/assets/favicon.svg', | ||||||
|   authDocUrl: '{DOCS_URL}/apps/pipedrive/connection', |   authDocUrl: 'https://automatisch.io/docs/apps/pipedrive/connection', | ||||||
|   primaryColor: 'FFFFFF', |   primaryColor: 'FFFFFF', | ||||||
|   supportsConnections: true, |   supportsConnections: true, | ||||||
|   beforeRequest: [setBaseUrl, addAuthHeader], |   beforeRequest: [setBaseUrl, addAuthHeader], | ||||||
|   | |||||||
| @@ -8,7 +8,7 @@ export default defineApp({ | |||||||
|   name: 'Placetel', |   name: 'Placetel', | ||||||
|   key: 'placetel', |   key: 'placetel', | ||||||
|   iconUrl: '{BASE_URL}/apps/placetel/assets/favicon.svg', |   iconUrl: '{BASE_URL}/apps/placetel/assets/favicon.svg', | ||||||
|   authDocUrl: '{DOCS_URL}/apps/placetel/connection', |   authDocUrl: 'https://automatisch.io/docs/apps/placetel/connection', | ||||||
|   supportsConnections: true, |   supportsConnections: true, | ||||||
|   baseUrl: 'https://placetel.de', |   baseUrl: 'https://placetel.de', | ||||||
|   apiBaseUrl: 'https://api.placetel.de', |   apiBaseUrl: 'https://api.placetel.de', | ||||||
|   | |||||||
| @@ -6,7 +6,7 @@ export default defineApp({ | |||||||
|   name: 'PostgreSQL', |   name: 'PostgreSQL', | ||||||
|   key: 'postgresql', |   key: 'postgresql', | ||||||
|   iconUrl: '{BASE_URL}/apps/postgresql/assets/favicon.svg', |   iconUrl: '{BASE_URL}/apps/postgresql/assets/favicon.svg', | ||||||
|   authDocUrl: '{DOCS_URL}/apps/postgresql/connection', |   authDocUrl: 'https://automatisch.io/docs/apps/postgresql/connection', | ||||||
|   supportsConnections: true, |   supportsConnections: true, | ||||||
|   baseUrl: '', |   baseUrl: '', | ||||||
|   apiBaseUrl: '', |   apiBaseUrl: '', | ||||||
|   | |||||||
| @@ -9,7 +9,7 @@ export default defineApp({ | |||||||
|   baseUrl: 'https://pushover.net', |   baseUrl: 'https://pushover.net', | ||||||
|   apiBaseUrl: 'https://api.pushover.net', |   apiBaseUrl: 'https://api.pushover.net', | ||||||
|   iconUrl: '{BASE_URL}/apps/pushover/assets/favicon.svg', |   iconUrl: '{BASE_URL}/apps/pushover/assets/favicon.svg', | ||||||
|   authDocUrl: '{DOCS_URL}/apps/pushover/connection', |   authDocUrl: 'https://automatisch.io/docs/apps/pushover/connection', | ||||||
|   primaryColor: '249DF1', |   primaryColor: '249DF1', | ||||||
|   supportsConnections: true, |   supportsConnections: true, | ||||||
|   auth, |   auth, | ||||||
|   | |||||||
| @@ -10,7 +10,7 @@ export default defineApp({ | |||||||
|   baseUrl: 'https://www.reddit.com', |   baseUrl: 'https://www.reddit.com', | ||||||
|   apiBaseUrl: 'https://oauth.reddit.com', |   apiBaseUrl: 'https://oauth.reddit.com', | ||||||
|   iconUrl: '{BASE_URL}/apps/reddit/assets/favicon.svg', |   iconUrl: '{BASE_URL}/apps/reddit/assets/favicon.svg', | ||||||
|   authDocUrl: '{DOCS_URL}/apps/reddit/connection', |   authDocUrl: 'https://automatisch.io/docs/apps/reddit/connection', | ||||||
|   primaryColor: 'FF4500', |   primaryColor: 'FF4500', | ||||||
|   supportsConnections: true, |   supportsConnections: true, | ||||||
|   beforeRequest: [addAuthHeader], |   beforeRequest: [addAuthHeader], | ||||||
|   | |||||||
| @@ -7,7 +7,7 @@ export default defineApp({ | |||||||
|   name: 'Remove.bg', |   name: 'Remove.bg', | ||||||
|   key: 'removebg', |   key: 'removebg', | ||||||
|   iconUrl: '{BASE_URL}/apps/removebg/assets/favicon.svg', |   iconUrl: '{BASE_URL}/apps/removebg/assets/favicon.svg', | ||||||
|   authDocUrl: '{DOCS_URL}/apps/removebg/connection', |   authDocUrl: 'https://automatisch.io/docs/apps/removebg/connection', | ||||||
|   supportsConnections: true, |   supportsConnections: true, | ||||||
|   baseUrl: 'https://www.remove.bg', |   baseUrl: 'https://www.remove.bg', | ||||||
|   apiBaseUrl: 'https://api.remove.bg/v1.0', |   apiBaseUrl: 'https://api.remove.bg/v1.0', | ||||||
|   | |||||||
| @@ -5,7 +5,7 @@ export default defineApp({ | |||||||
|   name: 'RSS', |   name: 'RSS', | ||||||
|   key: 'rss', |   key: 'rss', | ||||||
|   iconUrl: '{BASE_URL}/apps/rss/assets/favicon.svg', |   iconUrl: '{BASE_URL}/apps/rss/assets/favicon.svg', | ||||||
|   authDocUrl: '{DOCS_URL}/apps/rss/connection', |   authDocUrl: 'https://automatisch.io/docs/apps/rss/connection', | ||||||
|   supportsConnections: false, |   supportsConnections: false, | ||||||
|   baseUrl: '', |   baseUrl: '', | ||||||
|   apiBaseUrl: '', |   apiBaseUrl: '', | ||||||
|   | |||||||
| @@ -9,7 +9,7 @@ export default defineApp({ | |||||||
|   name: 'Salesforce', |   name: 'Salesforce', | ||||||
|   key: 'salesforce', |   key: 'salesforce', | ||||||
|   iconUrl: '{BASE_URL}/apps/salesforce/assets/favicon.svg', |   iconUrl: '{BASE_URL}/apps/salesforce/assets/favicon.svg', | ||||||
|   authDocUrl: '{DOCS_URL}/connections/salesforce', |   authDocUrl: 'https://automatisch.io/docs/connections/salesforce', | ||||||
|   supportsConnections: true, |   supportsConnections: true, | ||||||
|   baseUrl: 'https://salesforce.com', |   baseUrl: 'https://salesforce.com', | ||||||
|   apiBaseUrl: '', |   apiBaseUrl: '', | ||||||
|   | |||||||
| @@ -6,7 +6,7 @@ export default defineApp({ | |||||||
|   key: 'scheduler', |   key: 'scheduler', | ||||||
|   iconUrl: '{BASE_URL}/apps/scheduler/assets/favicon.svg', |   iconUrl: '{BASE_URL}/apps/scheduler/assets/favicon.svg', | ||||||
|   docUrl: 'https://automatisch.io/docs/scheduler', |   docUrl: 'https://automatisch.io/docs/scheduler', | ||||||
|   authDocUrl: '{DOCS_URL}/apps/scheduler/connection', |   authDocUrl: 'https://automatisch.io/docs/apps/scheduler/connection', | ||||||
|   baseUrl: '', |   baseUrl: '', | ||||||
|   apiBaseUrl: '', |   apiBaseUrl: '', | ||||||
|   primaryColor: '0059F7', |   primaryColor: '0059F7', | ||||||
|   | |||||||
| @@ -11,7 +11,7 @@ export default defineApp({ | |||||||
|   baseUrl: '', |   baseUrl: '', | ||||||
|   apiBaseUrl: '', |   apiBaseUrl: '', | ||||||
|   iconUrl: '{BASE_URL}/apps/self-hosted-llm/assets/favicon.svg', |   iconUrl: '{BASE_URL}/apps/self-hosted-llm/assets/favicon.svg', | ||||||
|   authDocUrl: '{DOCS_URL}/apps/self-hosted-llm/connection', |   authDocUrl: 'https://automatisch.io/docs/apps/self-hosted-llm/connection', | ||||||
|   primaryColor: '000000', |   primaryColor: '000000', | ||||||
|   supportsConnections: true, |   supportsConnections: true, | ||||||
|   beforeRequest: [setBaseUrl, addAuthHeader], |   beforeRequest: [setBaseUrl, addAuthHeader], | ||||||
|   | |||||||
| @@ -9,7 +9,7 @@ export default defineApp({ | |||||||
|   name: 'SignalWire', |   name: 'SignalWire', | ||||||
|   key: 'signalwire', |   key: 'signalwire', | ||||||
|   iconUrl: '{BASE_URL}/apps/signalwire/assets/favicon.svg', |   iconUrl: '{BASE_URL}/apps/signalwire/assets/favicon.svg', | ||||||
|   authDocUrl: '{DOCS_URL}/apps/signalwire/connection', |   authDocUrl: 'https://automatisch.io/docs/apps/signalwire/connection', | ||||||
|   supportsConnections: true, |   supportsConnections: true, | ||||||
|   baseUrl: 'https://signalwire.com', |   baseUrl: 'https://signalwire.com', | ||||||
|   apiBaseUrl: '', |   apiBaseUrl: '', | ||||||
|   | |||||||
| @@ -9,7 +9,7 @@ export default defineApp({ | |||||||
|   name: 'Slack', |   name: 'Slack', | ||||||
|   key: 'slack', |   key: 'slack', | ||||||
|   iconUrl: '{BASE_URL}/apps/slack/assets/favicon.svg', |   iconUrl: '{BASE_URL}/apps/slack/assets/favicon.svg', | ||||||
|   authDocUrl: '{DOCS_URL}/apps/slack/connection', |   authDocUrl: 'https://automatisch.io/docs/apps/slack/connection', | ||||||
|   supportsConnections: true, |   supportsConnections: true, | ||||||
|   baseUrl: 'https://slack.com', |   baseUrl: 'https://slack.com', | ||||||
|   apiBaseUrl: 'https://slack.com/api', |   apiBaseUrl: 'https://slack.com/api', | ||||||
|   | |||||||
| @@ -6,7 +6,7 @@ export default defineApp({ | |||||||
|   name: 'SMTP', |   name: 'SMTP', | ||||||
|   key: 'smtp', |   key: 'smtp', | ||||||
|   iconUrl: '{BASE_URL}/apps/smtp/assets/favicon.svg', |   iconUrl: '{BASE_URL}/apps/smtp/assets/favicon.svg', | ||||||
|   authDocUrl: '{DOCS_URL}/apps/smtp/connection', |   authDocUrl: 'https://automatisch.io/docs/apps/smtp/connection', | ||||||
|   supportsConnections: true, |   supportsConnections: true, | ||||||
|   baseUrl: '', |   baseUrl: '', | ||||||
|   apiBaseUrl: '', |   apiBaseUrl: '', | ||||||
|   | |||||||
| @@ -7,7 +7,7 @@ export default defineApp({ | |||||||
|   name: 'Spotify', |   name: 'Spotify', | ||||||
|   key: 'spotify', |   key: 'spotify', | ||||||
|   iconUrl: '{BASE_URL}/apps/spotify/assets/favicon.svg', |   iconUrl: '{BASE_URL}/apps/spotify/assets/favicon.svg', | ||||||
|   authDocUrl: '{DOCS_URL}/apps/spotify/connection', |   authDocUrl: 'https://automatisch.io/docs/apps/spotify/connection', | ||||||
|   supportsConnections: true, |   supportsConnections: true, | ||||||
|   baseUrl: 'https://spotify.com', |   baseUrl: 'https://spotify.com', | ||||||
|   apiBaseUrl: 'https://api.spotify.com', |   apiBaseUrl: 'https://api.spotify.com', | ||||||
|   | |||||||
| @@ -7,7 +7,7 @@ export default defineApp({ | |||||||
|   name: 'Strava', |   name: 'Strava', | ||||||
|   key: 'strava', |   key: 'strava', | ||||||
|   iconUrl: '{BASE_URL}/apps/strava/assets/favicon.svg', |   iconUrl: '{BASE_URL}/apps/strava/assets/favicon.svg', | ||||||
|   authDocUrl: '{DOCS_URL}/connections/strava', |   authDocUrl: 'https://automatisch.io/docs/connections/strava', | ||||||
|   supportsConnections: true, |   supportsConnections: true, | ||||||
|   baseUrl: 'https://www.strava.com', |   baseUrl: 'https://www.strava.com', | ||||||
|   apiBaseUrl: 'https://www.strava.com/api', |   apiBaseUrl: 'https://www.strava.com/api', | ||||||
|   | |||||||
| @@ -7,7 +7,7 @@ export default defineApp({ | |||||||
|   name: 'Stripe', |   name: 'Stripe', | ||||||
|   key: 'stripe', |   key: 'stripe', | ||||||
|   iconUrl: '{BASE_URL}/apps/stripe/assets/favicon.svg', |   iconUrl: '{BASE_URL}/apps/stripe/assets/favicon.svg', | ||||||
|   authDocUrl: '{DOCS_URL}/apps/stripe/connection', |   authDocUrl: 'https://automatisch.io/docs/apps/stripe/connection', | ||||||
|   supportsConnections: true, |   supportsConnections: true, | ||||||
|   baseUrl: 'https://stripe.com', |   baseUrl: 'https://stripe.com', | ||||||
|   apiBaseUrl: 'https://api.stripe.com', |   apiBaseUrl: 'https://api.stripe.com', | ||||||
|   | |||||||
| @@ -7,7 +7,7 @@ export default defineApp({ | |||||||
|   name: 'Telegram', |   name: 'Telegram', | ||||||
|   key: 'telegram-bot', |   key: 'telegram-bot', | ||||||
|   iconUrl: '{BASE_URL}/apps/telegram-bot/assets/favicon.svg', |   iconUrl: '{BASE_URL}/apps/telegram-bot/assets/favicon.svg', | ||||||
|   authDocUrl: '{DOCS_URL}/apps/telegram-bot/connection', |   authDocUrl: 'https://automatisch.io/docs/apps/telegram-bot/connection', | ||||||
|   supportsConnections: true, |   supportsConnections: true, | ||||||
|   baseUrl: 'https://telegram.org', |   baseUrl: 'https://telegram.org', | ||||||
|   apiBaseUrl: 'https://api.telegram.org', |   apiBaseUrl: 'https://api.telegram.org', | ||||||
|   | |||||||
| @@ -9,7 +9,7 @@ export default defineApp({ | |||||||
|   name: 'Todoist', |   name: 'Todoist', | ||||||
|   key: 'todoist', |   key: 'todoist', | ||||||
|   iconUrl: '{BASE_URL}/apps/todoist/assets/favicon.svg', |   iconUrl: '{BASE_URL}/apps/todoist/assets/favicon.svg', | ||||||
|   authDocUrl: '{DOCS_URL}/apps/todoist/connection', |   authDocUrl: 'https://automatisch.io/docs/apps/todoist/connection', | ||||||
|   supportsConnections: true, |   supportsConnections: true, | ||||||
|   baseUrl: 'https://todoist.com', |   baseUrl: 'https://todoist.com', | ||||||
|   apiBaseUrl: 'https://api.todoist.com/rest/v2', |   apiBaseUrl: 'https://api.todoist.com/rest/v2', | ||||||
|   | |||||||
| @@ -10,7 +10,7 @@ export default defineApp({ | |||||||
|   baseUrl: 'https://trello.com/', |   baseUrl: 'https://trello.com/', | ||||||
|   apiBaseUrl: 'https://api.trello.com', |   apiBaseUrl: 'https://api.trello.com', | ||||||
|   iconUrl: '{BASE_URL}/apps/trello/assets/favicon.svg', |   iconUrl: '{BASE_URL}/apps/trello/assets/favicon.svg', | ||||||
|   authDocUrl: '{DOCS_URL}/apps/trello/connection', |   authDocUrl: 'https://automatisch.io/docs/apps/trello/connection', | ||||||
|   supportsConnections: true, |   supportsConnections: true, | ||||||
|   primaryColor: '0079bf', |   primaryColor: '0079bf', | ||||||
|   beforeRequest: [addAuthHeader], |   beforeRequest: [addAuthHeader], | ||||||
|   | |||||||
| @@ -9,7 +9,7 @@ export default defineApp({ | |||||||
|   name: 'Twilio', |   name: 'Twilio', | ||||||
|   key: 'twilio', |   key: 'twilio', | ||||||
|   iconUrl: '{BASE_URL}/apps/twilio/assets/favicon.svg', |   iconUrl: '{BASE_URL}/apps/twilio/assets/favicon.svg', | ||||||
|   authDocUrl: '{DOCS_URL}/apps/twilio/connection', |   authDocUrl: 'https://automatisch.io/docs/apps/twilio/connection', | ||||||
|   supportsConnections: true, |   supportsConnections: true, | ||||||
|   baseUrl: 'https://twilio.com', |   baseUrl: 'https://twilio.com', | ||||||
|   apiBaseUrl: 'https://api.twilio.com', |   apiBaseUrl: 'https://api.twilio.com', | ||||||
|   | |||||||
| @@ -8,7 +8,7 @@ export default defineApp({ | |||||||
|   name: 'Twitter', |   name: 'Twitter', | ||||||
|   key: 'twitter', |   key: 'twitter', | ||||||
|   iconUrl: '{BASE_URL}/apps/twitter/assets/favicon.svg', |   iconUrl: '{BASE_URL}/apps/twitter/assets/favicon.svg', | ||||||
|   authDocUrl: '{DOCS_URL}/apps/twitter/connection', |   authDocUrl: 'https://automatisch.io/docs/apps/twitter/connection', | ||||||
|   supportsConnections: true, |   supportsConnections: true, | ||||||
|   baseUrl: 'https://twitter.com', |   baseUrl: 'https://twitter.com', | ||||||
|   apiBaseUrl: 'https://api.twitter.com', |   apiBaseUrl: 'https://api.twitter.com', | ||||||
|   | |||||||
| @@ -8,7 +8,7 @@ export default defineApp({ | |||||||
|   name: 'Typeform', |   name: 'Typeform', | ||||||
|   key: 'typeform', |   key: 'typeform', | ||||||
|   iconUrl: '{BASE_URL}/apps/typeform/assets/favicon.svg', |   iconUrl: '{BASE_URL}/apps/typeform/assets/favicon.svg', | ||||||
|   authDocUrl: '{DOCS_URL}/apps/typeform/connection', |   authDocUrl: 'https://automatisch.io/docs/apps/typeform/connection', | ||||||
|   supportsConnections: true, |   supportsConnections: true, | ||||||
|   baseUrl: 'https://typeform.com', |   baseUrl: 'https://typeform.com', | ||||||
|   apiBaseUrl: 'https://api.typeform.com', |   apiBaseUrl: 'https://api.typeform.com', | ||||||
|   | |||||||
| @@ -6,7 +6,7 @@ export default defineApp({ | |||||||
|   name: 'Webhook', |   name: 'Webhook', | ||||||
|   key: 'webhook', |   key: 'webhook', | ||||||
|   iconUrl: '{BASE_URL}/apps/webhook/assets/favicon.svg', |   iconUrl: '{BASE_URL}/apps/webhook/assets/favicon.svg', | ||||||
|   authDocUrl: '{DOCS_URL}/apps/webhook/connection', |   authDocUrl: 'https://automatisch.io/docs/apps/webhook/connection', | ||||||
|   supportsConnections: false, |   supportsConnections: false, | ||||||
|   baseUrl: '', |   baseUrl: '', | ||||||
|   apiBaseUrl: '', |   apiBaseUrl: '', | ||||||
|   | |||||||
| @@ -9,7 +9,7 @@ export default defineApp({ | |||||||
|   name: 'WordPress', |   name: 'WordPress', | ||||||
|   key: 'wordpress', |   key: 'wordpress', | ||||||
|   iconUrl: '{BASE_URL}/apps/wordpress/assets/favicon.svg', |   iconUrl: '{BASE_URL}/apps/wordpress/assets/favicon.svg', | ||||||
|   authDocUrl: '{DOCS_URL}/apps/wordpress/connection', |   authDocUrl: 'https://automatisch.io/docs/apps/wordpress/connection', | ||||||
|   supportsConnections: true, |   supportsConnections: true, | ||||||
|   baseUrl: 'https://wordpress.com', |   baseUrl: 'https://wordpress.com', | ||||||
|   apiBaseUrl: '', |   apiBaseUrl: '', | ||||||
|   | |||||||
| @@ -10,7 +10,7 @@ export default defineApp({ | |||||||
|   baseUrl: 'https://go.xero.com', |   baseUrl: 'https://go.xero.com', | ||||||
|   apiBaseUrl: 'https://api.xero.com', |   apiBaseUrl: 'https://api.xero.com', | ||||||
|   iconUrl: '{BASE_URL}/apps/xero/assets/favicon.svg', |   iconUrl: '{BASE_URL}/apps/xero/assets/favicon.svg', | ||||||
|   authDocUrl: '{DOCS_URL}/apps/xero/connection', |   authDocUrl: 'https://automatisch.io/docs/apps/xero/connection', | ||||||
|   primaryColor: '13B5EA', |   primaryColor: '13B5EA', | ||||||
|   supportsConnections: true, |   supportsConnections: true, | ||||||
|   beforeRequest: [addAuthHeader], |   beforeRequest: [addAuthHeader], | ||||||
|   | |||||||
| @@ -9,7 +9,7 @@ export default defineApp({ | |||||||
|   baseUrl: 'https://www.youtube.com/', |   baseUrl: 'https://www.youtube.com/', | ||||||
|   apiBaseUrl: 'https://www.googleapis.com/youtube', |   apiBaseUrl: 'https://www.googleapis.com/youtube', | ||||||
|   iconUrl: '{BASE_URL}/apps/youtube/assets/favicon.svg', |   iconUrl: '{BASE_URL}/apps/youtube/assets/favicon.svg', | ||||||
|   authDocUrl: '{DOCS_URL}/apps/youtube/connection', |   authDocUrl: 'https://automatisch.io/docs/apps/youtube/connection', | ||||||
|   primaryColor: 'FF0000', |   primaryColor: 'FF0000', | ||||||
|   supportsConnections: true, |   supportsConnections: true, | ||||||
|   beforeRequest: [addAuthHeader], |   beforeRequest: [addAuthHeader], | ||||||
|   | |||||||
| @@ -11,7 +11,7 @@ export default defineApp({ | |||||||
|   baseUrl: 'https://zendesk.com/', |   baseUrl: 'https://zendesk.com/', | ||||||
|   apiBaseUrl: '', |   apiBaseUrl: '', | ||||||
|   iconUrl: '{BASE_URL}/apps/zendesk/assets/favicon.svg', |   iconUrl: '{BASE_URL}/apps/zendesk/assets/favicon.svg', | ||||||
|   authDocUrl: '{DOCS_URL}/apps/zendesk/connection', |   authDocUrl: 'https://automatisch.io/docs/apps/zendesk/connection', | ||||||
|   primaryColor: '17494d', |   primaryColor: '17494d', | ||||||
|   supportsConnections: true, |   supportsConnections: true, | ||||||
|   beforeRequest: [addAuthHeader], |   beforeRequest: [addAuthHeader], | ||||||
|   | |||||||
| @@ -38,9 +38,6 @@ if (process.env.WEB_APP_URL) { | |||||||
| let webhookUrl = new URL(process.env.WEBHOOK_URL || apiUrl).toString(); | let webhookUrl = new URL(process.env.WEBHOOK_URL || apiUrl).toString(); | ||||||
| webhookUrl = webhookUrl.substring(0, webhookUrl.length - 1); | webhookUrl = webhookUrl.substring(0, webhookUrl.length - 1); | ||||||
|  |  | ||||||
| const publicDocsUrl = 'https://automatisch.io/docs'; |  | ||||||
| const docsUrl = process.env.DOCS_URL || publicDocsUrl; |  | ||||||
|  |  | ||||||
| const appEnv = process.env.APP_ENV || 'development'; | const appEnv = process.env.APP_ENV || 'development'; | ||||||
|  |  | ||||||
| const appConfig = { | const appConfig = { | ||||||
| @@ -76,7 +73,6 @@ const appConfig = { | |||||||
|   baseUrl: apiUrl, |   baseUrl: apiUrl, | ||||||
|   webAppUrl, |   webAppUrl, | ||||||
|   webhookUrl, |   webhookUrl, | ||||||
|   docsUrl, |  | ||||||
|   telemetryEnabled: process.env.TELEMETRY_ENABLED === 'false' ? false : true, |   telemetryEnabled: process.env.TELEMETRY_ENABLED === 'false' ? false : true, | ||||||
|   requestBodySizeLimit: '1mb', |   requestBodySizeLimit: '1mb', | ||||||
|   smtpHost: process.env.SMTP_HOST, |   smtpHost: process.env.SMTP_HOST, | ||||||
|   | |||||||
| @@ -2,7 +2,7 @@ import appConfig from './app.js'; | |||||||
|  |  | ||||||
| const corsOptions = { | const corsOptions = { | ||||||
|   origin: appConfig.webAppUrl, |   origin: appConfig.webAppUrl, | ||||||
|   methods: 'GET,HEAD,POST,DELETE', |   methods: 'POST', | ||||||
|   credentials: true, |   credentials: true, | ||||||
|   optionsSuccessStatus: 200, |   optionsSuccessStatus: 200, | ||||||
| }; | }; | ||||||
|   | |||||||
| @@ -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(); |  | ||||||
|   }); |  | ||||||
| }); |  | ||||||
| @@ -22,7 +22,7 @@ describe('GET /api/v1/admin/apps/:appKey/auth-clients/:appAuthClientId', () => { | |||||||
|       appKey: 'deepl', |       appKey: 'deepl', | ||||||
|     }); |     }); | ||||||
|  |  | ||||||
|     token = await createAuthTokenByUserId(currentUser.id); |     token = createAuthTokenByUserId(currentUser.id); | ||||||
|   }); |   }); | ||||||
|  |  | ||||||
|   it('should return specified app auth client', async () => { |   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' }); |     adminRole = await createRole({ key: 'admin' }); | ||||||
|     currentUser = await createUser({ roleId: adminRole.id }); |     currentUser = await createUser({ roleId: adminRole.id }); | ||||||
|  |  | ||||||
|     token = await createAuthTokenByUserId(currentUser.id); |     token = createAuthTokenByUserId(currentUser.id); | ||||||
|   }); |   }); | ||||||
|  |  | ||||||
|   it('should return specified app auth client info', async () => { |   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' }); |     role = await createRole({ key: 'admin' }); | ||||||
|     currentUser = await createUser({ roleId: role.id }); |     currentUser = await createUser({ roleId: role.id }); | ||||||
|  |  | ||||||
|     token = await createAuthTokenByUserId(currentUser.id); |     token = createAuthTokenByUserId(currentUser.id); | ||||||
|   }); |   }); | ||||||
|  |  | ||||||
|   it('should return roles', async () => { |   it('should return roles', async () => { | ||||||
|   | |||||||
| @@ -18,7 +18,7 @@ describe('GET /api/v1/admin/roles/:roleId', () => { | |||||||
|     permissionTwo = await createPermission({ roleId: role.id }); |     permissionTwo = await createPermission({ roleId: role.id }); | ||||||
|     currentUser = await createUser({ roleId: role.id }); |     currentUser = await createUser({ roleId: role.id }); | ||||||
|  |  | ||||||
|     token = await createAuthTokenByUserId(currentUser.id); |     token = createAuthTokenByUserId(currentUser.id); | ||||||
|   }); |   }); | ||||||
|  |  | ||||||
|   it('should return role', async () => { |   it('should return role', async () => { | ||||||
|   | |||||||
| @@ -15,7 +15,7 @@ describe('GET /api/v1/admin/roles', () => { | |||||||
|     roleTwo = await createRole({ key: 'user' }); |     roleTwo = await createRole({ key: 'user' }); | ||||||
|     currentUser = await createUser({ roleId: roleOne.id }); |     currentUser = await createUser({ roleId: roleOne.id }); | ||||||
|  |  | ||||||
|     token = await createAuthTokenByUserId(currentUser.id); |     token = createAuthTokenByUserId(currentUser.id); | ||||||
|   }); |   }); | ||||||
|  |  | ||||||
|   it('should return roles', async () => { |   it('should return roles', async () => { | ||||||
|   | |||||||
| @@ -28,7 +28,7 @@ describe('GET /api/v1/admin/saml-auth-providers/:samlAuthProviderId/role-mapping | |||||||
|       remoteRoleName: 'User', |       remoteRoleName: 'User', | ||||||
|     }); |     }); | ||||||
|  |  | ||||||
|     token = await createAuthTokenByUserId(currentUser.id); |     token = createAuthTokenByUserId(currentUser.id); | ||||||
|   }); |   }); | ||||||
|  |  | ||||||
|   it('should return role mappings', async () => { |   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 }); |     currentUser = await createUser({ roleId: role.id }); | ||||||
|     samlAuthProvider = await createSamlAuthProvider(); |     samlAuthProvider = await createSamlAuthProvider(); | ||||||
|  |  | ||||||
|     token = await createAuthTokenByUserId(currentUser.id); |     token = createAuthTokenByUserId(currentUser.id); | ||||||
|   }); |   }); | ||||||
|  |  | ||||||
|   it('should return saml auth provider with specified id', async () => { |   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(); |     samlAuthProviderOne = await createSamlAuthProvider(); | ||||||
|     samlAuthProviderTwo = await createSamlAuthProvider(); |     samlAuthProviderTwo = await createSamlAuthProvider(); | ||||||
|  |  | ||||||
|     token = await createAuthTokenByUserId(currentUser.id); |     token = createAuthTokenByUserId(currentUser.id); | ||||||
|   }); |   }); | ||||||
|  |  | ||||||
|   it('should return saml auth providers', async () => { |   it('should return saml auth providers', async () => { | ||||||
|   | |||||||
| @@ -18,7 +18,7 @@ describe('GET /api/v1/admin/users/:userId', () => { | |||||||
|     anotherUser = await createUser(); |     anotherUser = await createUser(); | ||||||
|     anotherUserRole = await anotherUser.$relatedQuery('role'); |     anotherUserRole = await anotherUser.$relatedQuery('role'); | ||||||
|  |  | ||||||
|     token = await createAuthTokenByUserId(currentUser.id); |     token = createAuthTokenByUserId(currentUser.id); | ||||||
|   }); |   }); | ||||||
|  |  | ||||||
|   it('should return specified user info', async () => { |   it('should return specified user info', async () => { | ||||||
|   | |||||||
| @@ -28,7 +28,7 @@ describe('GET /api/v1/admin/users', () => { | |||||||
|       fullName: 'Another User', |       fullName: 'Another User', | ||||||
|     }); |     }); | ||||||
|  |  | ||||||
|     token = await createAuthTokenByUserId(currentUser.id); |     token = createAuthTokenByUserId(currentUser.id); | ||||||
|   }); |   }); | ||||||
|  |  | ||||||
|   it('should return users data', async () => { |   it('should return users data', async () => { | ||||||
|   | |||||||
| @@ -11,7 +11,7 @@ describe('GET /api/v1/apps/:appKey/actions/:actionKey/substeps', () => { | |||||||
|  |  | ||||||
|   beforeEach(async () => { |   beforeEach(async () => { | ||||||
|     currentUser = await createUser(); |     currentUser = await createUser(); | ||||||
|     token = await createAuthTokenByUserId(currentUser.id); |     token = createAuthTokenByUserId(currentUser.id); | ||||||
|     exampleApp = await App.findOneByKey('github'); |     exampleApp = await App.findOneByKey('github'); | ||||||
|   }); |   }); | ||||||
|  |  | ||||||
|   | |||||||
| @@ -11,7 +11,7 @@ describe('GET /api/v1/apps/:appKey/actions', () => { | |||||||
|  |  | ||||||
|   beforeEach(async () => { |   beforeEach(async () => { | ||||||
|     currentUser = await createUser(); |     currentUser = await createUser(); | ||||||
|     token = await createAuthTokenByUserId(currentUser.id); |     token = createAuthTokenByUserId(currentUser.id); | ||||||
|   }); |   }); | ||||||
|  |  | ||||||
|   it('should return the app actions', async () => { |   it('should return the app actions', async () => { | ||||||
|   | |||||||
| @@ -11,7 +11,7 @@ describe('GET /api/v1/apps/:appKey', () => { | |||||||
|  |  | ||||||
|   beforeEach(async () => { |   beforeEach(async () => { | ||||||
|     currentUser = await createUser(); |     currentUser = await createUser(); | ||||||
|     token = await createAuthTokenByUserId(currentUser.id); |     token = createAuthTokenByUserId(currentUser.id); | ||||||
|   }); |   }); | ||||||
|  |  | ||||||
|   it('should return the app info', async () => { |   it('should return the app info', async () => { | ||||||
|   | |||||||
| @@ -11,7 +11,7 @@ describe('GET /api/v1/apps', () => { | |||||||
|  |  | ||||||
|   beforeEach(async () => { |   beforeEach(async () => { | ||||||
|     currentUser = await createUser(); |     currentUser = await createUser(); | ||||||
|     token = await createAuthTokenByUserId(currentUser.id); |     token = createAuthTokenByUserId(currentUser.id); | ||||||
|     apps = await App.findAll(); |     apps = await App.findAll(); | ||||||
|   }); |   }); | ||||||
|  |  | ||||||
|   | |||||||
| @@ -19,7 +19,7 @@ describe('GET /api/v1/apps/:appKey/auth-clients/:appAuthClientId', () => { | |||||||
|       appKey: 'deepl', |       appKey: 'deepl', | ||||||
|     }); |     }); | ||||||
|  |  | ||||||
|     token = await createAuthTokenByUserId(currentUser.id); |     token = createAuthTokenByUserId(currentUser.id); | ||||||
|   }); |   }); | ||||||
|  |  | ||||||
|   it('should return specified app auth client', async () => { |   it('should return specified app auth client', async () => { | ||||||
|   | |||||||
| @@ -15,7 +15,7 @@ describe('GET /api/v1/apps/:appKey/auth-clients', () => { | |||||||
|  |  | ||||||
|     currentUser = await createUser(); |     currentUser = await createUser(); | ||||||
|  |  | ||||||
|     token = await createAuthTokenByUserId(currentUser.id); |     token = createAuthTokenByUserId(currentUser.id); | ||||||
|   }); |   }); | ||||||
|  |  | ||||||
|   it('should return specified app auth client info', async () => { |   it('should return specified app auth client info', async () => { | ||||||
|   | |||||||
| @@ -11,7 +11,7 @@ describe('GET /api/v1/apps/:appKey/auth', () => { | |||||||
|  |  | ||||||
|   beforeEach(async () => { |   beforeEach(async () => { | ||||||
|     currentUser = await createUser(); |     currentUser = await createUser(); | ||||||
|     token = await createAuthTokenByUserId(currentUser.id); |     token = createAuthTokenByUserId(currentUser.id); | ||||||
|   }); |   }); | ||||||
|  |  | ||||||
|   it('should return the app auth info', async () => { |   it('should return the app auth info', async () => { | ||||||
|   | |||||||
| @@ -22,7 +22,7 @@ describe('GET /api/v1/apps/:appKey/config', () => { | |||||||
|       disabled: false, |       disabled: false, | ||||||
|     }); |     }); | ||||||
|  |  | ||||||
|     token = await createAuthTokenByUserId(currentUser.id); |     token = createAuthTokenByUserId(currentUser.id); | ||||||
|   }); |   }); | ||||||
|  |  | ||||||
|   it('should return specified app config info', async () => { |   it('should return specified app config info', async () => { | ||||||
|   | |||||||
| @@ -14,7 +14,7 @@ describe('GET /api/v1/apps/:appKey/connections', () => { | |||||||
|     currentUser = await createUser(); |     currentUser = await createUser(); | ||||||
|     currentUserRole = await currentUser.$relatedQuery('role'); |     currentUserRole = await currentUser.$relatedQuery('role'); | ||||||
|  |  | ||||||
|     token = await createAuthTokenByUserId(currentUser.id); |     token = createAuthTokenByUserId(currentUser.id); | ||||||
|   }); |   }); | ||||||
|  |  | ||||||
|   it('should return the connections data of specified app for current user', async () => { |   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(); |     currentUser = await createUser(); | ||||||
|     currentUserRole = await currentUser.$relatedQuery('role'); |     currentUserRole = await currentUser.$relatedQuery('role'); | ||||||
|  |  | ||||||
|     token = await createAuthTokenByUserId(currentUser.id); |     token = createAuthTokenByUserId(currentUser.id); | ||||||
|   }); |   }); | ||||||
|  |  | ||||||
|   it('should return the flows data of specified app for current user', async () => { |   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 () => { |   beforeEach(async () => { | ||||||
|     currentUser = await createUser(); |     currentUser = await createUser(); | ||||||
|     token = await createAuthTokenByUserId(currentUser.id); |     token = createAuthTokenByUserId(currentUser.id); | ||||||
|     exampleApp = await App.findOneByKey('github'); |     exampleApp = await App.findOneByKey('github'); | ||||||
|   }); |   }); | ||||||
|  |  | ||||||
|   | |||||||
| @@ -11,7 +11,7 @@ describe('GET /api/v1/apps/:appKey/triggers', () => { | |||||||
|  |  | ||||||
|   beforeEach(async () => { |   beforeEach(async () => { | ||||||
|     currentUser = await createUser(); |     currentUser = await createUser(); | ||||||
|     token = await createAuthTokenByUserId(currentUser.id); |     token = createAuthTokenByUserId(currentUser.id); | ||||||
|   }); |   }); | ||||||
|  |  | ||||||
|   it('should return the app triggers', async () => { |   it('should return the app triggers', async () => { | ||||||
|   | |||||||
| @@ -14,7 +14,7 @@ describe('POST /api/v1/connections/:connectionId/test', () => { | |||||||
|     currentUser = await createUser(); |     currentUser = await createUser(); | ||||||
|     currentUserRole = await currentUser.$relatedQuery('role'); |     currentUserRole = await currentUser.$relatedQuery('role'); | ||||||
|  |  | ||||||
|     token = await createAuthTokenByUserId(currentUser.id); |     token = createAuthTokenByUserId(currentUser.id); | ||||||
|   }); |   }); | ||||||
|  |  | ||||||
|   it('should update the connection as not verified for current user', async () => { |   it('should update the connection as not verified for current user', async () => { | ||||||
|   | |||||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user