Compare commits
	
		
			499 Commits
		
	
	
		
			fix-vtiger
			...
			replace-wi
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|   | f4a2e1a84b | ||
|   | 788530be45 | ||
|   | 7ed392e854 | ||
|   | 3932e554da | ||
|   | 1a21624618 | ||
|   | 9f292ff018 | ||
|   | dbb24b3a9b | ||
|   | 35b2639837 | ||
|   | 35951199cd | ||
|   | 79af909c51 | ||
|   | 3482aa7b76 | ||
|   | 5dbc1f59ef | ||
|   | 2166a3220e | ||
|   | 24a7d1ef10 | ||
|   | 18ffbb7317 | ||
|   | 363874de6a | ||
|   | 68d1719b11 | ||
|   | 1a75d81268 | ||
|   | 2163be4227 | ||
|   | b54afcd922 | ||
|   | 0a86641a0f | ||
|   | 18464c746a | ||
|   | ba92cddae1 | ||
|   | 2a4f8ed45f | ||
|   | 135a0028be | ||
|   | 4da6e8372f | ||
|   | 6a7cdf2570 | ||
|   | 73c929f25e | ||
|   | 754c2d41c2 | ||
|   | 7201e48111 | ||
|   | e4292815cd | ||
|   | ab37250d5d | ||
|   | e5be8d3ba7 | ||
|   | 96a421fa22 | ||
|   | 12f72401b1 | ||
|   | 7391a9eddc | ||
|   | 30dee27f72 | ||
|   | 51a9939034 | ||
|   | e03c6e0ca4 | ||
|   | bece5c6488 | ||
|   | d49bb4c52d | ||
|   | 73d0eec30c | ||
|   | 5c756b16ca | ||
|   | f482c2422c | ||
|   | 2e564c863f | ||
|   | d9917a81bb | ||
|   | 61dc431f92 | ||
|   | 7d2fb8d9d7 | ||
|   | 608b79b66f | ||
|   | 009754c18b | ||
|   | 5df07c289e | ||
|   | a36d10870b | ||
|   | b549ba3e39 | ||
|   | 897c96361f | ||
|   | e7693d8aa6 | ||
|   | 1fe755f836 | ||
|   | ea1a63f7dd | ||
|   | 85134722a5 | ||
|   | 5c9d3ed134 | ||
|   | 17fb935ea0 | ||
|   | 196642a1cf | ||
|   | 009cf63d8c | ||
|   | da399aacd6 | ||
|   | 3632ee77e5 | ||
|   | 2901f337cc | ||
|   | f0bd2f335b | ||
|   | acdd026448 | ||
|   | fb0a328ab0 | ||
|   | d2a7889fc9 | ||
|   | 88c50e014d | ||
|   | f0ef12f904 | ||
|   | 1827f5413f | ||
|   | 0609f30e25 | ||
|   | d4e4d95b6d | ||
|   | d74af4931e | ||
|   | bee043d10d | ||
|   | a65e48b98a | ||
|   | ee26b54d54 | ||
|   | 855ec53dc2 | ||
|   | 3e3e48110d | ||
|   | fc04a357c8 | ||
|   | c8147370de | ||
|   | 999426be89 | ||
|   | 91458f91ef | ||
|   | 4b9ed29cc0 | ||
|   | e3bcb673fb | ||
|   | bf4776ca4f | ||
|   | 9f7f30a92a | ||
|   | 5c29fff55e | ||
|   | a0160c2573 | ||
|   | 87d3ca287d | ||
|   | 526e093689 | ||
|   | 0930c9d8d6 | ||
| ![dependabot[bot]](/assets/img/avatar_default.png)  | ec680a713d | ||
|   | 583f90d1e9 | ||
|   | 8ba95381bc | ||
|   | ec6d634b99 | ||
|   | bc082acbe7 | ||
|   | e474ba02cb | ||
|   | ea922aaf10 | ||
|   | 766e6e20d8 | ||
|   | 8e646c244e | ||
|   | 26f31a5899 | ||
|   | 5c79e374dd | ||
|   | 7c1473ea95 | ||
|   | 1fe4cc3258 | ||
|   | 042ad4cea1 | ||
|   | e4c998dbce | ||
|   | 83c8cacdac | ||
|   | f75d5d906e | ||
|   | 85b3856564 | ||
|   | 75cb2569b5 | ||
|   | 0a4ac1cece | ||
|   | a873fd14bd | ||
|   | 85b4cd4998 | ||
|   | e9bc9b1aa8 | ||
|   | e3bf599bf6 | ||
|   | 01ae96840e | ||
|   | 186160ebf4 | ||
|   | 70f5e45c1f | ||
|   | 6dc54ecabc | ||
|   | d21888c047 | ||
|   | 33f7a90042 | ||
|   | a00d3a2c5e | ||
|   | abc64d769c | ||
|   | 88754ac569 | ||
|   | e3ee05d47d | ||
|   | 3b004e7483 | ||
|   | 9aa48c20e4 | ||
|   | 1b5d3beeca | ||
|   | 00115d313e | ||
|   | 190f1a205f | ||
|   | 8ab6f0c3fe | ||
|   | 13eea263c0 | ||
|   | b52b40962e | ||
|   | 7d1fa2e40c | ||
|   | 93b2098829 | ||
|   | a2acdc6b12 | ||
|   | 38b2c1e30f | ||
|   | e07f579f3c | ||
|   | df3297b6ca | ||
|   | fc4eeed764 | ||
|   | 3596d13be1 | ||
|   | 104d49ea1c | ||
|   | 7057317446 | ||
|   | 280575df88 | ||
|   | d2cb434b7b | ||
|   | 2ecb802a2e | ||
|   | 46e706c415 | ||
|   | 3a57349d8a | ||
| ![dependabot[bot]](/assets/img/avatar_default.png)  | 565db852e0 | ||
|   | 754c3269ec | ||
|   | a079842408 | ||
|   | 7664b58553 | ||
|   | de77488f7e | ||
|   | d808afd21b | ||
|   | b68aff76a1 | ||
|   | 6da7fe158f | ||
|   | 4dbc7fdc7d | ||
|   | ad1e1f7eca | ||
|   | 9c3f7a3823 | ||
|   | 86f4cb7701 | ||
|   | 359a90245d | ||
|   | d8d7d86359 | ||
|   | 7189b629c0 | ||
|   | 55c9b5566c | ||
|   | ab671ccbf7 | ||
|   | 316bda8c3f | ||
|   | 76f77e8a4c | ||
|   | 4a99d5eab7 | ||
|   | 473d287c6d | ||
|   | bddd9896e4 | ||
|   | 95eb115965 | ||
|   | 9a63b213b0 | ||
|   | 90b00d88f1 | ||
|   | ec87c7f21c | ||
|   | 452f45cac6 | ||
|   | c644b3d384 | ||
|   | 68160c20e8 | ||
|   | ad144206dd | ||
|   | f3d20ab769 | ||
|   | 9767ca7116 | ||
|   | 73a5b8553f | ||
| ![dependabot[bot]](/assets/img/avatar_default.png)  | 5c684cd499 | ||
|   | 479f3e3172 | ||
|   | 6a1350fd00 | ||
|   | 563784da1c | ||
|   | 347f0ed3a5 | ||
|   | 1db9f5b2c2 | ||
|   | f2a3e26188 | ||
|   | 1c0897bfb6 | ||
|   | f0793992a6 | ||
|   | 393205ba2f | ||
|   | ab49535b6c | ||
|   | 8191b48548 | ||
|   | 925dd06432 | ||
|   | 0d525e056a | ||
|   | 3aa86eebf2 | ||
|   | d7a93abec0 | ||
|   | 6448d28a18 | ||
|   | 449976483c | ||
|   | e468b762ef | ||
|   | b578e73cc4 | ||
|   | e381f95b95 | ||
|   | 5685afae63 | ||
|   | 53a473422b | ||
|   | 3f9f17f584 | ||
|   | 2c410bf318 | ||
|   | 40934a2c77 | ||
|   | ecc9379d7e | ||
|   | f8d27342dc | ||
|   | 17bd2bf2ba | ||
|   | d984a3f275 | ||
|   | 64049bd546 | ||
|   | 9218091c33 | ||
|   | 75df7d6413 | ||
|   | 29341f81e1 | ||
|   | 68c5a3dca7 | ||
|   | b1e2e370c8 | ||
|   | ba9d3afc88 | ||
|   | 9a0434be32 | ||
|   | d6923a2ff0 | ||
|   | 8f7f6dc19e | ||
|   | 70b8817643 | ||
|   | 87c25cbbfe | ||
|   | 082e905014 | ||
|   | e3e598b208 | ||
|   | 6cf92d4ea6 | ||
|   | 89ad685f3a | ||
|   | 1e868dc802 | ||
|   | 58fcfd9a34 | ||
|   | c849afbc11 | ||
|   | 2ebe71ddd0 | ||
|   | 7a8e8c1f3e | ||
|   | 5e897ad1c2 | ||
|   | ce07907f85 | ||
|   | 1e38aa7b53 | ||
|   | 3bc0c23e5a | ||
|   | f07b6d105a | ||
|   | 46491269e3 | ||
|   | 8d9c43af6a | ||
|   | c3568354aa | ||
|   | e68696ccd4 | ||
|   | 35d8b2e790 | ||
|   | 1f83573206 | ||
|   | 2887e76514 | ||
|   | 63b9943203 | ||
|   | bd5aedd83f | ||
|   | c9ff6d7bb9 | ||
|   | 5835def5d0 | ||
|   | 6a2694ce3b | ||
|   | 65ae7bce79 | ||
|   | 57ce8da0ee | ||
|   | 7484bf7403 | ||
|   | f6b2312c49 | ||
|   | 6027cb7cb0 | ||
|   | c1740aae6c | ||
|   | 22ce29e86c | ||
|   | 251d1b5b2e | ||
|   | ea64708c69 | ||
|   | 209ec27a29 | ||
|   | ceee495525 | ||
|   | 751a2347aa | ||
|   | efd96d5fdf | ||
|   | 2ee5af8bfb | ||
|   | a4c0edf493 | ||
|   | 28c8be97b6 | ||
|   | f320a44d45 | ||
|   | c0cc6cc176 | ||
|   | be62c09d06 | ||
|   | 5fe3546d2a | ||
|   | c4b2ea125c | ||
|   | 3301b038fe | ||
|   | 6a58d1e3da | ||
|   | e5670d820d | ||
|   | 1870aead73 | ||
|   | 95db6cca2c | ||
|   | 79a792ac62 | ||
|   | 6406f9eb86 | ||
|   | 8f8ec496f8 | ||
|   | 3d6847a3a2 | ||
|   | 613abaec1b | ||
|   | b51ae9ac38 | ||
|   | c4fd03542b | ||
|   | e40d6c5ef0 | ||
|   | 9f7dee3baa | ||
|   | d3da62c04a | ||
|   | aa7bb3f8c9 | ||
|   | 3a9dfe339a | ||
|   | 08830003a3 | ||
|   | efeeb6cb02 | ||
|   | ac59ce2deb | ||
|   | 3ff89a03ac | ||
|   | 25e231cd7c | ||
|   | f4d8d909b0 | ||
|   | 35ea18a117 | ||
|   | ee9433261b | ||
|   | 1cb48c7760 | ||
|   | 172bf4bd51 | ||
|   | fe1039cfbc | ||
|   | a9de79546b | ||
|   | 7afdf43872 | ||
|   | bfc7d5d0dd | ||
|   | 690832052a | ||
|   | f7c1a47d52 | ||
|   | 930843d065 | ||
|   | a9ee609502 | ||
|   | 9fd2125923 | ||
|   | ede8703f9d | ||
|   | 6d85623d9b | ||
|   | 6236ee8f6d | ||
|   | 92665d80d6 | ||
|   | 70ae0bc77e | ||
|   | e28c757352 | ||
|   | 7cdcf7ebab | ||
|   | 7c368af5ed | ||
|   | df2fbbabc6 | ||
|   | 48141eb199 | ||
|   | 343fbb282c | ||
|   | cea9ed056b | ||
|   | 73bd90c555 | ||
|   | 917de46c45 | ||
|   | b592092923 | ||
|   | 760bc1c22a | ||
|   | 1f8b81ee78 | ||
|   | 70af7d05e3 | ||
|   | 14c04ee4ac | ||
|   | 83815d3caa | ||
|   | 487c621fa5 | ||
|   | 304eab801c | ||
|   | dfe3add1cc | ||
|   | a32bf5539e | ||
|   | e944333e5f | ||
|   | dad23a52b0 | ||
|   | 53606c306d | ||
|   | 53b03f8231 | ||
|   | ac5f6dc024 | ||
|   | 2c15e0dd32 | ||
|   | 007334fef0 | ||
|   | b3ae2d2748 | ||
|   | 7149c766d0 | ||
|   | 5dca0191d2 | ||
|   | 356668a68d | ||
|   | 63c9442126 | ||
|   | 0031d7911d | ||
|   | 31c92b43b4 | ||
|   | 2667548041 | ||
|   | 54282ba7e0 | ||
|   | 7f324abd44 | ||
|   | 65a0c3b40a | ||
|   | 2449baac5b | ||
|   | 0ab03e1856 | ||
|   | 9a3f85106c | ||
|   | 42c495d8ab | ||
|   | 58def585f1 | ||
|   | 047034d831 | ||
|   | bdb2f24a81 | ||
|   | 636870a075 | ||
|   | 8981174302 | ||
|   | dd5f05334b | ||
|   | 929b626b51 | ||
|   | 7d5b2ec81e | ||
|   | f0e2d36c34 | ||
|   | 94f171d757 | ||
|   | 04e06db430 | ||
|   | d74b215169 | ||
|   | 404ea94dd2 | ||
|   | 4afe7c6b46 | ||
|   | 60b20c4d01 | ||
|   | 58658c6b1a | ||
|   | ec444317b3 | ||
|   | 8b4aee1afa | ||
|   | 51abd74304 | ||
|   | b93b465f09 | ||
|   | 5aad68ec62 | ||
|   | 74fbc937a1 | ||
|   | 7e35f544eb | ||
|   | ed1c3cffc1 | ||
|   | c4983a9f9b | ||
|   | 5b43262e7a | ||
|   | dad4408679 | ||
|   | a78c4d12b4 | ||
|   | 74664a9df8 | ||
|   | fce5281a03 | ||
|   | de0bd2f486 | ||
|   | 079fb5d108 | ||
|   | 1c7435a32b | ||
|   | 1afd374cf6 | ||
|   | 3adf549915 | ||
|   | e94d669eca | ||
|   | 5fac0b4689 | ||
|   | 832d323a6e | ||
|   | 03f1dbd5b2 | ||
|   | c0a216f109 | ||
|   | ad67b13270 | ||
|   | 5d420c08c6 | ||
|   | 3d8235c670 | ||
|   | 5a209f81d1 | ||
|   | d17d8e2805 | ||
|   | ca7636e7bc | ||
|   | 532cfc10d0 | ||
|   | 72d68c4377 | ||
|   | 00f5964aa4 | ||
|   | bd1ad5fa56 | ||
|   | f2e22e7445 | ||
|   | fcf345abab | ||
|   | 24ad43d3e4 | ||
|   | 9a7cdf42e1 | ||
|   | c36b652d5b | ||
|   | 553070fc23 | ||
|   | 5d69f7e24f | ||
|   | bc0e2bada0 | ||
|   | 80b6cc1d94 | ||
|   | bce3273e64 | ||
|   | 3abf61152a | ||
|   | 14923d4cd6 | ||
|   | 6fdc4bf900 | ||
|   | d21e1f75b5 | ||
|   | 84a0b37fcc | ||
|   | f135a0f09e | ||
|   | 0f24c99456 | ||
|   | 9eae0ab947 | ||
|   | 3bf1f79c79 | ||
|   | b21074c871 | ||
|   | d7893d9a32 | ||
|   | 9cbdda330c | ||
|   | 42a9bfd099 | ||
|   | eb15bd01ca | ||
|   | 9e98aebeb3 | ||
|   | 1361cbc826 | ||
|   | 679d0808a9 | ||
|   | 6fe9a548ad | ||
|   | 2d6d2430d2 | ||
|   | a445538e81 | ||
|   | 50d38ffbd8 | ||
|   | 93bcdfd9c9 | ||
|   | 5be3b101a5 | ||
|   | 024c7476c7 | ||
|   | 30a7ffe93d | ||
|   | e2d803ebf7 | ||
|   | be7e67c940 | ||
|   | ead4b13ba5 | ||
|   | e02c42ee18 | ||
|   | d39886fdf8 | ||
|   | 11a425f1de | ||
|   | f0e194e584 | ||
|   | d4b9331cf2 | ||
|   | 37e1acc5f1 | ||
|   | ffaf6a577d | ||
|   | afdaf6ba39 | ||
|   | 4c49367910 | ||
|   | a506c4411d | ||
|   | 1859c9854e | ||
|   | 6ff29b9ae6 | ||
|   | 3578f6b849 | ||
|   | 0347864fde | ||
|   | 5f9786a2c7 | ||
|   | 75aeff1898 | ||
|   | 0afcdce6d3 | ||
|   | a591d0ea87 | ||
|   | 0e111a3532 | ||
|   | b599466ffa | ||
|   | 69727e78df | ||
|   | 02ae67b147 | ||
|   | a769f78801 | ||
|   | d583e42428 | ||
|   | da732becb6 | ||
|   | b89a4d58d9 | ||
|   | 09854147d1 | ||
|   | 3648c2bfe3 | ||
|   | 3f3ee032f6 | ||
|   | 68e5d54331 | ||
|   | 824c434b0b | ||
|   | 9f0e0ca656 | ||
|   | 95f89ba03e | ||
|   | 697f72ecf4 | ||
|   | 4f03f2ab51 | ||
|   | c81531cb7a | ||
|   | 7b6e4aa153 | ||
|   | f21039d19d | ||
|   | 8c936a91be | ||
|   | 24451892ff | ||
|   | 6bba2c82fe | ||
|   | 3320dc6bc4 | ||
|   | 9d42fd9293 | ||
|   | e6b806616f | ||
|   | 6ec5872391 | ||
|   | a26cf932a1 | ||
|   | 38a3e3ab9f | ||
|   | 32b17c1418 | ||
|   | 44aa6a1579 | ||
|   | 2369aacd2a | ||
|   | 7dafc6364b | ||
|   | 3d25fa0aeb | ||
|   | 0297b0f296 | ||
|   | 4c7d09c3d8 | ||
|   | 48a74826e8 | ||
|   | ef34068ac4 | ||
| ![dependabot[bot]](/assets/img/avatar_default.png)  | 3987a8db77 | 
| @@ -28,7 +28,7 @@ cd packages/web | |||||||
| rm -rf .env | rm -rf .env | ||||||
| echo " | echo " | ||||||
| PORT=$WEB_PORT | PORT=$WEB_PORT | ||||||
| REACT_APP_GRAPHQL_URL=http://localhost:$BACKEND_PORT/graphql | REACT_APP_BACKEND_URL=http://localhost:$BACKEND_PORT | ||||||
| " >> .env | " >> .env | ||||||
| cd $CURRENT_DIR | cd $CURRENT_DIR | ||||||
|  |  | ||||||
|   | |||||||
| @@ -8,7 +8,7 @@ | |||||||
|       "version": "latest" |       "version": "latest" | ||||||
|     }, |     }, | ||||||
|     "ghcr.io/devcontainers/features/node:1": { |     "ghcr.io/devcontainers/features/node:1": { | ||||||
|       "version": 16 |       "version": 18 | ||||||
|     }, |     }, | ||||||
|     "ghcr.io/devcontainers/features/common-utils:1": { |     "ghcr.io/devcontainers/features/common-utils:1": { | ||||||
|       "username": "vscode", |       "username": "vscode", | ||||||
|   | |||||||
| @@ -4,5 +4,9 @@ | |||||||
| **/.devcontainer | **/.devcontainer | ||||||
| **/.github | **/.github | ||||||
| **/.vscode | **/.vscode | ||||||
|  | **/.env | ||||||
|  | **/.env.test | ||||||
|  | **/.env.production | ||||||
|  | **/yarn-error.log | ||||||
| packages/docs | packages/docs | ||||||
| packages/e2e-test | packages/e2e-test | ||||||
|   | |||||||
							
								
								
									
										18
									
								
								.eslintrc.js
									
									
									
									
									
								
							
							
						
						
									
										18
									
								
								.eslintrc.js
									
									
									
									
									
								
							| @@ -1,18 +0,0 @@ | |||||||
| 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 ${{ github.repository }} repository has been cloned to the runner." | ||||||
|       - run: echo "🖥️ The workflow is now ready to test your code on the runner." |       - run: echo "🖥️ The workflow is now ready to test your code on the runner." | ||||||
|       - run: yarn --frozen-lockfile |       - run: yarn --frozen-lockfile | ||||||
|       - run: yarn lint |       - run: cd packages/backend && yarn lint | ||||||
|       - run: echo "🍏 This job's status is ${{ job.status }}." |       - run: echo "🍏 This job's status is ${{ job.status }}." | ||||||
|   start-backend-server: |   start-backend-server: | ||||||
|     runs-on: ubuntu-latest |     runs-on: ubuntu-latest | ||||||
|   | |||||||
							
								
								
									
										32
									
								
								.github/workflows/docs-change.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										32
									
								
								.github/workflows/docs-change.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,32 @@ | |||||||
|  | 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,8 +62,9 @@ jobs: | |||||||
|         run: yarn && yarn lerna bootstrap |         run: yarn && yarn lerna bootstrap | ||||||
|       - name: Install Playwright Browsers |       - name: Install Playwright Browsers | ||||||
|         run: yarn playwright install --with-deps |         run: yarn playwright install --with-deps | ||||||
|       - name: Build Automatisch |       - name: Build Automatisch web | ||||||
|         run: yarn lerna run --scope=@*/{web,cli} build |         working-directory: ./packages/web | ||||||
|  |         run: yarn build | ||||||
|         env: |         env: | ||||||
|           # Keep this until we clean up warnings in build processes |           # Keep this until we clean up warnings in build processes | ||||||
|           CI: false |           CI: false | ||||||
|   | |||||||
| @@ -1,14 +1,25 @@ | |||||||
| # syntax=docker/dockerfile:1 | # syntax=docker/dockerfile:1 | ||||||
| FROM node:18-alpine | FROM node:18-alpine | ||||||
| WORKDIR /automatisch |  | ||||||
|  | ENV PORT 3000 | ||||||
|  |  | ||||||
|  | RUN \ | ||||||
|  |   apk --no-cache add --virtual build-dependencies python3 build-base git | ||||||
|  |  | ||||||
|  | WORKDIR /automatisch | ||||||
|  |  | ||||||
|  | # copy the app, note .dockerignore | ||||||
|  | COPY . /automatisch | ||||||
|  |  | ||||||
|  | RUN yarn | ||||||
|  |  | ||||||
|  | RUN cd packages/web && yarn build | ||||||
|  |  | ||||||
| RUN \ | 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 ./entrypoint.sh /entrypoint.sh | COPY ./docker/entrypoint.sh /entrypoint.sh | ||||||
|  |  | ||||||
| EXPOSE 3000 | EXPOSE 3000 | ||||||
| ENTRYPOINT ["sh", "/entrypoint.sh"] | ENTRYPOINT ["sh", "/entrypoint.sh"] | ||||||
|   | |||||||
| @@ -2,8 +2,12 @@ | |||||||
|  |  | ||||||
| set -e | set -e | ||||||
|  |  | ||||||
|  | cd packages/backend | ||||||
|  |  | ||||||
| if [ -n "$WORKER" ]; then | if [ -n "$WORKER" ]; then | ||||||
|   automatisch start-worker |   yarn start:worker | ||||||
| else | else | ||||||
|   automatisch start |   yarn db:migrate | ||||||
|  |   yarn db:seed:user | ||||||
|  |   yarn start | ||||||
| fi | fi | ||||||
|   | |||||||
| @@ -6,7 +6,6 @@ | |||||||
|     "start": "lerna run --stream --parallel --scope=@*/{web,backend} dev", |     "start": "lerna run --stream --parallel --scope=@*/{web,backend} dev", | ||||||
|     "start:web": "lerna run --stream --scope=@*/web dev", |     "start:web": "lerna run --stream --scope=@*/web dev", | ||||||
|     "start:backend": "lerna run --stream --scope=@*/backend 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" |     "build:docs": "cd ./packages/docs && yarn install && yarn build" | ||||||
|   }, |   }, | ||||||
|   "workspaces": { |   "workspaces": { | ||||||
| @@ -21,8 +20,6 @@ | |||||||
|     ] |     ] | ||||||
|   }, |   }, | ||||||
|   "devDependencies": { |   "devDependencies": { | ||||||
|     "@typescript-eslint/eslint-plugin": "^5.9.1", |  | ||||||
|     "@typescript-eslint/parser": "^5.9.1", |  | ||||||
|     "eslint": "^8.13.0", |     "eslint": "^8.13.0", | ||||||
|     "eslint-config-prettier": "^8.3.0", |     "eslint-config-prettier": "^8.3.0", | ||||||
|     "eslint-plugin-prettier": "^4.0.0", |     "eslint-plugin-prettier": "^4.0.0", | ||||||
|   | |||||||
| @@ -11,7 +11,7 @@ | |||||||
|     "start:worker": "node src/worker.js", |     "start:worker": "node src/worker.js", | ||||||
|     "pretest": "APP_ENV=test node ./test/setup/prepare-test-env.js", |     "pretest": "APP_ENV=test node ./test/setup/prepare-test-env.js", | ||||||
|     "test": "APP_ENV=test vitest run", |     "test": "APP_ENV=test vitest run", | ||||||
|     "lint": "eslint . --ignore-path ../../.eslintignore", |     "lint": "eslint .", | ||||||
|     "db:create": "node ./bin/database/create.js", |     "db:create": "node ./bin/database/create.js", | ||||||
|     "db:seed:user": "node ./bin/database/seed-user.js", |     "db:seed:user": "node ./bin/database/seed-user.js", | ||||||
|     "db:drop": "node ./bin/database/drop.js", |     "db:drop": "node ./bin/database/drop.js", | ||||||
| @@ -31,21 +31,20 @@ | |||||||
|     "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.0.1", |     "bcrypt": "^5.1.0", | ||||||
|     "bullmq": "^3.0.0", |     "bullmq": "^3.0.0", | ||||||
|     "copyfiles": "^2.4.1", |  | ||||||
|     "cors": "^2.8.5", |     "cors": "^2.8.5", | ||||||
|     "crypto-js": "^4.1.1", |     "crypto-js": "^4.1.1", | ||||||
|     "debug": "~2.6.9", |     "debug": "~2.6.9", | ||||||
|     "dotenv": "^10.0.0", |     "dotenv": "^10.0.0", | ||||||
|     "express": "~4.18.2", |     "express": "~4.18.2", | ||||||
|  |     "express-async-handler": "^1.2.0", | ||||||
|     "express-basic-auth": "^1.2.1", |     "express-basic-auth": "^1.2.1", | ||||||
|     "express-graphql": "^0.12.0", |     "express-graphql": "^0.12.0", | ||||||
|     "fast-xml-parser": "^4.0.11", |     "fast-xml-parser": "^4.0.11", | ||||||
|     "graphql-middleware": "^6.1.15", |     "graphql-middleware": "^6.1.15", | ||||||
|     "graphql-shield": "^7.5.0", |     "graphql-shield": "^7.5.0", | ||||||
|     "graphql-tools": "^8.2.0", |     "graphql-tools": "^8.2.0", | ||||||
|     "graphql-type-json": "^0.3.2", |  | ||||||
|     "handlebars": "^4.7.7", |     "handlebars": "^4.7.7", | ||||||
|     "http-errors": "~1.6.3", |     "http-errors": "~1.6.3", | ||||||
|     "http-proxy-agent": "^7.0.0", |     "http-proxy-agent": "^7.0.0", | ||||||
| @@ -68,7 +67,6 @@ | |||||||
|     "pluralize": "^8.0.0", |     "pluralize": "^8.0.0", | ||||||
|     "raw-body": "^2.5.2", |     "raw-body": "^2.5.2", | ||||||
|     "showdown": "^2.1.0", |     "showdown": "^2.1.0", | ||||||
|     "stripe": "^11.13.0", |  | ||||||
|     "winston": "^3.7.1", |     "winston": "^3.7.1", | ||||||
|     "xmlrpc": "^1.3.2" |     "xmlrpc": "^1.3.2" | ||||||
|   }, |   }, | ||||||
| @@ -97,6 +95,7 @@ | |||||||
|     "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: 'https://automatisch.io/docs/apps/azure-openai/connection', |   authDocUrl: '{DOCS_URL}/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: 'https://automatisch.io/docs/apps/carbone/connection', |   authDocUrl: '{DOCS_URL}/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', | ||||||
|   | |||||||
| @@ -0,0 +1,27 @@ | |||||||
|  | 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, | ||||||
|  |     }); | ||||||
|  |   }, | ||||||
|  | }); | ||||||
							
								
								
									
										4
									
								
								packages/backend/src/apps/datastore/actions/index.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										4
									
								
								packages/backend/src/apps/datastore/actions/index.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,4 @@ | |||||||
|  | import getValue from './get-value/index.js'; | ||||||
|  | import setValue from './set-value/index.js'; | ||||||
|  |  | ||||||
|  | export default [getValue, setValue]; | ||||||
| @@ -0,0 +1,36 @@ | |||||||
|  | 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, | ||||||
|  |     }); | ||||||
|  |   }, | ||||||
|  | }); | ||||||
							
								
								
									
										13
									
								
								packages/backend/src/apps/datastore/assets/favicon.svg
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								packages/backend/src/apps/datastore/assets/favicon.svg
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,13 @@ | |||||||
|  | <?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> | ||||||
| After Width: | Height: | Size: 704 B | 
							
								
								
									
										14
									
								
								packages/backend/src/apps/datastore/index.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								packages/backend/src/apps/datastore/index.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,14 @@ | |||||||
|  | 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', |   name: 'DeepL', | ||||||
|   key: 'deepl', |   key: 'deepl', | ||||||
|   iconUrl: '{BASE_URL}/apps/deepl/assets/favicon.svg', |   iconUrl: '{BASE_URL}/apps/deepl/assets/favicon.svg', | ||||||
|   authDocUrl: 'https://automatisch.io/docs/apps/deepl/connection', |   authDocUrl: '{DOCS_URL}/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: 'https://automatisch.io/docs/apps/delay/connection', |   authDocUrl: '{DOCS_URL}/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: 'https://automatisch.io/docs/apps/discord/connection', |   authDocUrl: '{DOCS_URL}/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: 'https://automatisch.io/docs/apps/dropbox/connection', |   authDocUrl: '{DOCS_URL}/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: 'https://automatisch.io/docs/apps/filter/connection', |   authDocUrl: '{DOCS_URL}/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: 'https://automatisch.io/docs/apps/flickr/connection', |   authDocUrl: '{DOCS_URL}/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: 'https://automatisch.io/docs/apps/flowers-software/connection', |   authDocUrl: '{DOCS_URL}/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', | ||||||
|   | |||||||
| @@ -1,5 +1,6 @@ | |||||||
| import defineAction from '../../../../helpers/define-action.js'; | import defineAction from '../../../../helpers/define-action.js'; | ||||||
|  |  | ||||||
|  | import base64ToString from './transformers/base64-to-string.js'; | ||||||
| import capitalize from './transformers/capitalize.js'; | import capitalize from './transformers/capitalize.js'; | ||||||
| import extractEmailAddress from './transformers/extract-email-address.js'; | import extractEmailAddress from './transformers/extract-email-address.js'; | ||||||
| import extractNumber from './transformers/extract-number.js'; | import extractNumber from './transformers/extract-number.js'; | ||||||
| @@ -7,11 +8,14 @@ import htmlToMarkdown from './transformers/html-to-markdown.js'; | |||||||
| import lowercase from './transformers/lowercase.js'; | import lowercase from './transformers/lowercase.js'; | ||||||
| import markdownToHtml from './transformers/markdown-to-html.js'; | import markdownToHtml from './transformers/markdown-to-html.js'; | ||||||
| import pluralize from './transformers/pluralize.js'; | import pluralize from './transformers/pluralize.js'; | ||||||
|  | import replaceWithRegEx from './transformers/replace-with-regex.js'; | ||||||
| import replace from './transformers/replace.js'; | import replace from './transformers/replace.js'; | ||||||
|  | import stringToBase64 from './transformers/string-to-base64.js'; | ||||||
| import trimWhitespace from './transformers/trim-whitespace.js'; | import trimWhitespace from './transformers/trim-whitespace.js'; | ||||||
| import useDefaultValue from './transformers/use-default-value.js'; | import useDefaultValue from './transformers/use-default-value.js'; | ||||||
|  |  | ||||||
| const transformers = { | const transformers = { | ||||||
|  |   base64ToString, | ||||||
|   capitalize, |   capitalize, | ||||||
|   extractEmailAddress, |   extractEmailAddress, | ||||||
|   extractNumber, |   extractNumber, | ||||||
| @@ -19,7 +23,9 @@ const transformers = { | |||||||
|   lowercase, |   lowercase, | ||||||
|   markdownToHtml, |   markdownToHtml, | ||||||
|   pluralize, |   pluralize, | ||||||
|  |   replaceWithRegEx, | ||||||
|   replace, |   replace, | ||||||
|  |   stringToBase64, | ||||||
|   trimWhitespace, |   trimWhitespace, | ||||||
|   useDefaultValue, |   useDefaultValue, | ||||||
| }; | }; | ||||||
| @@ -37,6 +43,7 @@ export default defineAction({ | |||||||
|       required: true, |       required: true, | ||||||
|       variables: true, |       variables: true, | ||||||
|       options: [ |       options: [ | ||||||
|  |         { label: 'Base64 to String', value: 'base64ToString' }, | ||||||
|         { label: 'Capitalize', value: 'capitalize' }, |         { label: 'Capitalize', value: 'capitalize' }, | ||||||
|         { label: 'Convert HTML to Markdown', value: 'htmlToMarkdown' }, |         { label: 'Convert HTML to Markdown', value: 'htmlToMarkdown' }, | ||||||
|         { label: 'Convert Markdown to HTML', value: 'markdownToHtml' }, |         { label: 'Convert Markdown to HTML', value: 'markdownToHtml' }, | ||||||
| @@ -44,7 +51,9 @@ export default defineAction({ | |||||||
|         { label: 'Extract Number', value: 'extractNumber' }, |         { label: 'Extract Number', value: 'extractNumber' }, | ||||||
|         { label: 'Lowercase', value: 'lowercase' }, |         { label: 'Lowercase', value: 'lowercase' }, | ||||||
|         { label: 'Pluralize', value: 'pluralize' }, |         { label: 'Pluralize', value: 'pluralize' }, | ||||||
|  |         { label: 'Replace with RegEx', value: 'replaceWithRegEx' }, | ||||||
|         { label: 'Replace', value: 'replace' }, |         { label: 'Replace', value: 'replace' }, | ||||||
|  |         { label: 'String to Base64', value: 'stringToBase64' }, | ||||||
|         { label: 'Trim Whitespace', value: 'trimWhitespace' }, |         { label: 'Trim Whitespace', value: 'trimWhitespace' }, | ||||||
|         { label: 'Use Default Value', value: 'useDefaultValue' }, |         { label: 'Use Default Value', value: 'useDefaultValue' }, | ||||||
|       ], |       ], | ||||||
|   | |||||||
| @@ -0,0 +1,8 @@ | |||||||
|  | const base64ToString = ($) => { | ||||||
|  |   const input = $.step.parameters.input; | ||||||
|  |   const decodedString = Buffer.from(input, 'base64').toString('utf8'); | ||||||
|  |  | ||||||
|  |   return decodedString; | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | export default base64ToString; | ||||||
| @@ -0,0 +1,10 @@ | |||||||
|  | const replaceWithRegEx = ($) => { | ||||||
|  |   const input = $.step.parameters.input; | ||||||
|  |  | ||||||
|  |   const find = new RegExp($.step.parameters.find); | ||||||
|  |   const replace = $.step.parameters.replace; | ||||||
|  |  | ||||||
|  |   return input.replace(find, replace); | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | export default replaceWithRegEx; | ||||||
| @@ -0,0 +1,8 @@ | |||||||
|  | const stringtoBase64 = ($) => { | ||||||
|  |   const input = $.step.parameters.input; | ||||||
|  |   const base64String = Buffer.from(input).toString('base64'); | ||||||
|  |  | ||||||
|  |   return base64String; | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | export default stringtoBase64; | ||||||
| @@ -1,3 +1,4 @@ | |||||||
|  | import base64ToString from './text/base64-to-string.js'; | ||||||
| import capitalize from './text/capitalize.js'; | import capitalize from './text/capitalize.js'; | ||||||
| import extractEmailAddress from './text/extract-email-address.js'; | import extractEmailAddress from './text/extract-email-address.js'; | ||||||
| import extractNumber from './text/extract-number.js'; | import extractNumber from './text/extract-number.js'; | ||||||
| @@ -5,7 +6,9 @@ import htmlToMarkdown from './text/html-to-markdown.js'; | |||||||
| import lowercase from './text/lowercase.js'; | import lowercase from './text/lowercase.js'; | ||||||
| import markdownToHtml from './text/markdown-to-html.js'; | import markdownToHtml from './text/markdown-to-html.js'; | ||||||
| import pluralize from './text/pluralize.js'; | import pluralize from './text/pluralize.js'; | ||||||
|  | import replaceWithRegEx from './text/replace-with-regex.js'; | ||||||
| import replace from './text/replace.js'; | import replace from './text/replace.js'; | ||||||
|  | import stringToBase64 from './text/string-to-base64.js'; | ||||||
| import trimWhitespace from './text/trim-whitespace.js'; | import trimWhitespace from './text/trim-whitespace.js'; | ||||||
| import useDefaultValue from './text/use-default-value.js'; | import useDefaultValue from './text/use-default-value.js'; | ||||||
| import performMathOperation from './numbers/perform-math-operation.js'; | import performMathOperation from './numbers/perform-math-operation.js'; | ||||||
| @@ -15,6 +18,7 @@ import formatPhoneNumber from './numbers/format-phone-number.js'; | |||||||
| import formatDateTime from './date-time/format-date-time.js'; | import formatDateTime from './date-time/format-date-time.js'; | ||||||
|  |  | ||||||
| const options = { | const options = { | ||||||
|  |   base64ToString, | ||||||
|   capitalize, |   capitalize, | ||||||
|   extractEmailAddress, |   extractEmailAddress, | ||||||
|   extractNumber, |   extractNumber, | ||||||
| @@ -22,7 +26,9 @@ const options = { | |||||||
|   lowercase, |   lowercase, | ||||||
|   markdownToHtml, |   markdownToHtml, | ||||||
|   pluralize, |   pluralize, | ||||||
|  |   replaceWithRegEx, | ||||||
|   replace, |   replace, | ||||||
|  |   stringToBase64, | ||||||
|   trimWhitespace, |   trimWhitespace, | ||||||
|   useDefaultValue, |   useDefaultValue, | ||||||
|   performMathOperation, |   performMathOperation, | ||||||
|   | |||||||
| @@ -0,0 +1,12 @@ | |||||||
|  | const base64ToString = [ | ||||||
|  |   { | ||||||
|  |     label: 'Input', | ||||||
|  |     key: 'input', | ||||||
|  |     type: 'string', | ||||||
|  |     required: true, | ||||||
|  |     description: 'Text that will be converted from Base64 to string.', | ||||||
|  |     variables: true, | ||||||
|  |   }, | ||||||
|  | ]; | ||||||
|  |  | ||||||
|  | export default base64ToString; | ||||||
| @@ -0,0 +1,29 @@ | |||||||
|  | const replaceWithRegEx = [ | ||||||
|  |   { | ||||||
|  |     label: 'Input', | ||||||
|  |     key: 'input', | ||||||
|  |     type: 'string', | ||||||
|  |     required: true, | ||||||
|  |     description: | ||||||
|  |       'Text that you want to search for and replace values with regex.', | ||||||
|  |     variables: true, | ||||||
|  |   }, | ||||||
|  |   { | ||||||
|  |     label: 'Find', | ||||||
|  |     key: 'find', | ||||||
|  |     type: 'string', | ||||||
|  |     required: true, | ||||||
|  |     description: 'RegEx that will be searched for.', | ||||||
|  |     variables: true, | ||||||
|  |   }, | ||||||
|  |   { | ||||||
|  |     label: 'Replace', | ||||||
|  |     key: 'replace', | ||||||
|  |     type: 'string', | ||||||
|  |     required: false, | ||||||
|  |     description: 'Text that will replace the found regex.', | ||||||
|  |     variables: true, | ||||||
|  |   }, | ||||||
|  | ]; | ||||||
|  |  | ||||||
|  | export default replaceWithRegEx; | ||||||
| @@ -0,0 +1,12 @@ | |||||||
|  | const stringToBase64 = [ | ||||||
|  |   { | ||||||
|  |     label: 'Input', | ||||||
|  |     key: 'input', | ||||||
|  |     type: 'string', | ||||||
|  |     required: true, | ||||||
|  |     description: 'Text that will be converted to Base64.', | ||||||
|  |     variables: true, | ||||||
|  |   }, | ||||||
|  | ]; | ||||||
|  |  | ||||||
|  | export default stringToBase64; | ||||||
| @@ -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: 'https://automatisch.io/docs/apps/formatter/connection', |   authDocUrl: '{DOCS_URL}/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: 'https://automatisch.io/docs/apps/ghost/connection', |   authDocUrl: '{DOCS_URL}/apps/ghost/connection', | ||||||
|   primaryColor: '15171A', |   primaryColor: '15171A', | ||||||
|   supportsConnections: true, |   supportsConnections: true, | ||||||
|   beforeRequest: [setBaseUrl, addAuthHeader], |   beforeRequest: [setBaseUrl, addAuthHeader], | ||||||
|   | |||||||
| @@ -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: 'https://automatisch.io/docs/apps/github/connection', |   authDocUrl: '{DOCS_URL}/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: 'https://automatisch.io/docs/apps/gitlab/connection', |   authDocUrl: '{DOCS_URL}/apps/gitlab/connection', | ||||||
|   primaryColor: 'FC6D26', |   primaryColor: 'FC6D26', | ||||||
|   supportsConnections: true, |   supportsConnections: true, | ||||||
|   beforeRequest: [setBaseUrl, addAuthHeader], |   beforeRequest: [setBaseUrl, addAuthHeader], | ||||||
|   | |||||||
| @@ -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: 'https://automatisch.io/docs/apps/google-calendar/connection', |   authDocUrl: '{DOCS_URL}/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: 'https://automatisch.io/docs/apps/google-drive/connection', |   authDocUrl: '{DOCS_URL}/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: 'https://automatisch.io/docs/apps/google-forms/connection', |   authDocUrl: '{DOCS_URL}/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: 'https://automatisch.io/docs/apps/google-sheets/connection', |   authDocUrl: '{DOCS_URL}/apps/google-sheets/connection', | ||||||
|   primaryColor: '0F9D58', |   primaryColor: '0F9D58', | ||||||
|   supportsConnections: true, |   supportsConnections: true, | ||||||
|   beforeRequest: [addAuthHeader], |   beforeRequest: [addAuthHeader], | ||||||
|   | |||||||
| @@ -1,4 +1,3 @@ | |||||||
| import FormData from 'form-data'; |  | ||||||
| import defineAction from '../../../../helpers/define-action.js'; | import defineAction from '../../../../helpers/define-action.js'; | ||||||
|  |  | ||||||
| export default defineAction({ | export default defineAction({ | ||||||
| @@ -6,45 +5,51 @@ export default defineAction({ | |||||||
|   key: 'newChat', |   key: 'newChat', | ||||||
|   description: 'Create a new chat session for Helix AI.', |   description: 'Create a new chat session for Helix AI.', | ||||||
|   arguments: [ |   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', |       label: 'Input', | ||||||
|       key: 'input', |       key: 'input', | ||||||
|       type: 'string', |       type: 'string', | ||||||
|       required: true, |       required: true, | ||||||
|       description: 'Prompt to start the chat with.', |       description: 'User input to start the chat with.', | ||||||
|       variables: true, |       variables: true, | ||||||
|     }, |     }, | ||||||
|   ], |   ], | ||||||
|  |  | ||||||
|   async run($) { |   async run($) { | ||||||
|     const formData = new FormData(); |     const response = await $.http.post('/api/v1/sessions/chat', { | ||||||
|     formData.append('input', $.step.parameters.input); |       session_id: $.step.parameters.sessionId, | ||||||
|     formData.append('mode', 'inference'); |       system: $.step.parameters.systemPrompt, | ||||||
|     formData.append('type', 'text'); |       messages: [ | ||||||
|  |         { | ||||||
|     const sessionResponse = await $.http.post('/api/v1/sessions', formData, { |           role: 'user', | ||||||
|       headers: { |           content: { | ||||||
|         ...formData.getHeaders(), |             content_type: 'text', | ||||||
|       }, |             parts: [$.step.parameters.input], | ||||||
|  |           }, | ||||||
|  |         }, | ||||||
|  |       ], | ||||||
|     }); |     }); | ||||||
|  |  | ||||||
|     const sessionId = sessionResponse.data.id; |     $.setActionItem({ | ||||||
|  |       raw: response.data, | ||||||
|     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', |   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: 'https://automatisch.io/docs/apps/helix/connection', |   authDocUrl: '{DOCS_URL}/apps/helix/connection', | ||||||
|   primaryColor: '000000', |   primaryColor: '000000', | ||||||
|   supportsConnections: true, |   supportsConnections: true, | ||||||
|   beforeRequest: [setBaseUrl, addAuthHeader], |   beforeRequest: [setBaseUrl, addAuthHeader], | ||||||
|   | |||||||
| @@ -90,7 +90,7 @@ export default defineAction({ | |||||||
|  |  | ||||||
|   async run($) { |   async run($) { | ||||||
|     const method = $.step.parameters.method; |     const method = $.step.parameters.method; | ||||||
|     const data = $.step.parameters.data; |     const data = $.step.parameters.data || null; | ||||||
|     const url = $.step.parameters.url; |     const url = $.step.parameters.url; | ||||||
|     const headers = $.step.parameters.headers; |     const headers = $.step.parameters.headers; | ||||||
|  |  | ||||||
| @@ -108,14 +108,17 @@ export default defineAction({ | |||||||
|       return result; |       return result; | ||||||
|     }, {}); |     }, {}); | ||||||
|  |  | ||||||
|     let contentType = headersObject['content-type']; |     let expectedResponseContentType = headersObject.accept; | ||||||
|  |  | ||||||
|     // in case HEAD request is not supported by the URL |     // in case HEAD request is not supported by the URL | ||||||
|     try { |     try { | ||||||
|       const metadataResponse = await $.http.head(url, { |       const metadataResponse = await $.http.head(url, { | ||||||
|         headers: headersObject, |         headers: headersObject, | ||||||
|       }); |       }); | ||||||
|       contentType = metadataResponse.headers['content-type']; |  | ||||||
|  |       if (!expectedResponseContentType) { | ||||||
|  |         expectedResponseContentType = metadataResponse.headers['content-type']; | ||||||
|  |       } | ||||||
|  |  | ||||||
|       throwIfFileSizeExceedsLimit(metadataResponse.headers['content-length']); |       throwIfFileSizeExceedsLimit(metadataResponse.headers['content-length']); | ||||||
|       // eslint-disable-next-line no-empty |       // eslint-disable-next-line no-empty | ||||||
| @@ -128,7 +131,7 @@ export default defineAction({ | |||||||
|       headers: headersObject, |       headers: headersObject, | ||||||
|     }; |     }; | ||||||
|  |  | ||||||
|     if (!isPossiblyTextBased(contentType)) { |     if (!isPossiblyTextBased(expectedResponseContentType)) { | ||||||
|       requestData.responseType = 'arraybuffer'; |       requestData.responseType = 'arraybuffer'; | ||||||
|     } |     } | ||||||
|  |  | ||||||
| @@ -138,7 +141,7 @@ export default defineAction({ | |||||||
|  |  | ||||||
|     let responseData = response.data; |     let responseData = response.data; | ||||||
|  |  | ||||||
|     if (!isPossiblyTextBased(contentType)) { |     if (!isPossiblyTextBased(expectedResponseContentType)) { | ||||||
|       responseData = Buffer.from(responseData).toString('base64'); |       responseData = Buffer.from(responseData).toString('base64'); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -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: 'https://automatisch.io/docs/apps/http-request/connection', |   authDocUrl: '{DOCS_URL}/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: 'https://automatisch.io/docs/apps/hubspot/connection', |   authDocUrl: '{DOCS_URL}/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: 'https://automatisch.io/docs/apps/invoice-ninja/connection', |   authDocUrl: '{DOCS_URL}/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: 'https://automatisch.io/docs/apps/mattermost/connection', |   authDocUrl: '{DOCS_URL}/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: 'https://automatisch.io/docs/apps/miro/connection', |   authDocUrl: '{DOCS_URL}/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: 'https://automatisch.io/docs/apps/notion/connection', |   authDocUrl: '{DOCS_URL}/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: 'https://automatisch.io/docs/apps/ntfy/connection', |   authDocUrl: '{DOCS_URL}/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: 'https://automatisch.io/docs/apps/odoo/connection', |   authDocUrl: '{DOCS_URL}/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: 'https://automatisch.io/docs/apps/openai/connection', |   authDocUrl: '{DOCS_URL}/apps/openai/connection', | ||||||
|   primaryColor: '000000', |   primaryColor: '000000', | ||||||
|   supportsConnections: true, |   supportsConnections: true, | ||||||
|   beforeRequest: [addAuthHeader], |   beforeRequest: [addAuthHeader], | ||||||
|   | |||||||
| @@ -64,32 +64,17 @@ export default defineAction({ | |||||||
|       value: '1', |       value: '1', | ||||||
|       description: |       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.', |         '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.', | ||||||
|       options: [ |       variables: true, | ||||||
|         { |       source: { | ||||||
|           label: 'Qualified (Pipeline)', |         type: 'query', | ||||||
|           value: 1, |         name: 'getDynamicData', | ||||||
|         }, |         arguments: [ | ||||||
|         { |           { | ||||||
|           label: 'Contact Made (Pipeline)', |             name: 'key', | ||||||
|           value: 2, |             value: 'listStages', | ||||||
|         }, |           }, | ||||||
|         { |         ], | ||||||
|           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', |       label: 'Owner', | ||||||
|   | |||||||
| @@ -1,23 +1,25 @@ | |||||||
| import listActivityTypes from './list-activity-types/index.js'; | import listActivityTypes from './list-activity-types/index.js'; | ||||||
| import listCurrencies from './list-currencies/index.js'; | import listCurrencies from './list-currencies/index.js'; | ||||||
| import listDeals from './list-deals/index.js'; | import listDeals from './list-deals/index.js'; | ||||||
| import listLeads from './list-leads/index.js'; |  | ||||||
| import listLeadLabels from './list-lead-labels/index.js'; | import listLeadLabels from './list-lead-labels/index.js'; | ||||||
| import listOrganizations from './list-organizations/index.js'; | import listLeads from './list-leads/index.js'; | ||||||
| import listOrganizationLabelField from './list-organization-label-field/index.js'; | import listOrganizationLabelField from './list-organization-label-field/index.js'; | ||||||
|  | import listOrganizations from './list-organizations/index.js'; | ||||||
| import listPersonLabelField from './list-person-label-field/index.js'; | import listPersonLabelField from './list-person-label-field/index.js'; | ||||||
| import listPersons from './list-persons/index.js'; | import listPersons from './list-persons/index.js'; | ||||||
|  | import listStages from './list-stages/index.js'; | ||||||
| import listUsers from './list-users/index.js'; | import listUsers from './list-users/index.js'; | ||||||
|  |  | ||||||
| export default [ | export default [ | ||||||
|   listActivityTypes, |   listActivityTypes, | ||||||
|   listCurrencies, |   listCurrencies, | ||||||
|   listDeals, |   listDeals, | ||||||
|   listLeads, |  | ||||||
|   listLeadLabels, |   listLeadLabels, | ||||||
|   listOrganizations, |   listLeads, | ||||||
|   listOrganizationLabelField, |   listOrganizationLabelField, | ||||||
|  |   listOrganizations, | ||||||
|   listPersonLabelField, |   listPersonLabelField, | ||||||
|   listPersons, |   listPersons, | ||||||
|  |   listStages, | ||||||
|   listUsers, |   listUsers, | ||||||
| ]; | ]; | ||||||
|   | |||||||
| @@ -0,0 +1,23 @@ | |||||||
|  | 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: '', |   baseUrl: '', | ||||||
|   apiBaseUrl: '', |   apiBaseUrl: '', | ||||||
|   iconUrl: '{BASE_URL}/apps/pipedrive/assets/favicon.svg', |   iconUrl: '{BASE_URL}/apps/pipedrive/assets/favicon.svg', | ||||||
|   authDocUrl: 'https://automatisch.io/docs/apps/pipedrive/connection', |   authDocUrl: '{DOCS_URL}/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: 'https://automatisch.io/docs/apps/placetel/connection', |   authDocUrl: '{DOCS_URL}/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: 'https://automatisch.io/docs/apps/postgresql/connection', |   authDocUrl: '{DOCS_URL}/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: 'https://automatisch.io/docs/apps/pushover/connection', |   authDocUrl: '{DOCS_URL}/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: 'https://automatisch.io/docs/apps/reddit/connection', |   authDocUrl: '{DOCS_URL}/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: 'https://automatisch.io/docs/apps/removebg/connection', |   authDocUrl: '{DOCS_URL}/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: 'https://automatisch.io/docs/apps/rss/connection', |   authDocUrl: '{DOCS_URL}/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: 'https://automatisch.io/docs/connections/salesforce', |   authDocUrl: '{DOCS_URL}/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: 'https://automatisch.io/docs/apps/scheduler/connection', |   authDocUrl: '{DOCS_URL}/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: 'https://automatisch.io/docs/apps/self-hosted-llm/connection', |   authDocUrl: '{DOCS_URL}/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: 'https://automatisch.io/docs/apps/signalwire/connection', |   authDocUrl: '{DOCS_URL}/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: 'https://automatisch.io/docs/apps/slack/connection', |   authDocUrl: '{DOCS_URL}/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: 'https://automatisch.io/docs/apps/smtp/connection', |   authDocUrl: '{DOCS_URL}/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: 'https://automatisch.io/docs/apps/spotify/connection', |   authDocUrl: '{DOCS_URL}/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: 'https://automatisch.io/docs/connections/strava', |   authDocUrl: '{DOCS_URL}/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: 'https://automatisch.io/docs/apps/stripe/connection', |   authDocUrl: '{DOCS_URL}/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: 'https://automatisch.io/docs/apps/telegram-bot/connection', |   authDocUrl: '{DOCS_URL}/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: 'https://automatisch.io/docs/apps/todoist/connection', |   authDocUrl: '{DOCS_URL}/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: 'https://automatisch.io/docs/apps/trello/connection', |   authDocUrl: '{DOCS_URL}/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: 'https://automatisch.io/docs/apps/twilio/connection', |   authDocUrl: '{DOCS_URL}/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: 'https://automatisch.io/docs/apps/twitter/connection', |   authDocUrl: '{DOCS_URL}/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: 'https://automatisch.io/docs/apps/typeform/connection', |   authDocUrl: '{DOCS_URL}/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', | ||||||
|   | |||||||
							
								
								
									
										3
									
								
								packages/backend/src/apps/webhook/actions/index.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								packages/backend/src/apps/webhook/actions/index.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,3 @@ | |||||||
|  | import respondWith from './respond-with/index.js'; | ||||||
|  |  | ||||||
|  | export default [respondWith]; | ||||||
| @@ -0,0 +1,69 @@ | |||||||
|  | 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,14 +1,16 @@ | |||||||
| import defineApp from '../../helpers/define-app.js'; | import defineApp from '../../helpers/define-app.js'; | ||||||
|  | import actions from './actions/index.js'; | ||||||
| import triggers from './triggers/index.js'; | import triggers from './triggers/index.js'; | ||||||
|  |  | ||||||
| export default defineApp({ | 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: 'https://automatisch.io/docs/apps/webhook/connection', |   authDocUrl: '{DOCS_URL}/apps/webhook/connection', | ||||||
|   supportsConnections: false, |   supportsConnections: false, | ||||||
|   baseUrl: '', |   baseUrl: '', | ||||||
|   apiBaseUrl: '', |   apiBaseUrl: '', | ||||||
|   primaryColor: '0059F7', |   primaryColor: '0059F7', | ||||||
|  |   actions, | ||||||
|   triggers, |   triggers, | ||||||
| }); | }); | ||||||
|   | |||||||
| @@ -7,7 +7,20 @@ export default defineTrigger({ | |||||||
|   key: 'catchRawWebhook', |   key: 'catchRawWebhook', | ||||||
|   type: 'webhook', |   type: 'webhook', | ||||||
|   showWebhookUrl: true, |   showWebhookUrl: true, | ||||||
|   description: 'Triggers when the webhook receives a request.', |   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 }, | ||||||
|  |       ], | ||||||
|  |     }, | ||||||
|  |   ], | ||||||
|  |  | ||||||
|   async run($) { |   async run($) { | ||||||
|     const dataItem = { |     const dataItem = { | ||||||
|   | |||||||
| @@ -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: 'https://automatisch.io/docs/apps/wordpress/connection', |   authDocUrl: '{DOCS_URL}/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: 'https://automatisch.io/docs/apps/xero/connection', |   authDocUrl: '{DOCS_URL}/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: 'https://automatisch.io/docs/apps/youtube/connection', |   authDocUrl: '{DOCS_URL}/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: 'https://automatisch.io/docs/apps/zendesk/connection', |   authDocUrl: '{DOCS_URL}/apps/zendesk/connection', | ||||||
|   primaryColor: '17494d', |   primaryColor: '17494d', | ||||||
|   supportsConnections: true, |   supportsConnections: true, | ||||||
|   beforeRequest: [addAuthHeader], |   beforeRequest: [addAuthHeader], | ||||||
|   | |||||||
| @@ -18,7 +18,9 @@ const port = process.env.PORT || '3000'; | |||||||
| const serveWebAppSeparately = | const serveWebAppSeparately = | ||||||
|   process.env.SERVE_WEB_APP_SEPARATELY === 'true' ? true : false; |   process.env.SERVE_WEB_APP_SEPARATELY === 'true' ? true : false; | ||||||
|  |  | ||||||
| let apiUrl = new URL(`${protocol}://${host}:${port}`).toString(); | let apiUrl = new URL( | ||||||
|  |   process.env.API_URL || `${protocol}://${host}:${port}` | ||||||
|  | ).toString(); | ||||||
| apiUrl = apiUrl.substring(0, apiUrl.length - 1); | apiUrl = apiUrl.substring(0, apiUrl.length - 1); | ||||||
|  |  | ||||||
| // use apiUrl by default, which has less priority over the following cases | // use apiUrl by default, which has less priority over the following cases | ||||||
| @@ -36,6 +38,9 @@ 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 = { | ||||||
| @@ -71,6 +76,7 @@ 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, | ||||||
| @@ -88,6 +94,10 @@ const appConfig = { | |||||||
|   licenseKey: process.env.LICENSE_KEY, |   licenseKey: process.env.LICENSE_KEY, | ||||||
|   sentryDsn: process.env.SENTRY_DSN, |   sentryDsn: process.env.SENTRY_DSN, | ||||||
|   CI: process.env.CI === 'true', |   CI: process.env.CI === 'true', | ||||||
|  |   disableNotificationsPage: process.env.DISABLE_NOTIFICATIONS_PAGE === 'true', | ||||||
|  |   disableFavicon: process.env.DISABLE_FAVICON === 'true', | ||||||
|  |   additionalDrawerLink: process.env.ADDITIONAL_DRAWER_LINK, | ||||||
|  |   additionalDrawerLinkText: process.env.ADDITIONAL_DRAWER_LINK_TEXT, | ||||||
| }; | }; | ||||||
|  |  | ||||||
| if (!appConfig.encryptionKey) { | if (!appConfig.encryptionKey) { | ||||||
|   | |||||||
| @@ -2,7 +2,7 @@ import appConfig from './app.js'; | |||||||
|  |  | ||||||
| const corsOptions = { | const corsOptions = { | ||||||
|   origin: appConfig.webAppUrl, |   origin: appConfig.webAppUrl, | ||||||
|   methods: 'POST', |   methods: 'GET,HEAD,POST,DELETE', | ||||||
|   credentials: true, |   credentials: true, | ||||||
|   optionsSuccessStatus: 200, |   optionsSuccessStatus: 200, | ||||||
| }; | }; | ||||||
|   | |||||||
| @@ -0,0 +1,13 @@ | |||||||
|  | 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.'] }]); | ||||||
|  | }; | ||||||
| @@ -0,0 +1,39 @@ | |||||||
|  | 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.', | ||||||
|  |     ]); | ||||||
|  |   }); | ||||||
|  | }); | ||||||
| @@ -0,0 +1,15 @@ | |||||||
|  | export default async (request, response) => { | ||||||
|  |   const token = request.params.token; | ||||||
|  |  | ||||||
|  |   const accessToken = await request.currentUser | ||||||
|  |     .$relatedQuery('accessTokens') | ||||||
|  |     .findOne({ | ||||||
|  |       token, | ||||||
|  |       revoked_at: null, | ||||||
|  |     }) | ||||||
|  |     .throwIfNotFound(); | ||||||
|  |  | ||||||
|  |   await accessToken.revoke(); | ||||||
|  |  | ||||||
|  |   response.status(204).send(); | ||||||
|  | }; | ||||||
| @@ -0,0 +1,54 @@ | |||||||
|  | import { expect, describe, it, beforeEach } from 'vitest'; | ||||||
|  | import request from 'supertest'; | ||||||
|  | import app from '../../../../app.js'; | ||||||
|  | import createAuthTokenByUserId from '../../../../helpers/create-auth-token-by-user-id'; | ||||||
|  | import { createUser } from '../../../../../test/factories/user.js'; | ||||||
|  | import AccessToken from '../../../../models/access-token.js'; | ||||||
|  |  | ||||||
|  | describe('DELETE /api/v1/access-tokens/:token', () => { | ||||||
|  |   let token; | ||||||
|  |  | ||||||
|  |   beforeEach(async () => { | ||||||
|  |     const currentUser = await createUser({ | ||||||
|  |       email: 'user@automatisch.io', | ||||||
|  |       password: 'password', | ||||||
|  |     }); | ||||||
|  |     token = await createAuthTokenByUserId(currentUser.id); | ||||||
|  |   }); | ||||||
|  |  | ||||||
|  |   it('should respond with HTTP 204 with correct token', async () => { | ||||||
|  |     await request(app) | ||||||
|  |       .delete(`/api/v1/access-tokens/${token}`) | ||||||
|  |       .set('Authorization', token) | ||||||
|  |       .expect(204); | ||||||
|  |  | ||||||
|  |     const revokedToken = await AccessToken.query().findOne({ token }); | ||||||
|  |  | ||||||
|  |     expect(revokedToken).toBeDefined(); | ||||||
|  |     expect(revokedToken.revokedAt).not.toBeNull(); | ||||||
|  |   }); | ||||||
|  |  | ||||||
|  |   it('should respond with HTTP 401 with incorrect credentials', async () => { | ||||||
|  |     await request(app) | ||||||
|  |       .delete(`/api/v1/access-tokens/${token}`) | ||||||
|  |       .set('Authorization', 'wrong-token') | ||||||
|  |       .expect(401); | ||||||
|  |  | ||||||
|  |     const unrevokedToken = await AccessToken.query().findOne({ token }); | ||||||
|  |  | ||||||
|  |     expect(unrevokedToken).toBeDefined(); | ||||||
|  |     expect(unrevokedToken.revokedAt).toBeNull(); | ||||||
|  |   }); | ||||||
|  |  | ||||||
|  |   it('should respond with HTTP 404 with correct credentials, but non-valid token', async () => { | ||||||
|  |     await request(app) | ||||||
|  |       .delete('/api/v1/access-tokens/wrong-token') | ||||||
|  |       .set('Authorization', token) | ||||||
|  |       .expect(404); | ||||||
|  |  | ||||||
|  |     const unrevokedToken = await AccessToken.query().findOne({ token }); | ||||||
|  |  | ||||||
|  |     expect(unrevokedToken).toBeDefined(); | ||||||
|  |     expect(unrevokedToken.revokedAt).toBeNull(); | ||||||
|  |   }); | ||||||
|  | }); | ||||||
| @@ -0,0 +1,11 @@ | |||||||
|  | import { renderObject } from '../../../../../helpers/renderer.js'; | ||||||
|  | import AppAuthClient from '../../../../../models/app-auth-client.js'; | ||||||
|  |  | ||||||
|  | export default async (request, response) => { | ||||||
|  |   const appAuthClient = await AppAuthClient.query() | ||||||
|  |     .findById(request.params.appAuthClientId) | ||||||
|  |     .where({ app_key: request.params.appKey }) | ||||||
|  |     .throwIfNotFound(); | ||||||
|  |  | ||||||
|  |   renderObject(response, appAuthClient); | ||||||
|  | }; | ||||||
| @@ -0,0 +1,55 @@ | |||||||
|  | import { vi, describe, it, expect, beforeEach } from 'vitest'; | ||||||
|  | import request from 'supertest'; | ||||||
|  | import Crypto from 'crypto'; | ||||||
|  | import app from '../../../../../app.js'; | ||||||
|  | import createAuthTokenByUserId from '../../../../../helpers/create-auth-token-by-user-id.js'; | ||||||
|  | import { createUser } from '../../../../../../test/factories/user.js'; | ||||||
|  | import { createRole } from '../../../../../../test/factories/role.js'; | ||||||
|  | import getAppAuthClientMock from '../../../../../../test/mocks/rest/api/v1/admin/apps/get-auth-client.js'; | ||||||
|  | import { createAppAuthClient } from '../../../../../../test/factories/app-auth-client.js'; | ||||||
|  | import * as license from '../../../../../helpers/license.ee.js'; | ||||||
|  |  | ||||||
|  | describe('GET /api/v1/admin/apps/:appKey/auth-clients/:appAuthClientId', () => { | ||||||
|  |   let currentUser, adminRole, currentAppAuthClient, token; | ||||||
|  |  | ||||||
|  |   beforeEach(async () => { | ||||||
|  |     vi.spyOn(license, 'hasValidLicense').mockResolvedValue(true); | ||||||
|  |  | ||||||
|  |     adminRole = await createRole({ key: 'admin' }); | ||||||
|  |     currentUser = await createUser({ roleId: adminRole.id }); | ||||||
|  |  | ||||||
|  |     currentAppAuthClient = await createAppAuthClient({ | ||||||
|  |       appKey: 'deepl', | ||||||
|  |     }); | ||||||
|  |  | ||||||
|  |     token = await createAuthTokenByUserId(currentUser.id); | ||||||
|  |   }); | ||||||
|  |  | ||||||
|  |   it('should return specified app auth client', async () => { | ||||||
|  |     const response = await request(app) | ||||||
|  |       .get(`/api/v1/admin/apps/deepl/auth-clients/${currentAppAuthClient.id}`) | ||||||
|  |       .set('Authorization', token) | ||||||
|  |       .expect(200); | ||||||
|  |  | ||||||
|  |     const expectedPayload = getAppAuthClientMock(currentAppAuthClient); | ||||||
|  |     expect(response.body).toEqual(expectedPayload); | ||||||
|  |   }); | ||||||
|  |  | ||||||
|  |   it('should return not found response for not existing app auth client ID', async () => { | ||||||
|  |     const notExistingAppAuthClientUUID = Crypto.randomUUID(); | ||||||
|  |  | ||||||
|  |     await request(app) | ||||||
|  |       .get( | ||||||
|  |         `/api/v1/admin/apps/deepl/auth-clients/${notExistingAppAuthClientUUID}` | ||||||
|  |       ) | ||||||
|  |       .set('Authorization', token) | ||||||
|  |       .expect(404); | ||||||
|  |   }); | ||||||
|  |  | ||||||
|  |   it('should return bad request response for invalid UUID', async () => { | ||||||
|  |     await request(app) | ||||||
|  |       .get('/api/v1/admin/apps/deepl/auth-clients/invalidAppAuthClientUUID') | ||||||
|  |       .set('Authorization', token) | ||||||
|  |       .expect(400); | ||||||
|  |   }); | ||||||
|  | }); | ||||||
| @@ -0,0 +1,10 @@ | |||||||
|  | import { renderObject } from '../../../../../helpers/renderer.js'; | ||||||
|  | import AppAuthClient from '../../../../../models/app-auth-client.js'; | ||||||
|  |  | ||||||
|  | export default async (request, response) => { | ||||||
|  |   const appAuthClients = await AppAuthClient.query() | ||||||
|  |     .where({ app_key: request.params.appKey }) | ||||||
|  |     .orderBy('created_at', 'desc'); | ||||||
|  |  | ||||||
|  |   renderObject(response, appAuthClients); | ||||||
|  | }; | ||||||
| @@ -0,0 +1,44 @@ | |||||||
|  | import { vi, describe, it, expect, beforeEach } from 'vitest'; | ||||||
|  | import request from 'supertest'; | ||||||
|  | import app from '../../../../../app.js'; | ||||||
|  | import createAuthTokenByUserId from '../../../../../helpers/create-auth-token-by-user-id.js'; | ||||||
|  | import { createUser } from '../../../../../../test/factories/user.js'; | ||||||
|  | import { createRole } from '../../../../../../test/factories/role.js'; | ||||||
|  | import getAuthClientsMock from '../../../../../../test/mocks/rest/api/v1/admin/apps/get-auth-clients.js'; | ||||||
|  | import { createAppAuthClient } from '../../../../../../test/factories/app-auth-client.js'; | ||||||
|  | import * as license from '../../../../../helpers/license.ee.js'; | ||||||
|  |  | ||||||
|  | describe('GET /api/v1/admin/apps/:appKey/auth-clients', () => { | ||||||
|  |   let currentUser, adminRole, token; | ||||||
|  |  | ||||||
|  |   beforeEach(async () => { | ||||||
|  |     vi.spyOn(license, 'hasValidLicense').mockResolvedValue(true); | ||||||
|  |  | ||||||
|  |     adminRole = await createRole({ key: 'admin' }); | ||||||
|  |     currentUser = await createUser({ roleId: adminRole.id }); | ||||||
|  |  | ||||||
|  |     token = await createAuthTokenByUserId(currentUser.id); | ||||||
|  |   }); | ||||||
|  |  | ||||||
|  |   it('should return specified app auth client info', async () => { | ||||||
|  |     const appAuthClientOne = await createAppAuthClient({ | ||||||
|  |       appKey: 'deepl', | ||||||
|  |     }); | ||||||
|  |  | ||||||
|  |     const appAuthClientTwo = await createAppAuthClient({ | ||||||
|  |       appKey: 'deepl', | ||||||
|  |     }); | ||||||
|  |  | ||||||
|  |     const response = await request(app) | ||||||
|  |       .get('/api/v1/admin/apps/deepl/auth-clients') | ||||||
|  |       .set('Authorization', token) | ||||||
|  |       .expect(200); | ||||||
|  |  | ||||||
|  |     const expectedPayload = getAuthClientsMock([ | ||||||
|  |       appAuthClientTwo, | ||||||
|  |       appAuthClientOne, | ||||||
|  |     ]); | ||||||
|  |  | ||||||
|  |     expect(response.body).toEqual(expectedPayload); | ||||||
|  |   }); | ||||||
|  | }); | ||||||
| @@ -0,0 +1,6 @@ | |||||||
|  | import { renderObject } from '../../../../../helpers/renderer.js'; | ||||||
|  | import permissionCatalog from '../../../../../helpers/permission-catalog.ee.js'; | ||||||
|  |  | ||||||
|  | export default async (request, response) => { | ||||||
|  |   renderObject(response, permissionCatalog); | ||||||
|  | }; | ||||||
| @@ -0,0 +1,32 @@ | |||||||
|  | import { vi, describe, it, expect, beforeEach } from 'vitest'; | ||||||
|  | import request from 'supertest'; | ||||||
|  | import app from '../../../../../app.js'; | ||||||
|  | import createAuthTokenByUserId from '../../../../../helpers/create-auth-token-by-user-id.js'; | ||||||
|  | import { createRole } from '../../../../../../test/factories/role.js'; | ||||||
|  | import { createUser } from '../../../../../../test/factories/user.js'; | ||||||
|  | import getPermissionsCatalogMock from '../../../../../../test/mocks/rest/api/v1/admin/permissions/get-permissions-catalog.ee.js'; | ||||||
|  | import * as license from '../../../../../helpers/license.ee.js'; | ||||||
|  |  | ||||||
|  | describe('GET /api/v1/admin/permissions/catalog', () => { | ||||||
|  |   let role, currentUser, token; | ||||||
|  |  | ||||||
|  |   beforeEach(async () => { | ||||||
|  |     role = await createRole({ key: 'admin' }); | ||||||
|  |     currentUser = await createUser({ roleId: role.id }); | ||||||
|  |  | ||||||
|  |     token = await createAuthTokenByUserId(currentUser.id); | ||||||
|  |   }); | ||||||
|  |  | ||||||
|  |   it('should return roles', async () => { | ||||||
|  |     vi.spyOn(license, 'hasValidLicense').mockResolvedValue(true); | ||||||
|  |  | ||||||
|  |     const response = await request(app) | ||||||
|  |       .get('/api/v1/admin/permissions/catalog') | ||||||
|  |       .set('Authorization', token) | ||||||
|  |       .expect(200); | ||||||
|  |  | ||||||
|  |     const expectedPayload = await getPermissionsCatalogMock(); | ||||||
|  |  | ||||||
|  |     expect(response.body).toEqual(expectedPayload); | ||||||
|  |   }); | ||||||
|  | }); | ||||||
| @@ -0,0 +1,16 @@ | |||||||
|  | import { renderObject } from '../../../../../helpers/renderer.js'; | ||||||
|  | import Role from '../../../../../models/role.js'; | ||||||
|  |  | ||||||
|  | export default async (request, response) => { | ||||||
|  |   const role = await Role.query() | ||||||
|  |     .leftJoinRelated({ | ||||||
|  |       permissions: true, | ||||||
|  |     }) | ||||||
|  |     .withGraphFetched({ | ||||||
|  |       permissions: true, | ||||||
|  |     }) | ||||||
|  |     .findById(request.params.roleId) | ||||||
|  |     .throwIfNotFound(); | ||||||
|  |  | ||||||
|  |   renderObject(response, role); | ||||||
|  | }; | ||||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user