Compare commits

...

236 Commits

Author SHA1 Message Date
Rıdvan Akca
58c90da385 feat(changedetection): add create watch action 2024-05-13 16:31:18 +02:00
Rıdvan Akca
c095d3138b feat(changedetection): add changedetection integration 2024-05-13 16:28:05 +02:00
Ali BARIN
9548c93b4c Merge pull request #1867 from automatisch/custom-user-seed
add POST /api/v1/installation/users to seed user
2024-05-13 16:19:37 +02:00
Ali BARIN
4144944ab2 refactor(migrations): rename installation completed migration 2024-05-13 14:12:46 +00:00
Ali BARIN
46b85519c1 refactor(User/createAdmin): mark installation completed 2024-05-13 14:10:21 +00:00
Ali BARIN
5a83fc33ec refactor(User): rename createAdminUser with createAdmin 2024-05-13 14:09:09 +00:00
Ali BARIN
c80791267f refactor(installation): improve allow installation guard 2024-05-13 14:00:12 +00:00
Ali BARIN
b30f97db3e feat: add POST /api/v1/installation/users to seed user 2024-05-13 13:31:16 +00:00
Ali BARIN
717c81fa2b test(global-hooks): truncate config table 2024-05-13 13:31:16 +00:00
Ali BARIN
ae188bc563 feat: add migration to mark userful instances installation completed 2024-05-13 13:31:16 +00:00
Ali BARIN
fc4561221d feat: add DISABLE_SEED_USER to bypass yarn db:seed:user command 2024-05-13 13:31:16 +00:00
Ali BARIN
5aeb4f8809 Merge pull request #1883 from automatisch/checkisenterprise
feat: remove checkIsEnterprise middleware from admin users
2024-05-13 15:30:55 +02:00
Ali BARIN
c6c900bc39 test(get-users.ee): remove license mock 2024-05-13 13:20:48 +00:00
Rıdvan Akca
c18ab67a25 feat: remove checkIsEnterprise middleware from admin users 2024-05-13 15:02:10 +02:00
Ali BARIN
55ae1470d0 Merge pull request #1875 from automatisch/logout-saml 2024-05-13 13:51:49 +02:00
Ömer Faruk Aydın
a1136fdfb2 Merge pull request #1882 from automatisch/no-proxy
feat: add no_proxy support in http(s) agents
2024-05-13 13:43:39 +02:00
Ali BARIN
dfe56d3aa2 feat: add no_proxy support in http(s) agents 2024-05-13 09:15:37 +00:00
Ali BARIN
3da5e13ecd feat: support bi-directional backchannel SAML SLO 2024-05-10 08:58:32 +00:00
Ali BARIN
40d0fe0db6 chore: add saml_session_id property in access token 2024-05-10 08:54:02 +00:00
Ali BARIN
029fd2d0b0 chore(devcontainer): remove keycloak custom container name 2024-05-10 08:54:02 +00:00
Ali BARIN
12905ad733 Merge pull request #1873 from automatisch/fix-use-dynamic-data
fix(useDynamicData): send correct payload to API
2024-05-10 10:53:14 +02:00
Ali BARIN
d257f59a3e Merge pull request #1872 from automatisch/hide-empty-sso-providers
fix(SsoProviders): hide empty block
2024-05-10 10:53:00 +02:00
Ali BARIN
c9281b4605 fix(useDynamicData): send correct payload to API 2024-05-09 20:08:59 +00:00
Ali BARIN
e9d2ae5d67 fix(SsoProviders): hide empty block 2024-05-09 19:07:30 +00:00
Ali BARIN
0f8e05610b Merge pull request #1482 from automatisch/AUT-508
feat(disqus): add new flagged comments trigger
2024-05-08 15:51:54 +02:00
Ali BARIN
9ea2196e51 refactor(disqus/new-flagged-comments): make filter value variable 2024-05-08 13:48:01 +00:00
Ali BARIN
97327a9033 Merge pull request #1865 from automatisch/AUT-973
refactor(google-tasks/find-task): filter all tasks when finding a task
2024-05-08 15:11:55 +02:00
Ali BARIN
8bf11ba7d1 Merge pull request #1544 from automatisch/AUT-582
feat(ynab): add you need a budget app integration
2024-05-08 15:11:49 +02:00
Ali BARIN
523833b015 Merge pull request #1504 from automatisch/AUT-520
feat(vtiger-crm): add vtiger crm integration
2024-05-08 15:10:16 +02:00
Ali BARIN
e25a651d26 fix(ynab/low-account-balance): scope trigger by year and month 2024-05-08 13:06:40 +00:00
Ali BARIN
92a8c1483d fix(ynab/goal-completed): scope triger by year and month 2024-05-08 12:56:46 +00:00
Ali BARIN
8da3448e9c feat(ynab): utilize DOCS_URL variable 2024-05-08 12:55:37 +00:00
Ali BARIN
f2385d8916 fix(ynab/category-overspent): scope trigger by year and month 2024-05-08 12:54:55 +00:00
Ali BARIN
17a8daa526 Merge pull request #1546 from automatisch/AUT-583
feat(ynab): add low account balance trigger
2024-05-08 12:09:16 +02:00
Ali BARIN
51e254f127 Merge pull request #1547 from automatisch/AUT-584
feat(ynab): add category overspent trigger
2024-05-08 12:09:09 +02:00
Ali BARIN
feccf571cd Merge pull request #1548 from automatisch/AUT-585
feat(ynab): add goal completed trigger
2024-05-08 12:08:57 +02:00
Ali BARIN
9f8ce44c1b Merge pull request #1549 from automatisch/AUT-586
feat(ynab): add new transactions trigger
2024-05-08 12:04:16 +02:00
Ali BARIN
a7cfe7f23b Merge pull request #1866 from automatisch/fix-ynab
refactor(ynab): specify a budget when creating a connection
2024-05-08 12:00:46 +02:00
Rıdvan Akca
8eaf775ef2 refactor(ynab): specify a budget when creating a connection 2024-05-07 17:23:16 +02:00
Rıdvan Akca
7b4179a87f refactor(google-tasks/find-task): filter all tasks when finding a task 2024-05-07 16:51:23 +02:00
Ali BARIN
43281bcbfe Merge pull request #1863 from automatisch/vtiger-fix
refactor(vtiger-crm): update field names and keys
2024-05-07 16:15:00 +02:00
Rıdvan Akca
8a35d47caf refactor(vtiger-crm): update field names and keys 2024-05-07 15:42:35 +02:00
Ali BARIN
759e8b6c42 fix(vtiger-crm/triggers): correct pagination 2024-05-07 11:33:55 +00:00
Ali BARIN
a8b01244af fix(vtiger-crm/create-case): mark contactName required 2024-05-07 11:33:37 +00:00
Ali BARIN
6ffb16ac67 fix(vtiger-crm): use DOCS_URL variable in authDocUrl 2024-05-07 11:33:17 +00:00
Ali BARIN
5b66cc6c8b Merge pull request #1527 from automatisch/AUT-521
feat(vtiger-crm): add create todo action
2024-05-07 13:23:49 +02:00
Rıdvan Akca
9a96258265 feat(vtiger-crm): add create case action 2024-05-07 11:22:51 +00:00
Rıdvan Akca
a6cc1566c7 feat(vtiger-crm): add create contact action 2024-05-07 11:22:51 +00:00
Rıdvan Akca
d8d6227125 feat(vtiger-crm): add create lead action 2024-05-07 11:22:51 +00:00
Rıdvan Akca
fbfa67e471 feat(vtiger-crm): add create todo action 2024-05-07 11:22:51 +00:00
Rıdvan Akca
ab897ada5a feat(vtiger-crm): add create opportunity action 2024-05-07 11:22:49 +00:00
Ali BARIN
3bcd3f3cb7 Merge pull request #1524 from automatisch/AUT-528
feat(vtiger-crm): add new todos trigger
2024-05-07 12:18:12 +02:00
Ali BARIN
acbede8631 Merge pull request #1523 from automatisch/AUT-530
feat(vtiger-crm): add new opportunities trigger
2024-05-07 12:16:40 +02:00
Ali BARIN
fa8c7571d7 Merge pull request #1522 from automatisch/AUT-531
feat(vtiger-crm): add new leads trigger
2024-05-07 12:14:52 +02:00
Ali BARIN
a58575c5a1 Merge pull request #1521 from automatisch/AUT-532
feat(vtiger-crm): add new invoices trigger
2024-05-07 12:13:44 +02:00
Ali BARIN
51f7009a80 Merge pull request #1520 from automatisch/AUT-533
feat(vtiger-crm): add new contacts trigger
2024-05-07 12:09:49 +02:00
Ali BARIN
ba24c77f06 Merge pull request #1519 from automatisch/AUT-534
feat(vtiger-crm): add new cases trigger
2024-05-07 11:41:57 +02:00
Rıdvan Akca
6b712c9a90 feat(disqus): add new flagged comments trigger 2024-05-07 10:43:47 +02:00
Ali BARIN
033b15a158 Merge pull request #1484 from automatisch/AUT-510
feat(google-tasks): add google tasks integration
2024-05-06 18:23:28 +02:00
Ali BARIN
e398bb84d4 fix(google-tasks): use DOCS_URL variable in auth doc url 2024-05-06 16:15:32 +00:00
Ali BARIN
05e902ab0c fix(google-tasks): enable triggers 2024-05-06 16:13:52 +00:00
Ali BARIN
36eee61cb5 fix(google-tasks/triggers): use id instead of etag 2024-05-06 16:13:30 +00:00
Ali BARIN
2409ce6fce fix(google-tasks/newCompletedTasks): use unique meaningful key 2024-05-06 16:13:12 +00:00
Ali BARIN
999d61e520 Merge pull request #1485 from automatisch/AUT-511
feat(google-tasks): add find task action
2024-05-06 18:12:02 +02:00
Ali BARIN
08d2418190 Merge pull request #1486 from automatisch/AUT-512
feat(google-tasks): add update task action
2024-05-06 18:08:25 +02:00
Ali BARIN
6c07faeaaf Merge pull request #1487 from automatisch/AUT-513
feat(google-tasks): add create task action
2024-05-06 18:05:49 +02:00
Ali BARIN
3f5cfbf5a2 Merge pull request #1488 from automatisch/AUT-514
feat(google-tasks): add create task list action
2024-05-06 18:02:40 +02:00
Ali BARIN
28f7707c75 Merge pull request #1489 from automatisch/AUT-515
feat(google-tasks): add new task lists trigger
2024-05-06 17:59:11 +02:00
Ali BARIN
dc8358f6ce Merge pull request #1490 from automatisch/AUT-516
feat(google-tasks): add new tasks trigger
2024-05-06 17:56:25 +02:00
Ali BARIN
ffcda04677 Merge pull request #1492 from automatisch/AUT-517
feat(google-tasks): add new completed tasks trigger
2024-05-06 17:50:23 +02:00
Ali BARIN
64ef655abb Merge pull request #1862 from automatisch/remove-dockerfile-cloud
chore(docker): remove Dockerfile.cloud
2024-05-06 17:00:01 +02:00
Ali BARIN
67887b1220 Merge pull request #1472 from automatisch/AUT-506
feat(disqus): add disqus integration
2024-05-06 16:14:31 +02:00
Ali BARIN
07803d1263 Merge pull request #1476 from automatisch/AUT-509
feat(disqus): add new comments trigger
2024-05-06 16:11:19 +02:00
Ali BARIN
f5ff7f7e13 chore(docker): remove Dockerfile.cloud 2024-05-06 12:42:05 +00:00
Ali BARIN
641d062b82 Merge pull request #1846 from automatisch/encode-uri-component
feat(formatter): add encode uri using encodeURIComponent action
2024-05-06 14:40:27 +02:00
Rıdvan Akca
bb28a06ee9 feat(formatter): add encode uri using encodeURIComponent action 2024-05-06 14:12:04 +02:00
Ali BARIN
81338c60f2 Merge pull request #1845 from automatisch/AUT-955
feat(formatter): add encode uri action
2024-05-06 13:44:40 +02:00
Ömer Faruk Aydın
f47fa5d272 Merge pull request #1859 from automatisch/remove-docker-cloud-entrypoint
chore(docker): remove cloud entrypoint
2024-05-03 15:16:20 +02:00
Ali BARIN
29e9e012a5 chore(docker): remove cloud entrypoint 2024-05-03 13:12:35 +00:00
Ömer Faruk Aydın
f89ddb5847 Merge pull request #1858 from automatisch/automatisch-version
fix: Do not use the version from npm packages
2024-05-03 15:11:51 +02:00
Faruk AYDIN
c721f063ef fix: Do not use the version from npm packages 2024-05-03 15:04:32 +02:00
Ömer Faruk Aydın
a709565336 Merge pull request #1857 from automatisch/latest-dockerfile
feat: Use latest docker image for docker compose
2024-05-03 14:53:25 +02:00
Faruk AYDIN
91e484aef1 feat: Use latest docker image for docker compose 2024-05-03 14:48:44 +02:00
Rıdvan Akca
6ba94dcc8e feat(formatter): add encode uri action 2024-04-27 13:21:50 +02:00
Ömer Faruk Aydın
788530be45 Merge pull request #1843 from automatisch/dockerignore
chore: Add .env and yarn error log files to dockerignore
2024-04-26 17:27:55 +02:00
Faruk AYDIN
7ed392e854 chore: Add .env and yarn error log files to dockerignore 2024-04-26 17:19:18 +02:00
Ömer Faruk Aydın
3932e554da Merge pull request #1842 from automatisch/node-gyp
chore: Explicitly install node-gyp
2024-04-26 16:45:30 +02:00
Faruk AYDIN
1a21624618 chore: Explicitly install node-gyp 2024-04-26 16:39:14 +02:00
Ömer Faruk Aydın
9f292ff018 Merge pull request #1840 from automatisch/update-bcrypt
chore: Update bcrypt version to 5.1.0
2024-04-26 15:43:47 +02:00
Faruk AYDIN
dbb24b3a9b chore: Update bcrypt version to 5.1.0 2024-04-26 15:36:36 +02:00
Ali BARIN
35b2639837 Merge pull request #1839 from automatisch/dockerfile-revision
chore: direct builds in docker
2024-04-26 15:02:37 +02:00
Ali BARIN
35951199cd chore: direct builds in docker 2024-04-26 14:42:56 +02:00
Ali BARIN
79af909c51 Merge pull request #1832 from automatisch/align-404-page-center
fix: align 404 page content to the center
2024-04-26 14:22:26 +02:00
Ali BARIN
3482aa7b76 Merge pull request #1837 from automatisch/logout-endpoint-web-implementation
feat: implement revoke access token with RQ
2024-04-26 14:20:49 +02:00
Ali BARIN
5dbc1f59ef Merge pull request #1835 from automatisch/logout-endpoint
feat: add DELETE /access-tokens/:token
2024-04-26 14:18:59 +02:00
Ali BARIN
2166a3220e style: add break line before variable declaration and beforeEach 2024-04-26 12:02:38 +00:00
Ali BARIN
24a7d1ef10 Merge pull request #1833 from automatisch/aut-931
feat: remove static page title
2024-04-26 11:51:03 +02:00
Ali BARIN
18ffbb7317 fix(AccountDropdownMenu): await token revocation request 2024-04-26 09:27:41 +00:00
Rıdvan Akca
363874de6a feat: implement revoke access token with RQ 2024-04-26 09:25:50 +00:00
Ali BARIN
68d1719b11 feat: add new methods to cors options 2024-04-26 09:25:27 +00:00
Ali BARIN
1a75d81268 test: add test for revoking access token 2024-04-26 09:16:53 +00:00
Ali BARIN
2163be4227 feat: add DELETE /access-tokens/:token 2024-04-24 15:31:22 +00:00
Ali BARIN
b54afcd922 Merge pull request #1825 from automatisch/access-tokens
feat: Use persisted access tokens for authentication
2024-04-24 16:39:57 +02:00
Ali BARIN
0a86641a0f feat: remove static page title 2024-04-24 15:27:37 +02:00
kasia.oczkowska
18464c746a fix: align 404 page content to the center 2024-04-24 13:20:07 +01:00
Ömer Faruk Aydın
ba92cddae1 Merge pull request #1828 from automatisch/aut-932
feat: compute DOCS_URL in authDocUrl
2024-04-24 12:09:19 +02:00
Faruk AYDIN
2a4f8ed45f feat: Add indexes to token and userId columns of access tokens 2024-04-24 12:03:45 +02:00
Ali BARIN
135a0028be feat: introduce DOCS_URL in authDocUrl properties 2024-04-23 12:39:38 +00:00
Ali BARIN
4da6e8372f feat: compute DOCS_URL in authDocUrl 2024-04-23 12:21:51 +00:00
Faruk AYDIN
6a7cdf2570 feat: Use persisted access tokens for authentication 2024-04-22 16:57:34 +02:00
Faruk AYDIN
73c929f25e feat: Create access tokens model 2024-04-22 15:19:17 +02:00
Ali BARIN
754c2d41c2 Merge pull request #1814 from automatisch/AUT-892
feat: remove chatwood
2024-04-17 14:40:17 +02:00
Rıdvan Akca
7201e48111 feat: remove chatwood 2024-04-17 14:29:54 +02:00
Ömer Faruk Aydın
e4292815cd Merge pull request #1812 from automatisch/AUT-917
fix: expose missing createdAt and updatedAt fields from flow
2024-04-16 14:10:26 +02:00
Rıdvan Akca
ab37250d5d fix: expose missing createdAt and updatedAt fields from flow 2024-04-15 13:57:38 +02:00
Ömer Faruk Aydın
e5be8d3ba7 Merge pull request #1802 from automatisch/AUT-688
refactor: rewrite get connected apps with RQ
2024-04-15 11:43:35 +02:00
Ali BARIN
96a421fa22 Merge pull request #1811 from automatisch/AUT-920
fix: make inputs look and behave disabled when flow is in published state
2024-04-12 16:19:37 +02:00
kasia.oczkowska
12f72401b1 fix: make inputs look and behave disabled when flow is in published state 2024-04-12 14:58:24 +01:00
Ali BARIN
7391a9eddc Merge pull request #1810 from automatisch/AUT-921
fix: disable add connection button for unauthorized users
2024-04-12 15:15:38 +02:00
Ali BARIN
30dee27f72 Merge pull request #1809 from automatisch/AUT-914
fix: invalidate app connections upon reconnecting a connection
2024-04-12 15:15:11 +02:00
Ali BARIN
51a9939034 Merge pull request #1808 from automatisch/AUT-922
fix: disable create flow button when user doesn't have permissions
2024-04-12 15:14:44 +02:00
Ali BARIN
e03c6e0ca4 Merge pull request #1807 from automatisch/update-query-key
fix: update old query key
2024-04-12 15:14:26 +02:00
Rıdvan Akca
bece5c6488 fix: invalidate app connections upon reconnecting a connection 2024-04-12 14:55:45 +02:00
kasia.oczkowska
d49bb4c52d fix: disable add connection button for unauthorized users 2024-04-12 13:43:26 +01:00
kattoczko
73d0eec30c Merge branch 'main' into update-query-key 2024-04-12 14:10:40 +02:00
kasia.oczkowska
5c756b16ca fix: disable create flow button when user doesn't have permissions 2024-04-12 12:41:50 +01:00
Ali BARIN
f482c2422c Merge pull request #1806 from automatisch/AUT-913
fix: invalidate app connections upon creating a connection
2024-04-12 13:31:03 +02:00
kasia.oczkowska
2e564c863f fix: update old query key 2024-04-12 12:25:02 +01:00
Rıdvan Akca
d9917a81bb fix: invalidate app connections upon creating a connection 2024-04-12 13:10:51 +02:00
Ali BARIN
61dc431f92 Merge pull request #1805 from automatisch/AUT-919
fix: pass current user id to usePlanAndUsage hook
2024-04-12 13:06:57 +02:00
Ali BARIN
7d2fb8d9d7 Merge pull request #1803 from automatisch/AUT-912
fix: invalidate useCurrentUser when updating profile settings
2024-04-12 13:06:24 +02:00
Ali BARIN
608b79b66f Merge pull request #1804 from automatisch/unify-query-keys 2024-04-12 11:57:13 +02:00
kasia.oczkowska
009754c18b fix: pass current user id to usePlanAndUsage hook 2024-04-12 10:43:40 +01:00
Rıdvan Akca
5df07c289e fix: invalidate useCurrentUser when updating profile settings 2024-04-12 11:28:13 +02:00
kasia.oczkowska
a36d10870b feat: unify react-query query keys 2024-04-12 10:07:51 +01:00
kasia.oczkowska
b549ba3e39 refactor: rewrite get connected apps with RQ 2024-04-11 14:00:53 +01:00
Ali BARIN
897c96361f Merge pull request #1801 from automatisch/remove-unused-get-app-auth-client
refactor: remove not used files related to gql get-app-auth-client
2024-04-11 12:18:03 +02:00
kasia.oczkowska
e7693d8aa6 refactor: remove not used files related to gql get-app-auth-client 2024-04-11 11:10:58 +01:00
Ali BARIN
1fe755f836 Merge pull request #1800 from automatisch/AUT-689
refactor: rewrite useDynamicData with RQ
2024-04-10 17:47:22 +02:00
Rıdvan Akca
ea1a63f7dd refactor: rewrite useDynamicData with RQ 2024-04-10 17:25:01 +02:00
Ali BARIN
85134722a5 Merge pull request #1799 from automatisch/AUT-709
refactor: rewrite test connection with RQ
2024-04-10 17:21:37 +02:00
Rıdvan Akca
5c9d3ed134 refactor: rewrite test connection with RQ 2024-04-10 16:39:55 +02:00
Ali BARIN
17fb935ea0 Merge pull request #1798 from automatisch/fix-flow-counts
fix: show flow counts using useConnectionFlows
2024-04-10 16:37:06 +02:00
Ali BARIN
196642a1cf feat(AppConnectionRow): embed skeleton in place of flow count 2024-04-10 14:08:30 +00:00
Rıdvan Akca
009cf63d8c fix: show flow counts using useConnectionFlows 2024-04-10 15:29:21 +02:00
Ali BARIN
da399aacd6 Merge pull request #1766 from automatisch/AUT-705
refactor: rewrite useStepWithTestExecutions with RQ
2024-04-10 13:30:04 +02:00
Rıdvan Akca
3632ee77e5 refactor: rewrite useStepWithTestExecutions with RQ 2024-04-09 16:32:52 +02:00
Ali BARIN
2901f337cc Merge pull request #1797 from automatisch/disable-retry-on-mount
fix: disable retry on mount by default
2024-04-09 14:31:57 +02:00
Ali BARIN
f0bd2f335b fix: disable retry on mount by default 2024-04-08 15:20:10 +00:00
Ali BARIN
acdd026448 Merge pull request #1780 from automatisch/AUT-686
refactor: rewrite useBillingAndUsageData with useSubscription and useUserTrial
2024-04-08 15:22:55 +02:00
Ali BARIN
fb0a328ab0 Merge pull request #1791 from automatisch/AUT-905
refactor: rewrite get app connections with RQ
2024-04-08 15:21:02 +02:00
Rıdvan Akca
d2a7889fc9 refactor: remove useBillingAndUsageData hook 2024-04-08 14:49:37 +02:00
Rıdvan Akca
88c50e014d fix: update SubscriptionCancelledAlert and CheckoutCompletedAlert based on useSubscription and useUserTrial 2024-04-08 14:45:42 +02:00
Rıdvan Akca
f0ef12f904 refactor: rewrite useSubscription with RQ and use it in UsageDataInformation 2024-04-08 14:45:42 +02:00
Rıdvan Akca
1827f5413f refactor(useUserTrial): return hasTrial field from hook 2024-04-08 14:45:42 +02:00
Rıdvan Akca
0609f30e25 feat: introduce usePlanAndUsage with RQ 2024-04-08 14:45:42 +02:00
Rıdvan Akca
d4e4d95b6d refactor: rewrite get app connections with RQ 2024-04-08 14:44:36 +02:00
Ali BARIN
d74af4931e Merge pull request #1793 from automatisch/AUT-682
refactor: rewrite useAuthClients with RQ
2024-04-08 14:40:44 +02:00
Ali BARIN
bee043d10d Merge pull request #1792 from automatisch/fix-deleting-flows
fix: refetch app flows after delete and duplicate
2024-04-08 14:25:52 +02:00
Rıdvan Akca
a65e48b98a fix: refetch app flows after delete and duplicate 2024-04-08 13:52:32 +02:00
Ali BARIN
ee26b54d54 Merge pull request #1761 from automatisch/AUT-859
refactor: rewrite useFlow and useStepConnection with RQ
2024-04-08 13:33:48 +02:00
Ömer Faruk Aydın
855ec53dc2 Merge pull request #1795 from automatisch/rest-get-user-apps
feat: Implement users get apps API endpoint
2024-04-07 03:54:47 +02:00
Faruk AYDIN
3e3e48110d feat: Implement users get apps API endpoint 2024-04-07 03:45:33 +02:00
Rıdvan Akca
fc04a357c8 refactor: rewrite useFlow and useStepConnection with RQ 2024-04-05 17:51:28 +02:00
Ali BARIN
c8147370de Merge pull request #1794 from automatisch/fix-application-page
fix: destructure app config data correctly on Application page
2024-04-05 16:50:57 +02:00
kasia.oczkowska
999426be89 fix: destructure app config data correctly on Application page 2024-04-05 15:36:50 +01:00
kasia.oczkowska
91458f91ef refactor: rewrite useAuthClients with RQ 2024-04-05 15:35:05 +01:00
Ali BARIN
4b9ed29cc0 Merge pull request #1758 from automatisch/dependabot/npm_and_yarn/webpack-dev-middleware-5.3.4
chore(deps): bump webpack-dev-middleware from 5.3.0 to 5.3.4
2024-04-05 16:03:44 +02:00
Ali BARIN
e3bcb673fb Merge pull request #1787 from automatisch/dependabot/npm_and_yarn/vite-3.2.10
chore(deps): bump vite from 3.2.8 to 3.2.10
2024-04-05 16:03:20 +02:00
Ali BARIN
bf4776ca4f Merge pull request #1788 from automatisch/AUT-867
fix: introduce fix for token management
2024-04-05 14:19:05 +02:00
Ali BARIN
9f7f30a92a Merge pull request #1790 from automatisch/AUT-907
fix: set loading false if there is no flowName
2024-04-05 14:18:03 +02:00
Rıdvan Akca
5c29fff55e fix: set loading false if there is no flowName 2024-04-05 14:06:29 +02:00
Ali BARIN
a0160c2573 Merge pull request #1789 from automatisch/fix-use-apps
fix: introduce fix for useApps not using name as param
2024-04-05 12:00:50 +02:00
kasia.oczkowska
87d3ca287d fix: introduce fix for useApps not using name as param 2024-04-05 10:48:49 +01:00
kasia.oczkowska
526e093689 fix: introduce fix for token management 2024-04-04 14:16:25 +01:00
Ömer Faruk Aydın
0930c9d8d6 Merge pull request #1786 from automatisch/flow-error-message
fix: Use soft deleted filter to get soft deleted user
2024-04-04 00:50:50 +02:00
dependabot[bot]
ec680a713d chore(deps): bump vite from 3.2.8 to 3.2.10
Bumps [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) from 3.2.8 to 3.2.10.
- [Release notes](https://github.com/vitejs/vite/releases)
- [Changelog](https://github.com/vitejs/vite/blob/v3.2.10/packages/vite/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite/commits/v3.2.10/packages/vite)

---
updated-dependencies:
- dependency-name: vite
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-04-03 18:08:37 +00:00
Faruk AYDIN
583f90d1e9 fix: Use soft deleted filter to get soft deleted user 2024-04-03 19:10:40 +02:00
Ömer Faruk Aydın
8ba95381bc Merge pull request #1784 from automatisch/create-dynamic-data-action
feat: Implement create dynamic data API endpoint
2024-04-03 01:23:14 +02:00
Faruk AYDIN
ec6d634b99 feat: Implement create dynamic data API endpoint 2024-04-03 01:17:06 +02:00
Ali BARIN
bc082acbe7 Merge pull request #1785 from automatisch/make-stages-dynamic-in-pipedrive
feat(pipedrive/create-deal): add dynamic stages
2024-04-03 00:09:46 +02:00
Ali BARIN
e474ba02cb Merge pull request #1645 from automatisch/flex-http-request
feat(http-request/custom-request): utilize accept header for parsing response
2024-04-02 19:54:44 +02:00
Ali BARIN
ea922aaf10 feat(pipedrive/create-deal): add dynamic stages 2024-04-02 15:43:53 +00:00
Ömer Faruk Aydın
766e6e20d8 Merge pull request #1783 from automatisch/rest-test-connection
feat: Implement test connection API endpoint
2024-03-30 00:22:38 +01:00
Faruk AYDIN
8e646c244e feat: Implement test connection API endpoint 2024-03-30 00:12:59 +01:00
Ömer Faruk Aydın
26f31a5899 Merge pull request #1782 from automatisch/rest-get-app-connections
feat: Implement get app connections API endpoint
2024-03-29 00:44:15 +01:00
Faruk AYDIN
5c79e374dd feat: Implement get app connections API endpoint 2024-03-29 00:21:58 +01:00
Ömer Faruk Aydın
7c1473ea95 Merge pull request #1781 from automatisch/fix-app-config-endpoint
fix: Fetch app auth clients for app config endpoint
2024-03-28 22:55:46 +01:00
Faruk AYDIN
1fe4cc3258 fix: Fetch app auth clients for app config endpoint 2024-03-28 22:48:17 +01:00
Ömer Faruk Aydın
042ad4cea1 Merge pull request #1774 from automatisch/rest-admin-get-app-auth-client
feat: Implement new admin get app auth client API endpoint
2024-03-28 20:47:50 +01:00
Ömer Faruk Aydın
e4c998dbce Merge pull request #1773 from automatisch/rest-admin-get-app-auth-clients
feat: Implement new admin get auth clients API endpoint
2024-03-28 20:47:40 +01:00
Ömer Faruk Aydın
83c8cacdac Merge pull request #1771 from automatisch/rest-get-app-auth-clients
feat: Implement new get app auth clients API endpoint
2024-03-28 20:47:12 +01:00
Ömer Faruk Aydın
f75d5d906e Merge pull request #1770 from automatisch/add-app-key-to-auth-clients
feat: Implement new get auth clients api endpoint
2024-03-28 20:44:51 +01:00
Faruk AYDIN
85b3856564 chore: Correct the folder of get auth client mock 2024-03-28 20:41:12 +01:00
Faruk AYDIN
75cb2569b5 chore: Remove old app auth client routers 2024-03-28 20:41:12 +01:00
Faruk AYDIN
0a4ac1cece feat: Implement new admin get app auth client API endpoint 2024-03-28 20:41:12 +01:00
Faruk AYDIN
a873fd14bd chore: Remove old admin app auth clients API endpoint 2024-03-28 20:40:45 +01:00
Faruk AYDIN
85b4cd4998 feat: Implement new admin get auth clients API endpoint 2024-03-28 20:40:45 +01:00
Faruk AYDIN
e9bc9b1aa8 fix: Typo for the get auth clients test file 2024-03-28 20:40:45 +01:00
Faruk AYDIN
e3bf599bf6 feat: Implement new get app auth clients API endpoint 2024-03-28 20:40:14 +01:00
Faruk AYDIN
01ae96840e refactor: Remove redundant appConfigId from get auth clients mock 2024-03-28 20:38:46 +01:00
Faruk AYDIN
186160ebf4 feat: Make appKey column of app auth clients not nullable 2024-03-28 20:38:46 +01:00
Faruk AYDIN
70f5e45c1f chore: Remove old app auth clients API endpoint 2024-03-28 20:38:46 +01:00
Faruk AYDIN
6dc54ecabc feat: Implement new get auth clients api endpoint 2024-03-28 20:38:46 +01:00
Faruk AYDIN
d21888c047 feat: Remove app config relation from app auth clients 2024-03-28 20:38:46 +01:00
Faruk AYDIN
33f7a90042 feat: Remove app auth clients relation from app configs 2024-03-28 20:38:46 +01:00
Faruk AYDIN
a00d3a2c5e feat: Remove app config id from app auth clients 2024-03-28 20:38:46 +01:00
Faruk AYDIN
abc64d769c feat: Migrate app config id to app key 2024-03-28 20:38:46 +01:00
Faruk AYDIN
88754ac569 feat: Add appKey to app auth clients 2024-03-28 20:38:46 +01:00
Ali BARIN
e3ee05d47d Merge pull request #1772 from automatisch/fix-signal
fix(useDynamicFields): pass signal in RQ
2024-03-28 14:22:39 +01:00
Rıdvan Akca
3b004e7483 fix(useDynamicFields): pass signal in RQ 2024-03-27 10:57:17 +03:00
dependabot[bot]
565db852e0 chore(deps): bump webpack-dev-middleware from 5.3.0 to 5.3.4
Bumps [webpack-dev-middleware](https://github.com/webpack/webpack-dev-middleware) from 5.3.0 to 5.3.4.
- [Release notes](https://github.com/webpack/webpack-dev-middleware/releases)
- [Changelog](https://github.com/webpack/webpack-dev-middleware/blob/v5.3.4/CHANGELOG.md)
- [Commits](https://github.com/webpack/webpack-dev-middleware/compare/v5.3.0...v5.3.4)

---
updated-dependencies:
- dependency-name: webpack-dev-middleware
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-03-22 09:08:14 +00:00
Ali BARIN
bd1ad5fa56 feat(http-request/custom-request): utilize accept header for parsing response 2024-02-23 18:03:56 +00:00
Ali BARIN
f2e22e7445 feat: keep axios defaults for instances 2024-02-23 18:02:33 +00:00
Rıdvan Akca
0f39007f92 feat(ynab): add new transactions trigger 2024-01-18 18:08:42 +03:00
Rıdvan Akca
ab811daba7 feat(ynab): add goal completed trigger 2024-01-18 18:00:48 +03:00
Rıdvan Akca
1428bf8ffa feat(ynab): add category overspent trigger 2024-01-18 17:31:53 +03:00
Rıdvan Akca
53f7f38e23 feat(ynab): add low account balance trigger 2024-01-18 16:00:52 +03:00
Rıdvan Akca
ce6ad9e0d3 feat(ynab): add you need a budget app integration 2024-01-18 15:54:20 +03:00
Rıdvan Akca
17a0c6123a feat(vtiger-crm): add new todos trigger 2024-01-17 10:47:52 +03:00
Rıdvan Akca
10edc5a8ad feat(vtiger-crm): add new opportunities trigger 2024-01-16 18:09:05 +03:00
Rıdvan Akca
bdf07d6bd5 feat(vtiger-crm): add new leads trigger 2024-01-16 18:05:13 +03:00
Rıdvan Akca
10ff65e71a feat(vtiger-crm): add new invoices trigger 2024-01-16 18:00:41 +03:00
Rıdvan Akca
9395097fda feat(vtiger-crm): add new contacts trigger 2024-01-16 17:55:48 +03:00
Rıdvan Akca
47eb0e00e3 feat(vtiger-crm): add new cases trigger 2024-01-16 17:48:24 +03:00
Rıdvan Akca
57d5f34ac5 feat(vtiger-crm): add vtiger crm integration 2024-01-16 17:42:34 +03:00
Rıdvan Akca
06b040412a feat(google-tasks): add new completed tasks trigger 2024-01-16 17:30:25 +03:00
Rıdvan Akca
cab040c74a feat(google-tasks): add new tasks trigger 2024-01-16 17:25:25 +03:00
Rıdvan Akca
21706a7d15 feat(google-tasks): add new task lists trigger 2024-01-16 17:17:24 +03:00
Rıdvan Akca
22e4b8aaeb feat(google-tasks): add create task list action 2024-01-16 17:10:27 +03:00
Rıdvan Akca
bd43a6021a feat(google-tasks): add create task action 2024-01-16 16:39:38 +03:00
Rıdvan Akca
a90b58b6db feat(google-tasks): add update task action 2024-01-16 16:33:41 +03:00
Rıdvan Akca
92a9b096ec feat(google-tasks): add find task action 2024-01-16 16:27:45 +03:00
Rıdvan Akca
7a6aa99840 feat(google-tasks): add google tasks integration 2024-01-16 13:55:03 +03:00
Rıdvan Akca
5657f0d793 feat(disqus): add new comments trigger 2024-01-16 13:40:00 +03:00
Rıdvan Akca
798529007e feat(disqus): add disqus integration 2024-01-16 13:23:26 +03:00
436 changed files with 10803 additions and 2147 deletions

View File

@@ -36,7 +36,6 @@ services:
keycloak: keycloak:
image: quay.io/keycloak/keycloak:21.1 image: quay.io/keycloak/keycloak:21.1
restart: always restart: always
container_name: keycloak
environment: environment:
- KEYCLOAK_ADMIN=admin - KEYCLOAK_ADMIN=admin
- KEYCLOAK_ADMIN_PASSWORD=admin - KEYCLOAK_ADMIN_PASSWORD=admin

View File

@@ -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

View File

@@ -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"]

View File

@@ -1,24 +0,0 @@
# syntax=docker/dockerfile:1
FROM node:18-alpine
ENV PORT 3000
RUN \
apk --no-cache add --virtual build-dependencies python3 build-base git
RUN git clone https://github.com/automatisch/automatisch.git
WORKDIR /automatisch
RUN yarn install
RUN if [ "$WORKER" != "true" ]; then cd packages/web && yarn build; fi
RUN \
rm -rf /usr/local/share/.cache/ && \
apk del build-dependencies
COPY ./docker/entrypoint-cloud.sh /entrypoint-cloud.sh
EXPOSE 3000
ENTRYPOINT ["sh", "/entrypoint-cloud.sh"]

View File

@@ -1,5 +1,5 @@
# syntax=docker/dockerfile:1 # syntax=docker/dockerfile:1
FROM automatischio/automatisch:0.10.0 FROM automatischio/automatisch:latest
WORKDIR /automatisch WORKDIR /automatisch
RUN apk add --no-cache openssl dos2unix RUN apk add --no-cache openssl dos2unix

View File

@@ -1,13 +0,0 @@
#!/bin/sh
set -e
cd packages/backend
if [ -n "$WORKER" ]; then
yarn start:worker
else
yarn db:migrate
yarn db:seed:user
yarn start
fi

View File

@@ -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

View File

@@ -2,6 +2,7 @@ import appConfig from '../../src/config/app.js';
import logger from '../../src/helpers/logger.js'; import logger from '../../src/helpers/logger.js';
import client from './client.js'; import client from './client.js';
import User from '../../src/models/user.js'; import User from '../../src/models/user.js';
import Config from '../../src/models/config.js';
import Role from '../../src/models/role.js'; import Role from '../../src/models/role.js';
import '../../src/config/orm.js'; import '../../src/config/orm.js';
import process from 'process'; import process from 'process';
@@ -21,6 +22,14 @@ export async function createUser(
email = 'user@automatisch.io', email = 'user@automatisch.io',
password = 'sample' password = 'sample'
) { ) {
if (appConfig.disableSeedUser) {
logger.info('Seed user is disabled.');
process.exit(0);
return;
}
const UNIQUE_VIOLATION_CODE = '23505'; const UNIQUE_VIOLATION_CODE = '23505';
const role = await fetchAdminRole(); const role = await fetchAdminRole();
@@ -37,6 +46,8 @@ export async function createUser(
if (userCount === 0) { if (userCount === 0) {
const user = await User.query().insertAndFetch(userParams); const user = await User.query().insertAndFetch(userParams);
logger.info(`User has been saved: ${user.email}`); logger.info(`User has been saved: ${user.email}`);
await Config.markInstallationCompleted();
} else { } else {
logger.info('No need to seed a user.'); logger.info('No need to seed a user.');
} }

View File

@@ -31,7 +31,7 @@
"accounting": "^0.4.1", "accounting": "^0.4.1",
"ajv-formats": "^2.1.1", "ajv-formats": "^2.1.1",
"axios": "1.6.0", "axios": "1.6.0",
"bcrypt": "^5.0.1", "bcrypt": "^5.1.0",
"bullmq": "^3.0.0", "bullmq": "^3.0.0",
"cors": "^2.8.5", "cors": "^2.8.5",
"crypto-js": "^4.1.1", "crypto-js": "^4.1.1",
@@ -67,6 +67,7 @@
"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",
"uuid": "^9.0.1",
"winston": "^3.7.1", "winston": "^3.7.1",
"xmlrpc": "^1.3.2" "xmlrpc": "^1.3.2"
}, },
@@ -95,6 +96,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"

View File

@@ -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],

View File

@@ -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',

View File

@@ -0,0 +1,29 @@
import defineAction from '../../../../helpers/define-action.js';
export default defineAction({
name: 'Create a watch',
key: 'createWatch',
description: 'Creates a new change detection watch for a specific website.',
arguments: [
{
label: 'URL',
key: 'url',
type: 'string',
required: true,
variables: true,
description: 'Url you want to monitor',
},
],
async run($) {
const url = $.step.parameters.url;
const body = {
url,
};
const response = await $.http.post('/v1/watch', body);
$.setActionItem({ raw: response.data });
},
});

View File

@@ -0,0 +1,3 @@
import createWatch from './create-watch/index.js';
export default [createWatch];

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 9.9 KiB

View File

@@ -0,0 +1,44 @@
import verifyCredentials from './verify-credentials.js';
import isStillVerified from './is-still-verified.js';
export default {
fields: [
{
key: 'screenName',
label: 'Screen Name',
type: 'string',
required: true,
readOnly: false,
value: null,
placeholder: null,
description:
'Screen name of your connection to be used on Automatisch UI.',
clickToCopy: false,
},
{
key: 'instanceUrl',
label: 'Instance URL',
type: 'string',
required: true,
readOnly: false,
value: null,
placeholder: null,
description: null,
clickToCopy: false,
},
{
key: 'apiKey',
label: 'API Key',
type: 'string',
required: true,
readOnly: false,
value: null,
placeholder: null,
description: 'Changedetection API key of your account.',
clickToCopy: false,
},
],
verifyCredentials,
isStillVerified,
};

View File

@@ -0,0 +1,8 @@
import verifyCredentials from './verify-credentials.js';
const isStillVerified = async ($) => {
await verifyCredentials($);
return true;
};
export default isStillVerified;

View File

@@ -0,0 +1,10 @@
const verifyCredentials = async ($) => {
await $.http.get('/v1/systeminfo');
await $.auth.set({
screenName: $.auth.data.screenName,
apiKey: $.auth.data.apiKey,
});
};
export default verifyCredentials;

View File

@@ -0,0 +1,9 @@
const addAuthHeader = ($, requestConfig) => {
if ($.auth.data?.apiKey) {
requestConfig.headers['x-api-key'] = $.auth.data.apiKey;
}
return requestConfig;
};
export default addAuthHeader;

View File

@@ -0,0 +1,10 @@
const setBaseUrl = ($, requestConfig) => {
const instanceUrl = $.auth.data.instanceUrl;
if (instanceUrl) {
requestConfig.baseURL = `${instanceUrl}/api`;
}
return requestConfig;
};
export default setBaseUrl;

View File

@@ -0,0 +1,19 @@
import defineApp from '../../helpers/define-app.js';
import addAuthHeader from './common/add-auth-header.js';
import auth from './auth/index.js';
import setBaseUrl from './common/set-base-url.js';
import actions from './actions/index.js';
export default defineApp({
name: 'Changedetection',
key: 'changedetection',
iconUrl: '{BASE_URL}/apps/changedetection/assets/favicon.svg',
authDocUrl: '{DOCS_URL}/apps/changedetection/connection',
supportsConnections: true,
baseUrl: 'https://changedetection.io',
apiBaseUrl: '',
primaryColor: '3056d3',
beforeRequest: [setBaseUrl, addAuthHeader],
auth,
actions,
});

View File

@@ -5,7 +5,7 @@ export default defineApp({
name: 'Datastore', name: 'Datastore',
key: 'datastore', key: 'datastore',
iconUrl: '{BASE_URL}/apps/datastore/assets/favicon.svg', iconUrl: '{BASE_URL}/apps/datastore/assets/favicon.svg',
authDocUrl: 'https://automatisch.io/docs/apps/datastore/connection', authDocUrl: '{DOCS_URL}/apps/datastore/connection',
supportsConnections: false, supportsConnections: false,
baseUrl: '', baseUrl: '',
apiBaseUrl: '', apiBaseUrl: '',

View File

@@ -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',

View File

@@ -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: '',

View File

@@ -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',

View File

@@ -0,0 +1,16 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
width="200px" height="200px" viewBox="0 0 200 200" enable-background="new 0 0 200 200" xml:space="preserve">
<g id="background">
<rect fill="#2E9FFF" width="200" height="200"/>
</g>
<g id="Layer_2">
</g>
<path fill="#FFFFFF" d="M102.535,167.5c-16.518,0-31.621-6.036-43.298-16.021L30.5,155.405l11.102-27.401
c-3.868-8.535-6.038-18.01-6.038-28.004c0-37.277,29.984-67.5,66.971-67.5c36.984,0,66.965,30.223,66.965,67.5
C169.5,137.284,139.52,167.5,102.535,167.5z M139.102,99.807v-0.188c0-19.479-13.736-33.367-37.42-33.367h-25.58v67.5h25.201
C125.171,133.753,139.102,119.284,139.102,99.807L139.102,99.807z M101.964,117.168h-7.482V82.841h7.482
c10.989,0,18.283,6.265,18.283,17.07v0.188C120.247,110.995,112.953,117.168,101.964,117.168z"/>
</svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

View File

@@ -0,0 +1,21 @@
import { URLSearchParams } from 'url';
import authScope from '../common/auth-scope.js';
export default async function generateAuthUrl($) {
const oauthRedirectUrlField = $.app.auth.fields.find(
(field) => field.key == 'oAuthRedirectUrl'
);
const redirectUri = oauthRedirectUrlField.value;
const searchParams = new URLSearchParams({
client_id: $.auth.data.apiKey,
scope: authScope.join(','),
response_type: 'code',
redirect_uri: redirectUri,
});
const url = `https://disqus.com/api/oauth/2.0/authorize/?${searchParams.toString()}`;
await $.auth.set({
url,
});
}

View File

@@ -0,0 +1,48 @@
import generateAuthUrl from './generate-auth-url.js';
import verifyCredentials from './verify-credentials.js';
import refreshToken from './refresh-token.js';
import isStillVerified from './is-still-verified.js';
export default {
fields: [
{
key: 'oAuthRedirectUrl',
label: 'OAuth Redirect URL',
type: 'string',
required: true,
readOnly: true,
value: '{WEB_APP_URL}/app/disqus/connections/add',
placeholder: null,
description:
'When asked to input a redirect URL in Disqus, enter the URL above.',
clickToCopy: true,
},
{
key: 'apiKey',
label: 'API Key',
type: 'string',
required: true,
readOnly: false,
value: null,
placeholder: null,
description: null,
clickToCopy: false,
},
{
key: 'apiSecret',
label: 'API Secret',
type: 'string',
required: true,
readOnly: false,
value: null,
placeholder: null,
description: null,
clickToCopy: false,
},
],
generateAuthUrl,
verifyCredentials,
isStillVerified,
refreshToken,
};

View File

@@ -0,0 +1,8 @@
import getCurrentUser from '../common/get-current-user.js';
const isStillVerified = async ($) => {
const currentUser = await getCurrentUser($);
return !!currentUser.response.username;
};
export default isStillVerified;

View File

@@ -0,0 +1,26 @@
import { URLSearchParams } from 'node:url';
import authScope from '../common/auth-scope.js';
const refreshToken = async ($) => {
const params = new URLSearchParams({
grant_type: 'refresh_token',
client_id: $.auth.data.apiKey,
client_secret: $.auth.data.apiSecret,
refresh_token: $.auth.data.refreshToken,
});
const { data } = await $.http.post(
`https://disqus.com/api/oauth/2.0/access_token/`,
params.toString()
);
await $.auth.set({
accessToken: data.access_token,
refreshToken: data.refresh_token,
expiresIn: data.expires_in,
scope: authScope.join(','),
tokenType: data.token_type,
});
};
export default refreshToken;

View File

@@ -0,0 +1,34 @@
import { URLSearchParams } from 'url';
const verifyCredentials = async ($) => {
const oauthRedirectUrlField = $.app.auth.fields.find(
(field) => field.key == 'oAuthRedirectUrl'
);
const redirectUri = oauthRedirectUrlField.value;
const params = new URLSearchParams({
grant_type: 'authorization_code',
client_id: $.auth.data.apiKey,
client_secret: $.auth.data.apiSecret,
redirect_uri: redirectUri,
code: $.auth.data.code,
});
const { data } = await $.http.post(
`https://disqus.com/api/oauth/2.0/access_token/`,
params.toString()
);
await $.auth.set({
accessToken: data.access_token,
tokenType: data.token_type,
apiKey: $.auth.data.apiKey,
apiSecret: $.auth.data.apiSecret,
scope: $.auth.data.scope,
userId: data.user_id,
expiresIn: data.expires_in,
refreshToken: data.refresh_token,
screenName: data.username,
});
};
export default verifyCredentials;

View File

@@ -0,0 +1,15 @@
import { URLSearchParams } from 'url';
const addAuthHeader = ($, requestConfig) => {
const params = new URLSearchParams({
access_token: $.auth.data.accessToken,
api_key: $.auth.data.apiKey,
api_secret: $.auth.data.apiSecret,
});
requestConfig.params = params;
return requestConfig;
};
export default addAuthHeader;

View File

@@ -0,0 +1,3 @@
const authScope = ['read', 'write', 'admin', 'email'];
export default authScope;

View File

@@ -0,0 +1,10 @@
const getCurrentUser = async ($) => {
try {
const { data: currentUser } = await $.http.get('/3.0/users/details.json');
return currentUser;
} catch (error) {
throw new Error('You are not authenticated.');
}
};
export default getCurrentUser;

View File

@@ -0,0 +1,3 @@
import listForums from './list-forums/index.js';
export default [listForums];

View File

@@ -0,0 +1,36 @@
export default {
name: 'List forums',
key: 'listForums',
async run($) {
const forums = {
data: [],
};
const params = {
limit: 100,
order: 'desc',
cursor: undefined,
};
let more;
do {
const { data } = await $.http.get('/3.0/users/listForums.json', {
params,
});
params.cursor = data.cursor.next;
more = data.cursor.hasNext;
if (data.response?.length) {
for (const forum of data.response) {
forums.data.push({
value: forum.id,
name: forum.id,
});
}
}
} while (more);
return forums;
},
};

View File

@@ -0,0 +1,20 @@
import defineApp from '../../helpers/define-app.js';
import addAuthHeader from './common/add-auth-header.js';
import auth from './auth/index.js';
import dynamicData from './dynamic-data/index.js';
import triggers from './triggers/index.js';
export default defineApp({
name: 'Disqus',
key: 'disqus',
baseUrl: 'https://disqus.com',
apiBaseUrl: 'https://disqus.com/api',
iconUrl: '{BASE_URL}/apps/disqus/assets/favicon.svg',
authDocUrl: '{DOCS_URL}/apps/disqus/connection',
primaryColor: '2E9FFF',
supportsConnections: true,
beforeRequest: [addAuthHeader],
auth,
dynamicData,
triggers,
});

View File

@@ -0,0 +1,4 @@
import newComments from './new-comments/index.js';
import newFlaggedComments from './new-flagged-comments/index.js';
export default [newComments, newFlaggedComments];

View File

@@ -0,0 +1,92 @@
import defineTrigger from '../../../../helpers/define-trigger.js';
import { URLSearchParams } from 'url';
export default defineTrigger({
name: 'New comments',
key: 'newComments',
pollInterval: 15,
description: 'Triggers when a new comment is posted in a forum using Disqus.',
arguments: [
{
label: 'Post Types',
key: 'postTypes',
type: 'dynamic',
required: false,
description:
'Which posts should be considered for inclusion in the trigger?',
fields: [
{
label: 'Type',
key: 'type',
type: 'dropdown',
required: false,
description: '',
variables: true,
options: [
{ label: 'Unapproved Posts', value: 'unapproved' },
{ label: 'Approved Posts', value: 'approved' },
{ label: 'Spam Posts', value: 'spam' },
{ label: 'Deleted Posts', value: 'deleted' },
{ label: 'Flagged Posts', value: 'flagged' },
{ label: 'Highlighted Posts', value: 'highlighted' },
],
},
],
},
{
label: 'Forum',
key: 'forumId',
type: 'dropdown',
required: true,
description: 'Select the forum where you want comments to be triggered.',
variables: true,
source: {
type: 'query',
name: 'getDynamicData',
arguments: [
{
name: 'key',
value: 'listForums',
},
],
},
},
],
async run($) {
const forumId = $.step.parameters.forumId;
const postTypes = $.step.parameters.postTypes;
const formattedCommentTypes = postTypes
.filter((type) => type.type !== '')
.map((type) => type.type);
const params = new URLSearchParams({
limit: '100',
forum: forumId,
});
if (formattedCommentTypes.length) {
formattedCommentTypes.forEach((type) => params.append('include', type));
}
let more;
do {
const { data } = await $.http.get(
`/3.0/posts/list.json?${params.toString()}`
);
params.set('cursor', data.cursor.next);
more = data.cursor.hasNext;
if (data.response?.length) {
for (const comment of data.response) {
$.pushTriggerItem({
raw: comment,
meta: {
internalId: comment.id,
},
});
}
}
} while (more);
},
});

View File

@@ -0,0 +1,60 @@
import defineTrigger from '../../../../helpers/define-trigger.js';
import { URLSearchParams } from 'url';
export default defineTrigger({
name: 'New flagged comments',
key: 'newFlaggedComments',
pollInterval: 15,
description: 'Triggers when a Disqus comment is marked with a flag',
arguments: [
{
label: 'Forum',
key: 'forumId',
type: 'dropdown',
required: true,
description: 'Select the forum where you want comments to be triggered.',
variables: true,
source: {
type: 'query',
name: 'getDynamicData',
arguments: [
{
name: 'key',
value: 'listForums',
},
],
},
},
],
async run($) {
const forumId = $.step.parameters.forumId;
const isFlaggedFilter = 5;
const params = new URLSearchParams({
limit: 100,
forum: forumId,
filters: [isFlaggedFilter],
});
let more;
do {
const { data } = await $.http.get(
`/3.0/posts/list.json?${params.toString()}`
);
params.set('cursor', data.cursor.next);
more = data.cursor.hasNext;
if (data.response?.length) {
for (const comment of data.response) {
$.pushTriggerItem({
raw: comment,
meta: {
internalId: comment.id,
},
});
}
}
} while (more);
},
});

View File

@@ -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',

View File

@@ -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: '',

View File

@@ -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,

View File

@@ -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',

View File

@@ -2,6 +2,7 @@ import defineAction from '../../../../helpers/define-action.js';
import base64ToString from './transformers/base64-to-string.js'; import base64ToString from './transformers/base64-to-string.js';
import capitalize from './transformers/capitalize.js'; import capitalize from './transformers/capitalize.js';
import encodeUriComponent from './transformers/encode-uri-component.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';
import htmlToMarkdown from './transformers/html-to-markdown.js'; import htmlToMarkdown from './transformers/html-to-markdown.js';
@@ -10,12 +11,14 @@ import markdownToHtml from './transformers/markdown-to-html.js';
import pluralize from './transformers/pluralize.js'; import pluralize from './transformers/pluralize.js';
import replace from './transformers/replace.js'; import replace from './transformers/replace.js';
import stringToBase64 from './transformers/string-to-base64.js'; import stringToBase64 from './transformers/string-to-base64.js';
import encodeUri from './transformers/encode-uri.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, base64ToString,
capitalize, capitalize,
encodeUriComponent,
extractEmailAddress, extractEmailAddress,
extractNumber, extractNumber,
htmlToMarkdown, htmlToMarkdown,
@@ -24,6 +27,7 @@ const transformers = {
pluralize, pluralize,
replace, replace,
stringToBase64, stringToBase64,
encodeUri,
trimWhitespace, trimWhitespace,
useDefaultValue, useDefaultValue,
}; };
@@ -43,6 +47,10 @@ export default defineAction({
options: [ options: [
{ label: 'Base64 to String', value: 'base64ToString' }, { label: 'Base64 to String', value: 'base64ToString' },
{ label: 'Capitalize', value: 'capitalize' }, { label: 'Capitalize', value: 'capitalize' },
{
label: 'Encode URI Component',
value: 'encodeUriComponent',
},
{ 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' },
{ label: 'Extract Email Address', value: 'extractEmailAddress' }, { label: 'Extract Email Address', value: 'extractEmailAddress' },
@@ -51,6 +59,7 @@ export default defineAction({
{ label: 'Pluralize', value: 'pluralize' }, { label: 'Pluralize', value: 'pluralize' },
{ label: 'Replace', value: 'replace' }, { label: 'Replace', value: 'replace' },
{ label: 'String to Base64', value: 'stringToBase64' }, { label: 'String to Base64', value: 'stringToBase64' },
{ label: 'Encode URI', value: 'encodeUri' },
{ label: 'Trim Whitespace', value: 'trimWhitespace' }, { label: 'Trim Whitespace', value: 'trimWhitespace' },
{ label: 'Use Default Value', value: 'useDefaultValue' }, { label: 'Use Default Value', value: 'useDefaultValue' },
], ],

View File

@@ -0,0 +1,8 @@
const encodeUriComponent = ($) => {
const input = $.step.parameters.input;
const encodedString = encodeURIComponent(input);
return encodedString;
};
export default encodeUriComponent;

View File

@@ -0,0 +1,8 @@
const encodeUri = ($) => {
const input = $.step.parameters.input;
const encodedString = encodeURI(input);
return encodedString;
};
export default encodeUri;

View File

@@ -1,5 +1,6 @@
import base64ToString from './text/base64-to-string.js'; import base64ToString from './text/base64-to-string.js';
import capitalize from './text/capitalize.js'; import capitalize from './text/capitalize.js';
import encodeUriComponent from './text/encode-uri-component.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';
import htmlToMarkdown from './text/html-to-markdown.js'; import htmlToMarkdown from './text/html-to-markdown.js';
@@ -8,6 +9,7 @@ import markdownToHtml from './text/markdown-to-html.js';
import pluralize from './text/pluralize.js'; import pluralize from './text/pluralize.js';
import replace from './text/replace.js'; import replace from './text/replace.js';
import stringToBase64 from './text/string-to-base64.js'; import stringToBase64 from './text/string-to-base64.js';
import encodeUri from './text/encode-uri.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';
@@ -19,6 +21,7 @@ import formatDateTime from './date-time/format-date-time.js';
const options = { const options = {
base64ToString, base64ToString,
capitalize, capitalize,
encodeUriComponent,
extractEmailAddress, extractEmailAddress,
extractNumber, extractNumber,
htmlToMarkdown, htmlToMarkdown,
@@ -27,6 +30,7 @@ const options = {
pluralize, pluralize,
replace, replace,
stringToBase64, stringToBase64,
encodeUri,
trimWhitespace, trimWhitespace,
useDefaultValue, useDefaultValue,
performMathOperation, performMathOperation,

View File

@@ -0,0 +1,12 @@
const encodeUriComponent = [
{
label: 'Input',
key: 'input',
type: 'string',
required: true,
description: 'URI Component to encode',
variables: true,
},
];
export default encodeUriComponent;

View File

@@ -0,0 +1,12 @@
const encodeUri = [
{
label: 'Input',
key: 'input',
type: 'string',
required: true,
description: 'URI to encode',
variables: true,
},
];
export default encodeUri;

View File

@@ -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: '',

View File

@@ -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],

View File

@@ -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],

View File

@@ -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],

View File

@@ -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],

View File

@@ -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],

View File

@@ -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],

View File

@@ -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],

View File

@@ -0,0 +1,31 @@
import defineAction from '../../../../helpers/define-action.js';
export default defineAction({
name: 'Create task list',
key: 'createTaskList',
description: 'Creates a new task list.',
arguments: [
{
label: 'List Title',
key: 'listTitle',
type: 'string',
required: true,
description: '',
variables: true,
},
],
async run($) {
const listTitle = $.step.parameters.listTitle;
const body = {
title: listTitle,
};
const { data } = await $.http.post('/tasks/v1/users/@me/lists', body);
$.setActionItem({
raw: data,
});
},
});

View File

@@ -0,0 +1,70 @@
import defineAction from '../../../../helpers/define-action.js';
export default defineAction({
name: 'Create task',
key: 'createTask',
description: 'Creates a new task.',
arguments: [
{
label: 'Task List',
key: 'taskListId',
type: 'dropdown',
required: true,
description: '',
variables: true,
source: {
type: 'query',
name: 'getDynamicData',
arguments: [
{
name: 'key',
value: 'listTaskLists',
},
],
},
},
{
label: 'Title',
key: 'title',
type: 'string',
required: true,
description: '',
variables: true,
},
{
label: 'Notes',
key: 'notes',
type: 'string',
required: false,
description: '',
variables: true,
},
{
label: 'Due Date',
key: 'due',
type: 'string',
required: false,
description: 'RFC 3339 timestamp.',
variables: true,
},
],
async run($) {
const { taskListId, title, notes, due } = $.step.parameters;
const body = {
title,
notes,
due,
};
const { data } = await $.http.post(
`/tasks/v1/lists/${taskListId}/tasks`,
body
);
$.setActionItem({
raw: data,
});
},
});

View File

@@ -0,0 +1,57 @@
import defineAction from '../../../../helpers/define-action.js';
export default defineAction({
name: 'Find task',
key: 'findTask',
description: 'Looking for a specific task.',
arguments: [
{
label: 'Task List',
key: 'taskListId',
type: 'dropdown',
required: true,
description: 'The list to be searched.',
variables: true,
source: {
type: 'query',
name: 'getDynamicData',
arguments: [
{
name: 'key',
value: 'listTaskLists',
},
],
},
},
{
label: 'Title',
key: 'title',
type: 'string',
required: true,
description: '',
variables: true,
},
],
async run($) {
const taskListId = $.step.parameters.taskListId;
const title = $.step.parameters.title;
const params = {
showCompleted: true,
showHidden: true,
};
const { data } = await $.http.get(`/tasks/v1/lists/${taskListId}/tasks`, {
params,
});
const filteredTask = data.items?.filter((task) =>
task.title.includes(title)
);
$.setActionItem({
raw: filteredTask[0],
});
},
});

View File

@@ -0,0 +1,6 @@
import createTask from './create-task/index.js';
import createTaskList from './create-task-list/index.js';
import findTask from './find-task/index.js';
import updateTask from './update-task/index.js';
export default [createTask, createTaskList, findTask, updateTask];

View File

@@ -0,0 +1,108 @@
import defineAction from '../../../../helpers/define-action.js';
export default defineAction({
name: 'Update task',
key: 'updateTask',
description: 'Updates an existing task.',
arguments: [
{
label: 'Task List',
key: 'taskListId',
type: 'dropdown',
required: true,
description: '',
variables: true,
source: {
type: 'query',
name: 'getDynamicData',
arguments: [
{
name: 'key',
value: 'listTaskLists',
},
],
},
},
{
label: 'Task',
key: 'taskId',
type: 'dropdown',
required: true,
description: 'Ensure that you choose a list before proceeding.',
variables: true,
dependsOn: ['parameters.taskListId'],
source: {
type: 'query',
name: 'getDynamicData',
arguments: [
{
name: 'key',
value: 'listTasks',
},
{
name: 'parameters.taskListId',
value: '{parameters.taskListId}',
},
],
},
},
{
label: 'Title',
key: 'title',
type: 'string',
required: false,
description: 'Provide a new title for the revised task.',
variables: true,
},
{
label: 'Status',
key: 'status',
type: 'dropdown',
required: false,
description:
'Specify the status of the updated task. If you opt for a custom value, enter either "needsAttention" or "completed."',
variables: true,
options: [
{ label: 'Incomplete', value: 'needsAction' },
{ label: 'Complete', value: 'completed' },
],
},
{
label: 'Notes',
key: 'notes',
type: 'string',
required: false,
description: 'Provide a note for the revised task.',
variables: true,
},
{
label: 'Due Date',
key: 'due',
type: 'string',
required: false,
description:
'Specify the deadline for the task (as a RFC 3339 timestamp).',
variables: true,
},
],
async run($) {
const { taskListId, taskId, title, status, notes, due } = $.step.parameters;
const body = {
title,
status,
notes,
due,
};
const { data } = await $.http.patch(
`/tasks/v1/lists/${taskListId}/tasks/${taskId}`,
body
);
$.setActionItem({
raw: data,
});
},
});

View File

@@ -0,0 +1,16 @@
<?xml version="1.0" encoding="utf-8"?>
<svg version="1.1"
id="svg8849" inkscape:version="1.1 (c68e22c387, 2021-05-23)" sodipodi:docname="google tasks.svg" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="527.1px" height="500px"
viewBox="0 0 527.1 500" enable-background="new 0 0 527.1 500" xml:space="preserve">
<sodipodi:namedview bordercolor="#eeeeee" borderopacity="1" id="namedview8851" inkscape:bbox-nodes="true" inkscape:bbox-paths="true" inkscape:current-layer="layer1" inkscape:cx="280.62992" inkscape:cy="277.14384" inkscape:document-units="mm" inkscape:object-paths="true" inkscape:pagecheckerboard="0" inkscape:pageopacity="0" inkscape:pageshadow="0" inkscape:snap-bbox="true" inkscape:snap-bbox-edge-midpoints="true" inkscape:snap-bbox-midpoints="true" inkscape:snap-center="true" inkscape:snap-global="true" inkscape:snap-intersection-paths="true" inkscape:snap-midpoints="true" inkscape:snap-object-midpoints="true" inkscape:snap-page="true" inkscape:snap-smooth-nodes="true" inkscape:snap-text-baseline="true" inkscape:window-height="1009" inkscape:window-maximized="1" inkscape:window-width="1920" inkscape:window-x="1912" inkscape:window-y="760" inkscape:zoom="1.4342733" pagecolor="#505050" showgrid="false" units="px">
</sodipodi:namedview>
<g>
<polygon fill="#0066DA" points="410.4,58.3 368.8,81.2 348.2,120.6 368.8,168.8 407.8,211 450,187.5 475.9,142.8 450,87.5 "/>
<path fill="#2684FC" d="M249.3,219.4l98.9-98.9c29.1,22.1,50.5,53.8,59.6,90.4L272.1,346.7c-12.2,12.2-32,12.2-44.2,0l-91.5-91.5
c-9.8-9.8-9.8-25.6,0-35.3l39-39c9.8-9.8,25.6-9.8,35.3,0L249.3,219.4z M519.8,63.6l-39.7-39.7c-9.7-9.7-25.6-9.7-35.3,0
l-34.4,34.4c27.5,23,49.9,51.8,65.5,84.5l43.9-43.9C529.6,89.2,529.6,73.3,519.8,63.6z M412.5,250c0,89.8-72.8,162.5-162.5,162.5
S87.5,339.8,87.5,250S160.2,87.5,250,87.5c36.9,0,70.9,12.3,98.2,33.1l62.2-62.2C367,21.9,311.1,0,250,0C111.9,0,0,111.9,0,250
s111.9,250,250,250s250-111.9,250-250c0-38.3-8.7-74.7-24.1-107.2L407.8,211C410.8,223.5,412.5,236.6,412.5,250z"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.2 KiB

View File

@@ -0,0 +1,23 @@
import { URLSearchParams } from 'url';
import authScope from '../common/auth-scope.js';
export default async function generateAuthUrl($) {
const oauthRedirectUrlField = $.app.auth.fields.find(
(field) => field.key == 'oAuthRedirectUrl'
);
const redirectUri = oauthRedirectUrlField.value;
const searchParams = new URLSearchParams({
client_id: $.auth.data.clientId,
redirect_uri: redirectUri,
prompt: 'select_account',
scope: authScope.join(' '),
response_type: 'code',
access_type: 'offline',
});
const url = `https://accounts.google.com/o/oauth2/v2/auth?${searchParams.toString()}`;
await $.auth.set({
url,
});
}

View File

@@ -0,0 +1,48 @@
import generateAuthUrl from './generate-auth-url.js';
import verifyCredentials from './verify-credentials.js';
import refreshToken from './refresh-token.js';
import isStillVerified from './is-still-verified.js';
export default {
fields: [
{
key: 'oAuthRedirectUrl',
label: 'OAuth Redirect URL',
type: 'string',
required: true,
readOnly: true,
value: '{WEB_APP_URL}/app/google-tasks/connections/add',
placeholder: null,
description:
'When asked to input a redirect URL in Google Cloud, enter the URL above.',
clickToCopy: true,
},
{
key: 'clientId',
label: 'Client ID',
type: 'string',
required: true,
readOnly: false,
value: null,
placeholder: null,
description: null,
clickToCopy: false,
},
{
key: 'clientSecret',
label: 'Client Secret',
type: 'string',
required: true,
readOnly: false,
value: null,
placeholder: null,
description: null,
clickToCopy: false,
},
],
generateAuthUrl,
verifyCredentials,
isStillVerified,
refreshToken,
};

View File

@@ -0,0 +1,8 @@
import getCurrentUser from '../common/get-current-user.js';
const isStillVerified = async ($) => {
const currentUser = await getCurrentUser($);
return !!currentUser.resourceName;
};
export default isStillVerified;

View File

@@ -0,0 +1,25 @@
import { URLSearchParams } from 'node:url';
import authScope from '../common/auth-scope.js';
const refreshToken = async ($) => {
const params = new URLSearchParams({
client_id: $.auth.data.clientId,
client_secret: $.auth.data.clientSecret,
grant_type: 'refresh_token',
refresh_token: $.auth.data.refreshToken,
});
const { data } = await $.http.post(
'https://oauth2.googleapis.com/token',
params.toString()
);
await $.auth.set({
accessToken: data.access_token,
expiresIn: data.expires_in,
scope: authScope.join(' '),
tokenType: data.token_type,
});
};
export default refreshToken;

View File

@@ -0,0 +1,42 @@
import getCurrentUser from '../common/get-current-user.js';
const verifyCredentials = async ($) => {
const oauthRedirectUrlField = $.app.auth.fields.find(
(field) => field.key == 'oAuthRedirectUrl'
);
const redirectUri = oauthRedirectUrlField.value;
const { data } = await $.http.post(`https://oauth2.googleapis.com/token`, {
client_id: $.auth.data.clientId,
client_secret: $.auth.data.clientSecret,
code: $.auth.data.code,
grant_type: 'authorization_code',
redirect_uri: redirectUri,
});
await $.auth.set({
accessToken: data.access_token,
tokenType: data.token_type,
});
const currentUser = await getCurrentUser($);
const { displayName } = currentUser.names.find(
(name) => name.metadata.primary
);
const { value: email } = currentUser.emailAddresses.find(
(emailAddress) => emailAddress.metadata.primary
);
await $.auth.set({
clientId: $.auth.data.clientId,
clientSecret: $.auth.data.clientSecret,
scope: $.auth.data.scope,
idToken: data.id_token,
expiresIn: data.expires_in,
refreshToken: data.refresh_token,
resourceName: currentUser.resourceName,
screenName: `${displayName} - ${email}`,
});
};
export default verifyCredentials;

View File

@@ -0,0 +1,9 @@
const addAuthHeader = ($, requestConfig) => {
if ($.auth.data?.accessToken) {
requestConfig.headers.Authorization = `${$.auth.data.tokenType} ${$.auth.data.accessToken}`;
}
return requestConfig;
};
export default addAuthHeader;

View File

@@ -0,0 +1,7 @@
const authScope = [
'https://www.googleapis.com/auth/tasks',
'https://www.googleapis.com/auth/userinfo.email',
'https://www.googleapis.com/auth/userinfo.profile',
];
export default authScope;

View File

@@ -0,0 +1,8 @@
const getCurrentUser = async ($) => {
const { data: currentUser } = await $.http.get(
'https://people.googleapis.com/v1/people/me?personFields=names,emailAddresses'
);
return currentUser;
};
export default getCurrentUser;

View File

@@ -0,0 +1,4 @@
import listTaskLists from './list-task-lists/index.js';
import listTasks from './list-tasks/index.js';
export default [listTaskLists, listTasks];

View File

@@ -0,0 +1,33 @@
export default {
name: 'List task lists',
key: 'listTaskLists',
async run($) {
const taskLists = {
data: [],
};
const params = {
maxResults: 100,
pageToken: undefined,
};
do {
const { data } = await $.http.get('/tasks/v1/users/@me/lists', {
params,
});
params.pageToken = data.nextPageToken;
if (data.items) {
for (const taskList of data.items) {
taskLists.data.push({
value: taskList.id,
name: taskList.title,
});
}
}
} while (params.pageToken);
return taskLists;
},
};

View File

@@ -0,0 +1,40 @@
export default {
name: 'List tasks',
key: 'listTasks',
async run($) {
const tasks = {
data: [],
};
const taskListId = $.step.parameters.taskListId;
const params = {
maxResults: 100,
pageToken: undefined,
};
if (!taskListId) {
return tasks;
}
do {
const { data } = await $.http.get(`/tasks/v1/lists/${taskListId}/tasks`, {
params,
});
params.pageToken = data.nextPageToken;
if (data.items) {
for (const task of data.items) {
if (task.title !== '') {
tasks.data.push({
value: task.id,
name: task.title,
});
}
}
}
} while (params.pageToken);
return tasks;
},
};

View File

@@ -0,0 +1,22 @@
import defineApp from '../../helpers/define-app.js';
import addAuthHeader from './common/add-auth-header.js';
import auth from './auth/index.js';
import actions from './actions/index.js';
import triggers from './triggers/index.js';
import dynamicData from './dynamic-data/index.js';
export default defineApp({
name: 'Google Tasks',
key: 'google-tasks',
baseUrl: 'https://calendar.google.com/calendar/u/0/r/tasks',
apiBaseUrl: 'https://tasks.googleapis.com',
iconUrl: '{BASE_URL}/apps/google-tasks/assets/favicon.svg',
authDocUrl: '{DOCS_URL}/apps/google-tasks/connection',
primaryColor: '0066DA',
supportsConnections: true,
beforeRequest: [addAuthHeader],
auth,
actions,
dynamicData,
triggers,
});

View File

@@ -0,0 +1,5 @@
import newCompletedTasks from './new-completed-tasks/index.js';
import newTaskLists from './new-task-lists/index.js';
import newTasks from './new-tasks/index.js';
export default [newCompletedTasks, newTaskLists, newTasks];

View File

@@ -0,0 +1,59 @@
import defineTrigger from '../../../../helpers/define-trigger.js';
export default defineTrigger({
name: 'New completed tasks',
key: 'newCompletedTasks',
pollInterval: 15,
description: 'Triggers when a task is finished within a specified task list.',
arguments: [
{
label: 'Task List',
key: 'taskListId',
type: 'dropdown',
required: true,
description: '',
variables: true,
source: {
type: 'query',
name: 'getDynamicData',
arguments: [
{
name: 'key',
value: 'listTaskLists',
},
],
},
},
],
async run($) {
const taskListId = $.step.parameters.taskListId;
const params = {
maxResults: 100,
showCompleted: true,
showHidden: true,
pageToken: undefined,
};
do {
const { data } = await $.http.get(`/tasks/v1/lists/${taskListId}/tasks`, {
params,
});
params.pageToken = data.nextPageToken;
if (data.items?.length) {
for (const task of data.items) {
if (task.status === 'completed') {
$.pushTriggerItem({
raw: task,
meta: {
internalId: task.id,
},
});
}
}
}
} while (params.pageToken);
},
});

View File

@@ -0,0 +1,31 @@
import defineTrigger from '../../../../helpers/define-trigger.js';
export default defineTrigger({
name: 'New task lists',
key: 'newTaskLists',
pollInterval: 15,
description: 'Triggers when a new task list is created.',
async run($) {
const params = {
maxResults: 100,
pageToken: undefined,
};
do {
const { data } = await $.http.get('/tasks/v1/users/@me/lists');
params.pageToken = data.nextPageToken;
if (data.items?.length) {
for (const taskList of data.items.reverse()) {
$.pushTriggerItem({
raw: taskList,
meta: {
internalId: taskList.id,
},
});
}
}
} while (params.pageToken);
},
});

View File

@@ -0,0 +1,53 @@
import defineTrigger from '../../../../helpers/define-trigger.js';
export default defineTrigger({
name: 'New tasks',
key: 'newTasks',
pollInterval: 15,
description: 'Triggers when a new task is created.',
arguments: [
{
label: 'Task List',
key: 'taskListId',
type: 'dropdown',
required: true,
description: '',
variables: true,
source: {
type: 'query',
name: 'getDynamicData',
arguments: [
{
name: 'key',
value: 'listTaskLists',
},
],
},
},
],
async run($) {
const taskListId = $.step.parameters.taskListId;
const params = {
maxResults: 100,
pageToken: undefined,
};
do {
const { data } = await $.http.get(`/tasks/v1/lists/${taskListId}/tasks`);
params.pageToken = data.nextPageToken;
if (data.items?.length) {
for (const task of data.items) {
$.pushTriggerItem({
raw: task,
meta: {
internalId: task.id,
},
});
}
}
} while (params.pageToken);
},
});

View File

@@ -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],

View File

@@ -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');
} }

View File

@@ -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: '',

View File

@@ -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',

View File

@@ -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],

View File

@@ -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',

View File

@@ -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],

View File

@@ -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],

View File

@@ -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',

View File

@@ -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: '',

View File

@@ -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],

View File

@@ -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',

View File

@@ -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,
]; ];

View File

@@ -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;
},
};

View File

@@ -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],

View File

@@ -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',

View File

@@ -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: '',

View File

@@ -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,

View File

@@ -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],

View File

@@ -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',

View File

@@ -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: '',

Some files were not shown because too many files have changed in this diff Show More