Compare commits

...

628 Commits

Author SHA1 Message Date
Jakub P.
53d95366e9 test: use new alert in create role and create user tests 2024-12-12 10:56:14 +00:00
kasia.oczkowska
7a8dc68592 feat: introduce inline error messages for create user and create role forms 2024-12-12 10:56:14 +00:00
Ömer Faruk Aydın
978ceaadb6 Merge pull request #2238 from automatisch/workers-refactoring
refactor: Workers and queues and eliminate redundant process listeners
2024-12-11 14:57:51 +03:00
Faruk AYDIN
770b07179f refactor: Workers and queues and eliminate redundant process listeners 2024-12-11 12:53:24 +01:00
Ömer Faruk Aydın
6d15167ad9 Merge pull request #2243 from automatisch/fix-tests
Fix failing API endpoint tests
2024-12-11 14:52:34 +03:00
Faruk AYDIN
39cba6bc74 test: Fix tests for create dynamic data and fields endpoints 2024-12-11 12:45:50 +01:00
Faruk AYDIN
9558e66abf test: Fix tests for get apps connection 2024-12-11 12:27:15 +01:00
Ömer Faruk Aydın
ff7908955e Merge pull request #2239 from automatisch/fix-flaky-user-tests
test(user): use relative future dates
2024-12-11 14:06:33 +03:00
Ali BARIN
26b095b835 test(user): use relative future dates 2024-12-05 11:46:38 +00:00
Ömer Faruk Aydın
feba2a32f9 Merge pull request #2235 from automatisch/rearrange-user-tests
refactor: Reorder user model tests
2024-11-28 15:57:10 +03:00
Ömer Faruk Aydın
5090ece9b6 Merge pull request #2234 from automatisch/saml-auth-provider-tests
SamlAuthProvider model tests
2024-11-28 15:56:59 +03:00
Faruk AYDIN
221b19586e refactor: Reorder user model tests 2024-11-28 15:39:12 +03:00
Faruk AYDIN
3346c14255 refactor: Remove redundant test case after removing transaction 2024-11-28 15:30:32 +03:00
Faruk AYDIN
6e97e023c9 test: Add tests for updateRoleMappings method for saml auth provider 2024-11-27 17:19:24 +03:00
Faruk AYDIN
b26e2ecf2e test: Add tests for terminateRemoteSession method 2024-11-27 17:04:37 +03:00
Faruk AYDIN
d896238f23 test: Implement generateLogoutRequestBody test for saml auth provider model 2024-11-27 16:59:49 +03:00
Faruk AYDIN
d2c8f5a75c test: Add test for config method of saml auth providers 2024-11-27 16:47:50 +03:00
Ali BARIN
ce430d238c Merge pull request #2231 from automatisch/aut-1373
chore(migrations): rename saml_auth_providers_role_mappings table as role_mappings
2024-11-27 12:25:51 +01:00
Ali BARIN
ee397441ed refactor: update RoleMapping references 2024-11-25 15:13:14 +00:00
Ali BARIN
ba82d986c1 chore(migrations): rename saml_auth_providers_role_mappings table as role_mappings 2024-11-25 15:03:26 +00:00
Ömer Faruk Aydın
2361cb521e Merge pull request #2224 from automatisch/test-coverage
chore: add test coverage
2024-11-25 14:49:46 +03:00
Ömer Faruk Aydın
05f8d95281 Merge pull request #2220 from automatisch/aut-1350-after-hooks
test(user): write tests for $afterInsert and $afterFind
2024-11-25 14:48:58 +03:00
Ali BARIN
6c60b1c263 test(user): write tests for $afterInsert and $afterFind 2024-11-25 14:45:18 +03:00
Ömer Faruk Aydın
0c32a0693c Merge pull request #2219 from automatisch/aut-1350-beforeHooks
test(user): write tests for $beforeInsert and $beforeUpdate
2024-11-25 14:42:05 +03:00
Ali BARIN
807faa3c93 test(user): write tests for $beforeInsert and $beforeUpdate 2024-11-25 14:38:32 +03:00
Ömer Faruk Aydın
fb53e37f7a Merge pull request #2217 from automatisch/aut-1350-ability-and-can
test(user): write tests for ability and can
2024-11-25 14:23:57 +03:00
Ali BARIN
4ffdf98e16 test(user): write tests for ability and can 2024-11-25 14:17:44 +03:00
Ömer Faruk Aydın
b8da721e39 Merge pull request #2216 from automatisch/aut-1350-registerUser
test(user): write tests for registerUser
2024-11-25 13:01:55 +03:00
Ali BARIN
db8b98ca16 test(user): write tests for registerUser 2024-11-25 12:56:17 +03:00
Ömer Faruk Aydın
01b8c600fe Merge pull request #2229 from automatisch/playwright-main
chore: Do not run e2e tests in pull requests
2024-11-25 12:54:46 +03:00
Ömer Faruk Aydın
69bd5549a2 Merge pull request #2215 from automatisch/aut-1350-createAdmin
test(user): write test for createAdmin
2024-11-25 12:53:05 +03:00
Faruk AYDIN
bc631e3931 chore: Do not run e2e tests in pull requests 2024-11-25 12:50:59 +03:00
Ali BARIN
8ca4bc5a33 test(user): write test for createAdmin 2024-11-25 12:43:45 +03:00
Ömer Faruk Aydın
58a569afb0 Merge pull request #2214 from automatisch/aut-1350-getInvoices
test(user): write tests for getInvoices
2024-11-25 12:41:10 +03:00
Ali BARIN
db718d6fc3 test(user): write tests for getInvoices 2024-11-25 12:32:07 +03:00
Ömer Faruk Aydın
ca9cb8b07b Merge pull request #2213 from automatisch/aut-1350-getPlanAndUsage
test(user): write tests for getPlanAndUsage
2024-11-25 12:27:55 +03:00
Ali BARIN
ef14586412 test(user): write tests for getPlanAndUsage 2024-11-25 12:19:40 +03:00
Ali BARIN
09335fcd79 chore: add test coverage 2024-11-25 09:01:05 +00:00
Ömer Faruk Aydın
15f1fca6fe Merge pull request #2205 from automatisch/aut-1350-withinLimits
test(user): write tests for withinLimits
2024-11-22 15:40:21 +03:00
Ali BARIN
a570b8eb7a test(user): write tests for withinLimits 2024-11-22 15:31:19 +03:00
Ömer Faruk Aydın
02e2735b7a Merge pull request #2204 from automatisch/aut-1350-hasActiveSubscription
test(user): write tests for hasActiveSubscription
2024-11-22 15:29:10 +03:00
Ali BARIN
54fa347142 test(user): write tests for hasActiveSubscription 2024-11-22 15:21:10 +03:00
Ömer Faruk Aydın
0c752beace Merge pull request #2203 from automatisch/aut-1350-inTrial
test(user): write tests for inTrial
2024-11-22 15:19:00 +03:00
Ali BARIN
c14f808d29 test(user): write tests for inTrial 2024-11-22 15:10:13 +03:00
Ali BARIN
ad71173671 Merge pull request #2223 from automatisch/AUT-1365
feat: introduce inline error messages for ForgotPassword and ResetPasswordForm
2024-11-22 11:36:56 +01:00
Ömer Faruk Aydın
204325ef44 Merge pull request #2200 from automatisch/aut-1350-isAllowedToRunFlows
test(user): write tests for isAllowedToRunFlows
2024-11-22 10:32:03 +03:00
Ali BARIN
7ce6117659 test(user): write tests for isAllowedToRunFlows 2024-11-22 10:02:05 +03:00
Ömer Faruk Aydın
823a2c8b73 Merge pull request #2199 from automatisch/aut-1350-startTrialPeriod
test(user): write test for startTrialPeriod
2024-11-21 17:52:42 +03:00
Ali BARIN
741866e742 test(user): use luxon DateTime with zone over Date 2024-11-21 17:42:42 +03:00
Ali BARIN
41622678b0 test(user): write test for startTrialPeriod 2024-11-21 17:42:40 +03:00
Ömer Faruk Aydın
449b953401 Merge pull request #2198 from automatisch/aut-1350-generateHash
test(user): write tests for generateHash
2024-11-21 17:41:06 +03:00
kasia.oczkowska
551548400f refactor: use non-asyc version of mutate 2024-11-21 14:34:11 +00:00
Ali BARIN
6345ce5195 test(user): write tests for generateHash 2024-11-21 17:29:13 +03:00
Ömer Faruk Aydın
95651f6163 Merge pull request #2197 from automatisch/aut-1350-isInvitationTokenValid
test(user): write tests for isInvitationTokenValid
2024-11-21 17:23:10 +03:00
Ali BARIN
b02c1545b7 test(user): use luxon DateTime with zone over Date 2024-11-21 17:15:00 +03:00
Ali BARIN
2deaab9b24 test(user): write tests for isInvitationTokenValid 2024-11-21 17:14:56 +03:00
Ömer Faruk Aydın
f0d4853533 Merge pull request #2188 from automatisch/aut-1350-sendInvitationEmail
test(user): write test for sendInvitationEmail
2024-11-21 16:46:35 +03:00
Ali BARIN
af81ae812f Merge pull request #2222 from automatisch/fix-devcontainer
fix(devcontainer): remove yarn workspaces
2024-11-21 14:44:40 +01:00
Ali BARIN
bae76064e5 test(user): use luxon DateTime with zone over Date 2024-11-21 13:33:30 +00:00
Ali BARIN
07d9198cc8 test(user): write test for sendInvitationEmail 2024-11-21 13:31:41 +00:00
Ömer Faruk Aydın
a2e07ea2f7 Merge pull request #2187 from automatisch/aut-1350-isResetPasswordTokenValid
test(user): write test cases for isResetPasswordTokenValid
2024-11-21 16:29:50 +03:00
Ali BARIN
864c762fe2 test(user): use luxon DateTime with zone over Date 2024-11-21 12:49:33 +00:00
Ali BARIN
167bb4e8a0 test(user): write test cases for isResetPasswordTokenValid 2024-11-21 12:34:08 +00:00
Ömer Faruk Aydın
4cf64ede74 Merge pull request #2185 from automatisch/aut-1350-sendResetPasswordEmail
test(user): write test for sendResetPasswordEmail
2024-11-21 14:57:42 +03:00
Ali BARIN
bb309fea6f test(user): write test for sendResetPasswordEmail 2024-11-21 14:47:18 +03:00
kasia.oczkowska
90a7b4c1c0 feat: introduce inline error messages for ForgotPassword and ResetPasswordForm 2024-11-21 11:43:00 +00:00
Ömer Faruk Aydın
1133362028 Merge pull request #2184 from automatisch/aut-1350-softRemove
test(user): write test for softRemove
2024-11-21 14:34:53 +03:00
Ali BARIN
eb9226bd4a test(user): write test for softRemove 2024-11-21 14:23:29 +03:00
Ömer Faruk Aydın
a9abdcc37e Merge pull request #2212 from automatisch/remove-lerna
Remove lerna and yarn workspaces
2024-11-21 13:51:57 +03:00
Ali BARIN
6ace93bdbf fix(devcontainer): remove yarn workspaces 2024-11-21 10:17:43 +00:00
Faruk AYDIN
b89197939a docs: Adjust development setup page for new package setup 2024-11-21 12:40:31 +03:00
Faruk AYDIN
da788106af feat: Add separate gitignore file for docs package 2024-11-21 12:40:25 +03:00
Faruk AYDIN
49e92e6f1d fix: Adjust build web CI job to use cache dependency path 2024-11-19 20:50:15 +03:00
Faruk AYDIN
a6c3276104 chore: Remove root package.json file 2024-11-19 20:46:13 +03:00
Faruk AYDIN
6388bfc714 docs: Adjust repository structure page to reflect individual packages 2024-11-19 20:37:08 +03:00
Faruk AYDIN
bebc3b181d chore: Remove lerna debug file from .gitignore 2024-11-19 20:36:48 +03:00
Faruk AYDIN
5a6d561c1a refactor: Adjust dockerfile to work without lerna 2024-11-19 18:31:39 +03:00
Faruk AYDIN
5ba575fdfd fix: Add knex individually to e2e-tests package 2024-11-19 16:04:21 +03:00
Faruk AYDIN
dcf8bbd804 chore: Add axios package to e2e-tests package 2024-11-19 15:56:10 +03:00
Faruk AYDIN
ff93ffd0b1 fix: Adjust e2e-tests CI job working directories 2024-11-19 15:49:25 +03:00
Faruk AYDIN
395c09df92 fix: Use named ClickAwayListener import statement for web 2024-11-19 15:41:59 +03:00
Faruk AYDIN
4c903cd08b fix: Adjust backend start server CI job working directory 2024-11-19 15:36:01 +03:00
Faruk AYDIN
64cb98717c fix: Adjust backend start worker CI job working directory 2024-11-19 15:35:21 +03:00
Faruk AYDIN
b0e4ce54fb fix: Add fakerjs individually to backend package 2024-11-19 15:29:36 +03:00
Faruk AYDIN
d67a37002f fix: Use working directory for backend tests CI job 2024-11-19 15:24:40 +03:00
Faruk AYDIN
965ff8bc3f fix: Add axios individually to web package 2024-11-19 15:20:35 +03:00
Faruk AYDIN
400a495ad2 chore: Remove cache dependency path for build web CI job 2024-11-19 15:14:06 +03:00
Faruk AYDIN
09d0822a8d fix: Adjust working directory for build-web CI job 2024-11-19 15:09:46 +03:00
Faruk AYDIN
7016c20ccc fix: Change working directory for linter CI job 2024-11-19 15:03:54 +03:00
Faruk AYDIN
df54895805 fix: Linter command to work without workspaces 2024-11-19 15:00:23 +03:00
Faruk AYDIN
62d5e6fe51 chore: Remove root package dev dependencies 2024-11-19 14:57:39 +03:00
Faruk AYDIN
4615a0b7ea chore: Remove workspaces from root package.json file 2024-11-19 14:51:53 +03:00
Faruk AYDIN
280d603b14 chore: Remove lerna.json file 2024-11-18 20:21:20 +03:00
Faruk AYDIN
36271f0749 refactor: Explicitly state different packages for lerna 2024-11-18 20:16:20 +03:00
Ali BARIN
579638f932 Merge pull request #2210 from automatisch/release/v0.14.0
Update version to 0.14.0
2024-11-18 17:32:18 +01:00
Faruk AYDIN
48871c82a6 Update version to 0.14.0 2024-11-18 15:43:23 +00:00
Ali BARIN
14056c42ef Merge pull request #2211 from automatisch/upgrade-lerna
chore(deps): upgrade lerna with version 8
2024-11-18 16:42:08 +01:00
Ali BARIN
90fe1576de chore(lerna): remove bootstrap command usages 2024-11-18 15:00:49 +00:00
Ali BARIN
d61cf13985 chore(deps): upgrade lerna with version 8 2024-11-18 14:47:54 +00:00
Ali BARIN
dfe6dfd0c6 Merge pull request #2196 from automatisch/AUT-1364
feat: inline login form error and unify Alert font weight
2024-11-18 11:08:58 +01:00
Ali BARIN
c138c7d0e9 Merge pull request #2190 from automatisch/AUT-1347
feat: persist pagination and search value on flows page
2024-11-18 11:07:34 +01:00
Ali BARIN
d542be947e Merge pull request #2186 from automatisch/test-saml-auth-provider
test: Implement tests for saml auth provider url methods
2024-11-15 14:45:46 +01:00
kasia.oczkowska
c76366e72e feat: introduce improvements 2024-11-15 10:37:18 +00:00
kasia.oczkowska
75abfda783 feat: inline login form error and unify Alert font weight 2024-11-14 14:10:07 +00:00
Ali BARIN
f3d8d7d4ad Merge pull request #2191 from automatisch/AUT-1280
feat: make Wordpress instanceUrl field required
2024-11-14 12:31:43 +01:00
Ömer Faruk Aydın
7255eccb22 Merge pull request #2183 from automatisch/aut-1350-updatePassword
test(user): write tests for updatePassword
2024-11-13 19:31:28 +01:00
Ali BARIN
a0decb70cc test(user): write tests for updatePassword 2024-11-13 19:22:04 +01:00
kasia.oczkowska
532f562495 feat: make Wordpress instanceUrl field required 2024-11-13 14:32:16 +00:00
kasia.oczkowska
27e58ae925 feat: persist pagination and search value on flows page 2024-11-13 13:44:05 +00:00
Ali BARIN
abf30dfc1a Merge pull request #2167 from automatisch/AUT-1152
fix: variable chip label disappearing
2024-11-12 13:18:22 +01:00
Ali BARIN
218b8ce86e Merge pull request #2143 from automatisch/AUT-1325
feat: introduce uniqueness validation for remote role name
2024-11-12 13:18:07 +01:00
Faruk AYDIN
4867ffcb4b test: Implement tests for saml auth provider url methods 2024-11-12 13:12:00 +01:00
Ömer Faruk Aydın
e34c3b411d Merge pull request #2182 from automatisch/aut-1350-acceptInvitation
test(user): write test for acceptInvitation
2024-11-12 13:03:32 +01:00
Ali BARIN
c91b8be1a6 test(user): write test for acceptInvitation 2024-11-12 12:54:10 +01:00
Ömer Faruk Aydın
9cb41644a1 Merge pull request #2181 from automatisch/aut-1350-resetPassword
test(user): write test for resetPassword
2024-11-12 12:47:43 +01:00
Ali BARIN
8c01cea147 test(user): write test for resetPassword 2024-11-12 12:39:19 +01:00
Ömer Faruk Aydın
58eb55e90a Merge pull request #2180 from automatisch/aut-1350-generateInvitationToken
test(user): write test for generateInvitationToken
2024-11-12 12:37:31 +01:00
Ali BARIN
bb05e82e15 test(user): write test for generateInvitationToken 2024-11-12 12:18:28 +01:00
Ömer Faruk Aydın
5ab95ea175 Merge pull request #2179 from automatisch/aut-1350-generateResetPasswordToken
test(user): write test for generateResetPasswordToken
2024-11-12 12:16:42 +01:00
Ali BARIN
a25c4f1d1e test(user): write test for generateResetPasswordToken 2024-11-12 12:08:42 +01:00
Ömer Faruk Aydın
15287de8af Merge pull request #2178 from automatisch/aut-1350-login
test(user): write tests for login
2024-11-12 12:04:55 +01:00
Ali BARIN
49b4d6b511 test(user): write tests for login 2024-11-12 09:14:17 +00:00
Ömer Faruk Aydın
d5b4a5d4ac Merge pull request #2170 from automatisch/aut-1350-1
test(user): write tests for authorizedFlows
2024-11-11 18:16:03 +01:00
Ali BARIN
de480b491c test(user): write tests for authorizedExecutions 2024-11-11 18:06:59 +01:00
Ali BARIN
a949fda1fc test(user): write tests for authorizedConnections 2024-11-11 18:06:59 +01:00
Ali BARIN
3e28af670c test(user): write tests for authorizedSteps 2024-11-11 18:06:59 +01:00
Faruk AYDIN
b5310afb90 refactor: Use single quote for user can method error 2024-11-11 18:06:59 +01:00
Ali BARIN
da81ecf915 feat(user): add not authorized error message in permission check 2024-11-11 18:06:59 +01:00
Ali BARIN
f597066d16 test(user): write tests for authorizedFlows 2024-11-11 18:06:57 +01:00
Ömer Faruk Aydın
ec30606b24 Merge pull request #2177 from automatisch/aut-1350-authenticate
test(user): write tests for authenticate
2024-11-11 18:05:06 +01:00
Ali BARIN
20dce14f17 test(user): write tests for authenticate 2024-11-11 17:56:35 +01:00
Ömer Faruk Aydın
821742de85 Merge pull request #2176 from automatisch/aut-1350-acceptInvitationUrl
test(user): write test for acceptInvitationUrl
2024-11-11 17:55:23 +01:00
Ali BARIN
74dc108f62 test(user): write test for acceptInvitationUrl 2024-11-11 10:22:58 +00:00
Ali BARIN
a05fe856bb Merge pull request #2169 from automatisch/saml-auth-provider-test
test: Implement initial tests for SamlAuthProvider model
2024-11-08 13:04:09 +01:00
Ali BARIN
d13f51a32d Merge pull request #2168 from automatisch/aut-1350
test(user): write tests for tableName, jsonSchema, relationMappings
2024-11-08 13:01:02 +01:00
Faruk AYDIN
3dbe599cb3 test: Implement initial tests for SamlAuthProvider model 2024-11-08 12:55:37 +01:00
Ali BARIN
cf966dd83c test(user): write tests for tableName, jsonSchema, relationMappings 2024-11-08 11:52:50 +00:00
Ömer Faruk Aydın
4e62f3654f Merge pull request #2166 from automatisch/aut-1349-7
test(step): write test for updateFor method in model
2024-11-08 12:42:15 +01:00
Ali BARIN
970d926563 test(step): write test for updateFor method in model 2024-11-08 11:34:04 +00:00
Ali BARIN
ff49c747ba Merge pull request #2124 from automatisch/AUT-1232
fix: use correct default values when editing a role
2024-11-08 12:24:31 +01:00
kasia.oczkowska
c46b8a5f4f refactor: remove unnecessary prop types 2024-11-08 11:11:07 +00:00
kasia.oczkowska
485324e204 feat: improve syncing isCreator value 2024-11-08 10:01:49 +00:00
kasia.oczkowska
4696a03db1 feat: sync isCreator value when editing role settings 2024-11-08 10:01:49 +00:00
kasia.oczkowska
7885de36a9 fix: add isCreator role by default when creating new role 2024-11-08 10:01:49 +00:00
Ali BARIN
fac4339207 Merge pull request #2151 from automatisch/AUT-1167
feat: check if cancellationEffectiveDateObject is a valid date
2024-11-08 10:53:23 +01:00
Ali BARIN
9c70519021 Merge pull request #2152 from automatisch/AUT-1168
feat: introduce fallback for title value in the BillingCard
2024-11-08 10:53:02 +01:00
kasia.oczkowska
9ae77ecd5d fix: variable chip label disappearing 2024-11-08 08:20:33 +00:00
Ali BARIN
1c8e6f278d Merge pull request #2164 from automatisch/aut-1349-6
test(step): write tests for getSetupFields and delete
2024-11-06 14:08:26 +01:00
Ali BARIN
c0a190a9f2 test(step): write tests for getSetupFields and delete 2024-11-06 12:57:17 +00:00
Ali BARIN
e29e2a62f0 Merge pull request #2165 from automatisch/aut-1349-hooks
test(step): write tests for lifecycle hooks in model
2024-11-06 13:53:25 +01:00
Ali BARIN
1580640a35 test(step): write tests for lifecycle hooks in model 2024-11-06 12:45:18 +00:00
Ömer Faruk Aydın
33c84b7fcc Merge pull request #2163 from automatisch/aut-1349-5
test(step): write tests for getTriggerCommand and getActionCommand
2024-11-06 12:30:45 +01:00
Faruk AYDIN
9773ce75b0 fix: Typo for the step test description 2024-11-06 12:20:49 +01:00
Ali BARIN
c310e8d152 test(step): write tests for getTriggerCommand and getActionCommand 2024-11-06 08:45:24 +00:00
Ömer Faruk Aydın
af251c7b81 Merge pull request #2162 from automatisch/aut-1349-4
test(step): write tests for getApp, test, getLastExecutionStep and getNextStep
2024-11-05 13:19:48 +01:00
Faruk AYDIN
122483de0c refactor: Rename test method description for tests 2024-11-05 13:01:42 +01:00
Ali BARIN
42c2131144 test(step): write tests for getApp, test, getLastExecutionStep and getNextStep 2024-11-04 14:18:37 +00:00
Ömer Faruk Aydın
71bc7a62c2 Merge pull request #2161 from automatisch/aut-1349-3
test(step): write tests for isTrigger, isAction, getWebhookUrl
2024-11-04 15:11:00 +01:00
Ali BARIN
87bfff07db test(step): write tests for isTrigger, isAction, getWebhookUrl 2024-11-04 12:43:24 +00:00
Ömer Faruk Aydın
1cb5b780d2 Merge pull request #2160 from automatisch/aut-1349-2
test(step): write tests for webhookUrl and iconUrl
2024-11-04 13:28:25 +01:00
Ömer Faruk Aydın
2f6acd4d6e Merge pull request #2159 from automatisch/aut-1349
test(step): cover tableName, jsonSchema, virtualAttributes, relationMappings in model
2024-11-04 13:27:40 +01:00
Ömer Faruk Aydın
c2e2351505 Merge pull request #2158 from automatisch/aut-1338-isPaused
test(flow): write test cases for isPaused method
2024-11-04 13:26:40 +01:00
Ali BARIN
d847b5480b Merge pull request #2156 from automatisch/aut-1338-delete
refactor(flow): split delete method and write test
2024-11-01 15:41:52 +01:00
Ali BARIN
32749ee58e test(step): write tests for webhookUrl and iconUrl 2024-11-01 14:32:38 +00:00
Ali BARIN
a531b8b5fe test(step): cover tableName, jsonSchema, virtualAttributes, relationMappings in model 2024-11-01 15:29:35 +01:00
Ali BARIN
148a0c5bb0 test(flow): write test cases for isPaused method 2024-11-01 15:29:17 +01:00
Ali BARIN
39f9a58200 refactor(flow): split delete method and write test 2024-11-01 14:27:19 +00:00
Ömer Faruk Aydın
edd113d344 Merge pull request #2153 from automatisch/aut-1338-createActionStep
refactor(flow): distribute createActionStep logic to different methods in model
2024-11-01 15:03:58 +01:00
Faruk AYDIN
c641e8729b refactor: Rename createActionStepAfterStepId as createAfterStep for flow 2024-11-01 14:24:07 +01:00
Faruk AYDIN
2c4b13e4b5 refactor: Start updateStepPositionsFrom test from step position 2 2024-11-01 14:17:46 +01:00
Faruk AYDIN
48fcf4dda7 refactor: Rename alignStepsPositionsAsOfPosition as updateStepPositionsFrom for flow 2024-11-01 14:16:13 +01:00
Ömer Faruk Aydın
acfd980d4f Merge pull request #2150 from automatisch/aut-1338-after-find
refactor(flow): restructure afterFind hook in model
2024-10-31 16:12:08 +01:00
Ömer Faruk Aydın
db9bfab812 Merge pull request #2149 from automatisch/aut-1338-3
test(flow): write tests for model lifecycle hooks
2024-10-31 16:04:37 +01:00
Ali BARIN
d32820ee09 refactor(flow): distribute createActionStep logic to different methods in model 2024-10-31 10:19:26 +01:00
Ali BARIN
0f823fd19e refactor(flow): restructure afterFind hook in model 2024-10-31 10:19:09 +01:00
Ali BARIN
4308ed5850 test(flow): write tests for model lifecycle hooks 2024-10-31 10:18:56 +01:00
Ali BARIN
b9cd7c3983 Merge pull request #2148 from automatisch/aut-1338-2
test(flow): write model tests
2024-10-31 10:18:42 +01:00
Ömer Faruk Aydın
fa607aa961 Merge pull request #2154 from automatisch/update-saml-auth-providers-role-mapping-test-snapshot
chore(saml-auth-providers-role-mapping): remove unused test snapshot
2024-10-30 15:05:19 +01:00
Ali BARIN
6900b71841 test(flow): write model tests 2024-10-30 13:56:47 +00:00
Ömer Faruk Aydın
bb230d67e8 Merge pull request #2139 from automatisch/aut-1338
test(flow): write model tests
2024-10-30 14:55:21 +01:00
Faruk AYDIN
4f076ec3e3 refactor: Use static IncompleteStepsError from flow before update hook 2024-10-30 14:42:30 +01:00
Faruk AYDIN
96a6cbfb95 refactor: Add empty lines to improve readibility for flow tests 2024-10-30 14:39:06 +01:00
Faruk AYDIN
5bdc5aed72 refactor: Use static method for IncompleteStepsError 2024-10-30 14:39:06 +01:00
Faruk AYDIN
d38b0f088b test: Add multiple executions explicitly for last internal id test 2024-10-30 14:39:06 +01:00
Faruk AYDIN
892710f705 chore: Add empty lines for flow test to improve readability 2024-10-30 14:39:06 +01:00
Ali BARIN
fbf898be64 test(flow): write model tests 2024-10-30 14:39:06 +01:00
Ali BARIN
e3e2ecc1e1 chore(saml-auth-providers-role-mapping): remove unused test snapshot 2024-10-30 13:05:52 +00:00
kasia.oczkowska
b59807d221 feat: introduce fallback for title value in the BillingCard 2024-10-30 12:45:24 +00:00
kasia.oczkowska
163ad52285 feat: check if cancellationEffectiveDateObject is a valid date 2024-10-30 10:35:55 +00:00
Ömer Faruk Aydın
4023a6d1cc Merge pull request #2146 from automatisch/aut-1332-new-2
test(role): write remaining model tests
2024-10-29 17:45:45 +01:00
Ömer Faruk Aydın
ec827e5dc0 Merge pull request #2145 from automatisch/aut-1332-new
test(role): write model tests
2024-10-28 16:24:35 +01:00
Ali BARIN
a8f4fb7c22 test(role): write remaining model tests 2024-10-28 14:05:07 +00:00
Ali BARIN
bc195ed452 test(role): write model tests 2024-10-28 13:50:32 +00:00
Ali BARIN
41568904ab Merge pull request #2142 from automatisch/refactor-tests
refactor: Use toStrictEqual instead of toEqual for tests
2024-10-28 08:49:34 +01:00
kasia.oczkowska
79050af391 feat: introduce uniqueness validation for remote role name 2024-10-25 15:44:28 +01:00
Faruk AYDIN
2e5b44c424 refactor: Use toStrictEqual instead of toEqual for tests 2024-10-25 12:33:39 +02:00
Faruk AYDIN
7a437660d1 refactor: Remove id column from app config serializer 2024-10-25 11:47:41 +02:00
Ömer Faruk Aydın
47510e24d5 Merge pull request #2110 from automatisch/aut-1293
test(app-config): write model tests
2024-10-25 01:18:26 +02:00
Faruk AYDIN
91c9ef3068 fix: Pass app config parameters to be used for hooks 2024-10-25 01:07:44 +02:00
Faruk AYDIN
240854e4ac fix: Use uuid for down migration of app config id removal 2024-10-25 00:59:00 +02:00
Jakub P.
0e4fc7efbc fix: use key instead of id in appConfig 2024-10-24 19:42:54 +02:00
Faruk AYDIN
b47e859225 test: Add additional cases for triggerAppConfigUpdate method 2024-10-24 17:10:47 +02:00
Faruk AYDIN
62a1072682 fix: Use triggerAppConfigUpdate spy instead of 2024-10-24 17:07:23 +02:00
Faruk AYDIN
c6f2a97591 test: Add missing associations test for app auth client 2024-10-24 17:04:45 +02:00
Faruk AYDIN
d66be231b3 refactor: Remove redundant updateConnectionAllowedProperty 2024-10-24 17:00:47 +02:00
Faruk AYDIN
f73ffc8711 test: Add idColumn test to app config model 2024-10-24 16:59:17 +02:00
Faruk AYDIN
e4c17c1bc7 refactor: Use belongsTo relation for app config association 2024-10-24 16:59:17 +02:00
Faruk AYDIN
997e729535 refactor: Use hooks with refetched record for app config 2024-10-24 16:59:17 +02:00
Faruk AYDIN
e0e313b8d1 refactor: Remove id from app config factory 2024-10-24 16:59:17 +02:00
Faruk AYDIN
f0bd763e72 feat: Remove id field from app config model 2024-10-24 16:59:17 +02:00
Faruk AYDIN
6a7a90536b feat: Make key field primary key for app config model 2024-10-24 16:59:17 +02:00
Ali BARIN
ac8ddedfb5 test(connection): use new properties from app-config 2024-10-24 16:59:17 +02:00
Ali BARIN
6fcd126ff8 test(app-auth-client): cover lifecycle hooks and triggerAppConfigUpdate method 2024-10-24 16:59:17 +02:00
Faruk AYDIN
55d0966d48 fix: Pass app key while triggering app config update 2024-10-24 16:59:17 +02:00
Faruk AYDIN
2583e08f7a fix: Don't compute connectionAllowed column twice 2024-10-24 16:59:17 +02:00
Faruk AYDIN
de72e62470 fix: Pass app config key to fix associations 2024-10-24 16:59:17 +02:00
Faruk AYDIN
91993dbb07 refactor: AppConfig model and corresponding tests 2024-10-24 16:59:17 +02:00
Faruk AYDIN
d87ee4daa3 refactor: Move and adjust getApp tests for app config model 2024-10-24 16:59:17 +02:00
Ali BARIN
6791e002ff test(app-config): remove redundant virtual attributes test case 2024-10-24 16:59:17 +02:00
Ali BARIN
4ca84aa515 refactor(app-auth-client): remove redundant column selection 2024-10-24 16:59:17 +02:00
Ali BARIN
8189cbc171 fix(app-config): use correct case in connection_allowed 2024-10-24 16:59:17 +02:00
Ali BARIN
73edb45ff7 refactor(app-config): rename allowCustomConnection as customConnectionAllowed 2024-10-24 16:59:17 +02:00
Ali BARIN
0bbe362660 refactor(app-config): rename allow_custom_connection as custom_connection_allowed 2024-10-24 16:59:17 +02:00
Ali BARIN
a76bee51fc refactor(app-config): remove canCustomConnect virtual attribute 2024-10-24 16:59:17 +02:00
Ali BARIN
6e42b52414 refactor(app-config): rename canConnect as connectionAllowed 2024-10-24 16:59:17 +02:00
Ali BARIN
aed61209fa feat(app-config): update canConnect upon dependent changes 2024-10-24 16:59:17 +02:00
Ali BARIN
f5d796ea77 feat(app-config): persist relational virtual attrs 2024-10-24 16:59:17 +02:00
Ali BARIN
ecb04b4ba9 test(app-config): write model tests 2024-10-24 16:59:17 +02:00
Ali BARIN
dabb01e237 Merge pull request #2127 from automatisch/AUT-1231
feat: add error snackbar when creating or updating saml auth provider
2024-10-22 12:13:05 +02:00
Ali BARIN
c2d27d0fd4 Merge pull request #2136 from automatisch/aut-1322
test(connection): write remaining model tests
2024-10-21 17:41:31 +02:00
Ali BARIN
e62bd75fdf Merge pull request #2122 from automatisch/AUT-1239
feat: add error snackbar for updating role mappings
2024-10-21 16:44:24 +02:00
Ali BARIN
2e917bd62b Merge pull request #2120 from automatisch/AUT-1097
feat: allow both number and string values as sampleValue
2024-10-21 16:41:58 +02:00
Ali BARIN
e0492c4264 Merge pull request #2129 from automatisch/AUT-1253
feat: add error snackbar for errors originating from registerUser function
2024-10-21 16:41:31 +02:00
Ali BARIN
7db68e2f96 test(connection): write remaining model tests 2024-10-21 13:10:29 +00:00
Ömer Faruk Aydın
e9b05a37d1 Merge pull request #2135 from automatisch/aut-1322-2
test(connection): cover model lifecycle hooks
2024-10-21 12:49:49 +02:00
Ali BARIN
5613259536 test(connection): cover model lifecycle hooks 2024-10-21 12:41:57 +02:00
Ömer Faruk Aydın
3209ff16ac Merge pull request #2130 from automatisch/aut-1322
test(connection): write model tests
2024-10-21 12:41:04 +02:00
Faruk AYDIN
a49c8602d1 refactor: Remove redundant test cases for connection model 2024-10-21 12:32:46 +02:00
Ali BARIN
7caa055e00 test(connection): write model tests 2024-10-21 10:27:43 +02:00
Ömer Faruk Aydın
0d62bc6c78 Merge pull request #2134 from automatisch/permission-tests
Permission tests
2024-10-18 17:33:57 +02:00
Faruk AYDIN
bc0861fd9e test: Implement tests for permission model 2024-10-18 15:34:06 +02:00
Faruk AYDIN
f280052d93 refactor: Permission model sanitize method 2024-10-18 15:33:47 +02:00
kasia.oczkowska
21da49f79d feat: add error snackbar for errors originating from registerUser function 2024-10-18 13:41:57 +01:00
kasia.oczkowska
19a5ccf942 feat: add error snackbar when creating or updating saml auth provider 2024-10-16 14:31:05 +01:00
Ali BARIN
0234b4ad81 Merge pull request #2125 from automatisch/aut-1322
test(connection): write model tests
2024-10-16 13:23:17 +02:00
Ömer Faruk Aydın
59ee9c21f3 Merge pull request #2111 from automatisch/aut-1301
test(app): write model tests
2024-10-16 13:17:35 +02:00
Faruk AYDIN
00317fed24 refactor: Use endsWith for app folder path test 2024-10-16 12:56:17 +02:00
Ali BARIN
42f6311ca8 test(app): write model tests 2024-10-16 12:56:17 +02:00
Ali BARIN
0f77a1ec03 test(connection): write model tests 2024-10-16 09:38:48 +00:00
Ali BARIN
8268cd4d09 Merge pull request #2123 from automatisch/aut-1319
test(config): write model tests
2024-10-14 13:28:09 +02:00
Ali BARIN
c868070337 test(config): write model tests 2024-10-14 11:19:29 +00:00
kasia.oczkowska
2981fa5946 feat: add error snackbar for updating role mappings 2024-10-10 13:34:40 +01:00
Ömer Faruk Aydın
623ec66a79 Merge pull request #2121 from automatisch/usage-data-tests
test: Implement UsageData model tests
2024-10-10 13:03:09 +02:00
Faruk AYDIN
b51bae14ec test: Implement UsageData model tests 2024-10-10 12:08:41 +02:00
kasia.oczkowska
05a3016557 feat: allow both number and string values as sampleValue 2024-10-10 09:21:03 +01:00
Ömer Faruk Aydın
9250456e7b Merge pull request #2119 from automatisch/execution-step-test
tests: Implement tests for ExecutionStep model
2024-10-09 16:27:39 +02:00
Faruk AYDIN
163d6a7a28 refactor: Do not use persisted instance for execution step is failed 2024-10-09 15:43:33 +02:00
Faruk AYDIN
4ce9976dbc refactor: Use isSucceededNonTestRun naming for execution steps 2024-10-09 15:43:33 +02:00
Faruk AYDIN
f6490990de tests: Implement tests for ExecutionStep model 2024-10-09 15:43:33 +02:00
Ali BARIN
f24ff606ac Merge pull request #2113 from automatisch/AUT-1196
fix: use env var for authDocUrl
2024-10-09 15:15:09 +02:00
Jakub P.
3ff53744b5 fix: use env var for authDocUrl 2024-10-09 15:02:59 +02:00
Ali BARIN
0b33c10ed8 Merge pull request #2029 from automatisch/AUT-1190
fix: limit resetting form on defaultValues change
2024-10-09 14:54:05 +02:00
Ömer Faruk Aydın
3fa87701ed Merge pull request #2114 from automatisch/AUT-929
feat: fix primary app color value and how it is displayed in the app
2024-10-09 11:02:03 +02:00
Ali BARIN
e5e0c6fa2a Merge pull request #2117 from automatisch/aut-1191-2
fix: bring back missing custom logo
2024-10-08 21:54:12 +02:00
Jakub P.
0b38a0b6af fix: bring back missing custom logo 2024-10-08 17:56:13 +00:00
Ömer Faruk Aydın
44b228777a Merge pull request #2093 from automatisch/aut-1191
feat(config): make data structure horizontal
2024-10-08 18:15:33 +02:00
Ali BARIN
dd4f658d14 test: cover static config in config controller test 2024-10-08 14:41:02 +00:00
Ali BARIN
9c66f47bca test: write config serializer cases 2024-10-08 14:34:14 +00:00
Ali BARIN
138a34d6a4 feat(config): incorporate static config as virtual attributes 2024-10-08 14:19:17 +00:00
Ali BARIN
8f2af2e863 chore: rename horizontal config migration as make_config_single_record 2024-10-08 14:18:38 +00:00
Ali BARIN
c732fe16b3 refactor(update-config): introduce updateFirstOrInsert via query builder 2024-10-08 13:18:42 +00:00
Ali BARIN
9be75e56e7 refactor(migration): simplify make_config_horizontal_scale script 2024-10-08 13:18:42 +00:00
Ali BARIN
e7d1f26034 feat(serializers): add config serializer 2024-10-08 13:18:42 +00:00
Ali BARIN
c554fff048 feat(config): add missing schema properties 2024-10-08 13:18:42 +00:00
Ali BARIN
0268521aaa test(config): fix typo in palette primary light 2024-10-08 13:18:42 +00:00
Ali BARIN
89b1cb9353 feat(web): adapt to horizontal config structure 2024-10-08 13:18:42 +00:00
Ali BARIN
8a17c5eaab feat(config): make data structure horizontal 2024-10-08 13:18:42 +00:00
Ömer Faruk Aydın
f4a1ad6c8c Merge pull request #2109 from automatisch/aut-1292
test(app-auth-client): write model tests
2024-10-08 15:09:41 +02:00
Jakub P.
93d76d8d79 feat: add hash in color to the examples in docs 2024-10-07 16:39:51 +02:00
Ali BARIN
0b956a71b9 test(models/app-auth-client): improve decrypt data test cases 2024-10-07 13:25:04 +00:00
Faruk AYDIN
26be72f76d test: Improve encrypt data tests for AppAuthClient model 2024-10-07 14:21:14 +02:00
Ali BARIN
737391c721 test(app-auth-client): write model tests 2024-10-07 09:14:18 +00:00
kasia.oczkowska
9c1d21fd1b feat: fix primary app color value and how it is displayed in the app 2024-10-04 12:34:50 +01:00
kasia.oczkowska
ef4a4c8611 fix: limit resetting form on defaultValues change 2024-10-04 11:46:12 +01:00
Ömer Faruk Aydın
13c0a8ceaa Merge pull request #2112 from automatisch/test-subscription
test: Implement subscription model tests
2024-10-02 13:53:46 +03:00
Faruk AYDIN
c2976080f6 test: Implement subscription model tests 2024-10-02 13:44:21 +03:00
Faruk AYDIN
0a1b6931af test: Add tests for Identity model 2024-10-02 10:52:05 +03:00
Ömer Faruk Aydın
5009319f91 Merge pull request #2108 from automatisch/aut-1282
test(access-token): write model tests
2024-10-02 10:16:49 +03:00
Ali BARIN
4db8683bd6 test(access-token): write model tests 2024-10-01 10:37:43 +00:00
Ali BARIN
d35cf8d31e test: add access token factory 2024-10-01 09:55:36 +00:00
Ali BARIN
5fef16131a test: add identity factory 2024-10-01 09:55:26 +00:00
Ömer Faruk Aydın
8b2235ee26 Merge pull request #2107 from automatisch/execution-tests
test: Implement execution model tests
2024-09-30 17:33:28 +03:00
Faruk AYDIN
2d8faf849e test: Implement execution model tests 2024-09-30 17:25:15 +03:00
Ali BARIN
c9de9fa185 Merge pull request #2096 from automatisch/aut-1276
test(SamlAuthProvidersRoleMapping): assert model properties
2024-09-30 16:24:46 +02:00
Ali BARIN
0618877d58 test(models/saml-auth-providers-role-mapping): assert model properties 2024-09-30 14:14:02 +00:00
Ömer Faruk Aydın
f6b4e7eef8 Merge pull request #2095 from automatisch/datastore-tests
feat: Implement datastore model tests
2024-09-30 17:12:11 +03:00
Faruk AYDIN
7abe44da19 refactor: Use matchsnapshot for datastore tests 2024-09-30 16:43:06 +03:00
Faruk AYDIN
9006a0c25f refactor: Update required validations with custom assertion 2024-09-30 16:39:06 +03:00
Faruk AYDIN
f8389ff8ab feat: Implement datastore model tests 2024-09-30 16:39:06 +03:00
Ömer Faruk Aydın
894afe8f92 Merge pull request #2104 from automatisch/remove-gql
refactor: remove whole graphql implementation
2024-09-30 15:14:14 +03:00
Ali BARIN
115394ac8c test(helpers/authentication): bring back applicable tests 2024-09-30 12:04:58 +00:00
Ali BARIN
de42eda65f refactor(helpers/authentication): remove obsolete arguments in isAuthenticated 2024-09-30 12:04:37 +00:00
Ali BARIN
0b7591edce refactor: remove whole graphql implementation 2024-09-30 12:02:25 +00:00
Ömer Faruk Aydın
a043a044ca Merge pull request #2099 from automatisch/aut-1262
feat: use REST API endpoints to create and reconnect connections
2024-09-30 13:33:52 +03:00
Ali BARIN
b1f2727beb test(create-dynamic-data): use 422 for error response 2024-09-30 08:25:56 +00:00
Ali BARIN
d6e78a48a0 feat(AddAppConnection): show meaningful error messages only 2024-09-30 08:25:56 +00:00
Ali BARIN
589fe0f5f3 feat(useAuthenticateApp): remove redundant graphql implementation 2024-09-30 08:25:56 +00:00
Ali BARIN
244eeeb816 feat(useAuthenticateApp): centralize invalidating queries 2024-09-30 08:25:56 +00:00
kasia.oczkowska
4d5fc50f1a feat: refactor verify connection mutation with the REST API endpoint 2024-09-30 08:25:54 +00:00
Ali BARIN
dc0273148c chore: remove redundant reset connection mutation 2024-09-30 08:25:09 +00:00
Ali BARIN
5e6f4bfb88 feat(useAuthenticateApp): use REST API endpoint to reset connection 2024-09-30 08:24:03 +00:00
Ali BARIN
bc0e18d074 chore: remove redundant update connection mutation 2024-09-30 08:24:02 +00:00
Ali BARIN
24d09fda4c feat(useAuthenticateApp): use REST API endpoint to update connection 2024-09-30 08:23:29 +00:00
Ali BARIN
5e20ac07d1 chore(add-authentication-steps): remove unnecessary id arguments 2024-09-30 08:23:29 +00:00
Ali BARIN
37c78e6bbd chore: remove redundant generate auth url mutation 2024-09-30 08:23:26 +00:00
Ali BARIN
7dcfb1081b feat(useAuthenticateApp): use REST API endpoint to create auth url 2024-09-30 08:23:00 +00:00
Ali BARIN
01407cf040 Merge pull request #2106 from automatisch/AUT-1265
feat: refactor update-current-user mutation with the REST API endpoint
2024-09-30 10:11:22 +02:00
Jakub P.
eb814c2fb0 test: add reset password tests 2024-09-27 23:16:16 +02:00
kasia.oczkowska
d3caadf4af feat: refactor update-current-user mutation with the REST API endpoint 2024-09-27 13:42:58 +01:00
Ali BARIN
5769c82fca Merge pull request #2098 from automatisch/aut-1258
feat(useAuthenticateApp): use REST API endpoint to create connection
2024-09-25 10:03:57 +02:00
Ali BARIN
3754783ce2 Merge pull request #2103 from automatisch/AUT-1279
test: add change own user data test
2024-09-24 21:25:41 +02:00
Jakub P.
55ebe2cc0b test: add change own user data test 2024-09-24 18:42:30 +02:00
Ali BARIN
23c1a42163 chore: remove redundant create connection mutation 2024-09-24 08:31:26 +00:00
Ali BARIN
c879ffa768 feat(useAuthenticateApp): use REST API endpoint to create connection 2024-09-24 08:30:53 +00:00
Ali BARIN
32f7bbfbab chore: remove redundant execute flow mutation 2024-09-24 10:23:33 +02:00
Ali BARIN
84d5b3b158 feat: use REST API endpoint to test step 2024-09-24 10:23:33 +02:00
Ömer Faruk Aydın
c8dae9ea9a Merge pull request #2097 from automatisch/to-require-property
feat: Introduce toRequireProperty custom assertion
2024-09-23 16:24:01 +03:00
Faruk AYDIN
cbfb5dd8a6 feat: Introduce toRequireProperty custom assertion 2024-09-23 16:16:13 +03:00
Jakub P.
09b2b7350c test: add applications settings tests 2024-09-20 13:03:22 +02:00
Ömer Faruk Aydın
e146793d32 Merge pull request #2091 from automatisch/aut-1216
feat: use REST API endpoint to update user
2024-09-20 13:32:38 +03:00
Faruk AYDIN
0bad2ead10 chore: Fix typo for useAdminUpdateUser hook 2024-09-20 13:11:46 +03:00
Jakub P
25176884e7 fix: add missing snackbar on user update error 2024-09-20 13:11:43 +03:00
Ali BARIN
266d4cddb0 chore: remove redundant update user mutation 2024-09-20 13:10:42 +03:00
Ali BARIN
6e529a4205 feat: use REST API endpoint to update user 2024-09-20 13:09:46 +03:00
Ömer Faruk Aydın
d2cce278bd Merge pull request #2089 from automatisch/aut-1266
feat: use REST API endpoint to update flow status
2024-09-19 14:10:44 +03:00
Jakub P.
b774a62f8c fix: add missing snackbars on flow status update 2024-09-19 14:03:45 +03:00
Ali BARIN
66c12e1a92 chore: remove redundant update flow status mutation 2024-09-19 14:03:43 +03:00
Ali BARIN
184d748890 feat: use REST API endpoint to update flow status 2024-09-19 14:02:51 +03:00
Ömer Faruk Aydın
8cc732c8d1 Merge pull request #2085 from automatisch/aut-1259
feat: use REST API endpoint to create user
2024-09-19 13:58:13 +03:00
Faruk AYDIN
c688d67e4b feat: Implement admin user serializer test 2024-09-19 13:51:04 +03:00
Jakub P.
3408be2840 test: search for proper snackbar on user create error 2024-09-19 13:50:11 +03:00
Ali BARIN
e126066132 chore: remove redundant create user mutation 2024-09-19 13:50:09 +03:00
Ali BARIN
cfec447d8a feat(web): use REST API endpoint to create user 2024-09-19 13:49:12 +03:00
Ali BARIN
805d1fdd52 fix(useAdminCreateRole): correct query in invalidation 2024-09-19 13:49:12 +03:00
Ali BARIN
9299948072 feat: add admin user serializer with accept invitation url 2024-09-19 13:49:12 +03:00
Ömer Faruk Aydın
b02960a5ec Merge pull request #2083 from automatisch/aut-1257
feat: write and implement REST API endpoint to update step
2024-09-19 13:40:57 +03:00
Ali BARIN
8134b6db6a refactor(update-step): move connection authorization to model 2024-09-19 13:31:33 +03:00
Ali BARIN
cd16a3cc15 chore: remove redundant update step mutation 2024-09-19 13:31:31 +03:00
Ali BARIN
074e7828f3 feat(web): use REST API endpoint to update step 2024-09-19 13:30:45 +03:00
Ali BARIN
5f7d1f9219 feat: write REST API endpoint to update step 2024-09-19 13:30:45 +03:00
Ömer Faruk Aydın
b29c6105a1 Merge pull request #2088 from automatisch/aut-1213
feat: use REST API endpoint to delete step
2024-09-19 13:15:26 +03:00
Ali BARIN
1297f5d43c chore: remove redundant delete step mutation 2024-09-19 13:08:19 +03:00
Ali BARIN
f94a5385d7 feat: use REST API endpoint to delete step 2024-09-19 13:07:37 +03:00
Ömer Faruk Aydın
8ef2000e45 Merge pull request #2087 from automatisch/aut-1261
feat: use REST API endpoint to delete flow
2024-09-19 13:06:48 +03:00
Ali BARIN
30d496076b chore: remove redundant delete flow mutation 2024-09-19 12:37:47 +03:00
Ali BARIN
5de06d4482 feat: use REST API endpoint to delete flow 2024-09-19 12:36:59 +03:00
Ömer Faruk Aydın
97fa983305 Merge pull request #2086 from automatisch/aut-1260
feat: use REST API endpoint to delete current user
2024-09-19 12:34:35 +03:00
Ali BARIN
dccc3c5bc1 chore: remove redundant delete current user mutation 2024-09-19 12:27:28 +03:00
Ali BARIN
ed12465975 feat: use REST API endpoint to delete current user 2024-09-19 12:25:58 +03:00
Ömer Faruk Aydın
b78be222d7 Merge pull request #2084 from automatisch/aut-1228
feat: use REST API endpoint to create flow
2024-09-19 12:22:33 +03:00
Ali BARIN
342990e1bf chore: remove redundant create flow mutation 2024-09-18 14:53:06 +00:00
Ali BARIN
2e5dfdbb0d feat: use REST API endpoint to create flow 2024-09-18 14:51:23 +00:00
Faruk AYDIN
1790ef0ee6 feat: Implement update flow status rest API endpoint 2024-09-17 16:07:12 +03:00
Ömer Faruk Aydın
712a5756e2 Merge pull request #2070 from automatisch/aut-1248
feat: write and implement REST API endpoint to duplicate flow
2024-09-17 14:11:27 +03:00
Faruk AYDIN
bf6ff6b0f7 refactor: Revise duplicate flow controller tests 2024-09-17 13:18:48 +03:00
Faruk AYDIN
c6003b6695 fix: Correct duplicate flow mock name 2024-09-17 13:05:23 +03:00
Ali BARIN
8352540fcb chore: remove redundant duplicate flow mutation 2024-09-17 12:50:54 +03:00
Ali BARIN
22299868fa feat: use REST API endpoint to duplicate flow 2024-09-17 12:49:16 +03:00
Ali BARIN
0d126a8e2b feat: write REST API endpoint to duplicate flow 2024-09-17 12:49:13 +03:00
Ömer Faruk Aydın
776d027dfa Merge pull request #2081 from automatisch/rest-create-user
feat: Implement rest API endpoint for admins to create user
2024-09-17 12:45:08 +03:00
Faruk AYDIN
fa9b6d1006 chore: Mark create user mutation as converted mutation 2024-09-17 11:42:29 +03:00
Faruk AYDIN
89aa7ffc73 feat: Implement rest API endpoint for admins to create user 2024-09-17 11:41:18 +03:00
Faruk AYDIN
fd971449ca chore: Mark update connection as converted mutation 2024-09-16 13:39:44 +03:00
Ömer Faruk Aydın
f7cd57e549 Merge pull request #2080 from automatisch/rest-update-connection
feat: Implement rest API endpoint to update connection
2024-09-16 13:38:43 +03:00
Faruk AYDIN
34aadbfb09 feat: Implement rest API endpoint to update connection 2024-09-16 12:55:39 +03:00
Ömer Faruk Aydın
167195a01c Merge pull request #2077 from automatisch/rest-reset-connection
refactor: Move reset logic to connection model
2024-09-15 14:01:56 +03:00
Faruk AYDIN
b0abf94191 refactor: Move reset logic to connection model 2024-09-15 01:03:17 +03:00
Faruk AYDIN
1009c71e72 chore: Move reset connection to converted mutations 2024-09-15 01:02:58 +03:00
Ömer Faruk Aydın
29b1695159 Merge pull request #2076 from automatisch/rest-delete-flow
feat: Implement rest API endpoint to delete flow
2024-09-15 00:19:45 +03:00
Faruk AYDIN
44f782221f chore: Mark delete flow as converted mutation 2024-09-15 00:11:15 +03:00
Faruk AYDIN
bab25c51d9 feat: Implement rest API endpoint to delete flow 2024-09-14 21:54:10 +03:00
Ömer Faruk Aydın
89277e1665 Merge pull request #2075 from automatisch/converted-mutations
chore: Mark create connection as converted mutation
2024-09-14 00:46:07 +03:00
Faruk AYDIN
1e9c5a1682 chore: Mark create connection as converted mutation 2024-09-14 00:27:09 +03:00
Ömer Faruk Aydın
0c75486c7a Merge pull request #2073 from automatisch/aut-1251
feat: write REST API endpoint to generate auth url
2024-09-12 14:05:39 +03:00
Faruk AYDIN
8c39739880 refactor: Use getApp method for generateAuthUrl method of connection 2024-09-12 13:58:23 +03:00
Ali BARIN
ace1f84094 feat: write REST API endpoint to generate auth url 2024-09-12 13:57:25 +03:00
Ömer Faruk Aydın
2cfd6739ca Merge pull request #2068 from automatisch/aut-1242
feat: write REST API endpoint to create connection
2024-09-12 13:51:37 +03:00
Faruk AYDIN
e0d6f0d653 refactor: Fetch role and permissions for current user in create connection tests 2024-09-12 13:41:16 +03:00
Faruk AYDIN
a4d3b387d0 refactor: Add extra empty line for create connection test block 2024-09-12 13:35:00 +03:00
Ali BARIN
7394aca02d feat: write REST API endpoint to create connection 2024-09-12 13:33:38 +03:00
Ömer Faruk Aydın
e812725182 Merge pull request #2072 from automatisch/aut-1249
feat: write and implement REST API endpoint to register user
2024-09-12 13:26:12 +03:00
Faruk AYDIN
bb76bfcd8b fix: Typo for register user tests 2024-09-12 13:19:01 +03:00
Ali BARIN
6ff6d0a7dc fix(register-user): correct trial expiry date 2024-09-12 13:19:01 +03:00
Ali BARIN
ddc9867058 chore: remove redundant register user mutation 2024-09-12 13:19:01 +03:00
Ali BARIN
ba0d46c6cd feat(web): use REST API endpoint to register user 2024-09-12 13:19:01 +03:00
Ali BARIN
369f04fdbc feat: write REST API endpoint to register user 2024-09-12 13:19:01 +03:00
Ömer Faruk Aydın
09dd8abe23 Merge pull request #2069 from automatisch/rest-update-password
feat: Implement rest API endpoint to update current user password
2024-09-12 13:10:22 +03:00
Faruk AYDIN
8c692758ae chore: Remove redundant only flag for tests 2024-09-12 13:01:49 +03:00
Faruk AYDIN
32d39b88bd feat: Ask for current password while updating user password 2024-09-12 12:54:46 +03:00
Faruk AYDIN
8bd66da511 chore: Move update current user mutation to converted ones 2024-09-11 12:51:32 +03:00
Faruk AYDIN
f86799e494 feat: Implement rest API endpoint to update current user password 2024-09-11 12:51:32 +03:00
Jakub P.
8d10f26f56 test: add pop-up notification test 2024-09-10 17:40:34 +02:00
Ali BARIN
297543f9dd feat(useAuthenticateApp): early exit connection creation at blocked pop-up 2024-09-10 17:40:34 +02:00
Ali BARIN
0c53ee8460 feat(AddAppConnection): show pop-up reminder hint 2024-09-10 17:40:34 +02:00
Ömer Faruk Aydın
862842e3e1 Merge pull request #2064 from automatisch/aut-1237
feat: write and implement REST API endpoint to delete role
2024-09-10 17:19:55 +03:00
Ali BARIN
a4fad360df Merge pull request #2066 from automatisch/aut-1240
feat: write and implement REST API endpoint to create step
2024-09-10 14:31:12 +02:00
Ali BARIN
3ba4c8b3bf chore(EditorNew): remove console log 2024-09-10 10:50:11 +00:00
Ali BARIN
2992236be4 test(create-step): make current and another user explicit 2024-09-10 10:35:19 +00:00
Ali BARIN
82161f028e test(create-step): state permission conditions explicitly 2024-09-10 10:21:42 +00:00
Ali BARIN
1bcaec144b test(create-step): use non-admin user 2024-09-10 10:15:59 +00:00
Ali BARIN
852d4bba0a chore: remove redundant create step mutation 2024-09-10 10:12:59 +00:00
Ali BARIN
af56fa2830 feat(Editor): use REST API endpoint to create step 2024-09-10 10:12:59 +00:00
Ali BARIN
813646e392 feat: write REST API endpoint to create step 2024-09-10 10:12:59 +00:00
Ali BARIN
1ce31eefc6 Merge pull request #2057 from automatisch/aut-1226
feat: write endpoint to update SamlAuthProvidersRoleMappings
2024-09-10 12:09:00 +02:00
Ali BARIN
fdf53844e1 test(update-role-mappings): use name over key 2024-09-10 10:00:40 +00:00
Ali BARIN
be57a82302 test(factories/role): re-create different role if it exists 2024-09-10 09:56:15 +00:00
Ali BARIN
fb82e863e0 test(update-role-mappings): correct the test case name 2024-09-10 09:50:54 +00:00
Ali BARIN
101483409f style(update-role-mappings): add a breakline 2024-09-10 09:50:54 +00:00
Ali BARIN
6fe863eec1 test(update-role-mappings): use explicit remote role name 2024-09-10 09:50:54 +00:00
Ali BARIN
fbb6526aac refactor(update-role-mappings): move logic to model 2024-09-10 09:50:54 +00:00
Ali BARIN
5556aea913 chore: remove upsert-saml-auth-providers-role-mappings mutation 2024-09-10 09:50:54 +00:00
Ali BARIN
95dc5fb849 refactor(RoleMappings): rewrite mutations with REST API endpoints 2024-09-10 09:50:53 +00:00
Ali BARIN
062199d0e3 feat: write endpoints to update SamlAuthProvidersRoleMappings 2024-09-10 09:50:53 +00:00
Ali BARIN
53ce327516 Merge pull request #2060 from automatisch/aut-1233
feat: write and implement REST API endpoint to update role
2024-09-10 11:35:52 +02:00
Ali BARIN
61a1ce57c2 refactor(useAdminDeleteRole): remove redundant invalidateQueries 2024-09-06 09:52:03 +00:00
Jakub P.
687295f772 test: update roles related snackbar locator 2024-09-06 09:51:22 +00:00
Ali BARIN
e5366534ed chore: remove redundant delete role mutation 2024-09-06 09:51:22 +00:00
Ali BARIN
66fe84e126 feat(DeleteRoleButton): use REST API endpoint to delete role 2024-09-06 09:51:22 +00:00
Ali BARIN
0b6c28422c feat: write REST API endpoint to delete role 2024-09-06 09:51:22 +00:00
Ali BARIN
ea667bb6a9 refactor(useAdminUpdateRole): remove redundant invalidateQueries 2024-09-06 09:26:34 +00:00
Ali BARIN
c9ba219de1 chore: remove redundant update role mutation 2024-09-05 15:35:44 +00:00
Ali BARIN
9df1b29d70 feat(EditRole): use REST API endpoint to update role 2024-09-05 15:35:44 +00:00
Ali BARIN
3e34359fa9 feat: write REST API endpoint to update role 2024-09-05 15:35:44 +00:00
Ali BARIN
1818930d2f Merge pull request #2059 from automatisch/aut-1229
feat: write and implement REST API endpoint to create role
2024-09-05 17:35:19 +02:00
Ali BARIN
c03e674001 chore: add isAdmin virtual attribute in role model 2024-09-05 12:15:37 +00:00
Ali BARIN
10a25b82e0 chore(migrations/remove_key_column_in_roles): use arrow functions 2024-09-05 12:13:33 +00:00
Ömer Faruk Aydın
3b2489d738 Merge pull request #2062 from automatisch/fix-trigger-type-problem
fix: Throw error if trigger doesn't have a type
2024-09-05 13:51:37 +03:00
Faruk AYDIN
5c4ca3c84f fix: Add missing pollInverval keys for triggers 2024-09-05 13:40:44 +03:00
Faruk AYDIN
06c4b7ed2e fix: Throw error if trigger doesn't have a type 2024-09-05 13:32:19 +03:00
Ali BARIN
5591f6ccc9 fix(migrations): backfill role.key column in down migration 2024-09-04 11:30:39 +00:00
Ali BARIN
63dfb6947e feat: make role name unique and remove key usage 2024-09-04 11:13:39 +00:00
Ali BARIN
b089069b8e test: use faker in role factory 2024-09-03 14:18:14 +00:00
Ali BARIN
e76a99fd68 chore: remove redundant create role mutation 2024-09-03 13:56:23 +00:00
Ali BARIN
a4ea6c1fad refactor(CreateRole): implement REST API endpoint to create role 2024-09-03 13:56:06 +00:00
Ali BARIN
64ebdce1b2 feat: write migration to make roles unique by key 2024-09-03 13:55:28 +00:00
Ali BARIN
2709491d59 feat: write REST API endpoint to create role 2024-09-03 13:55:18 +00:00
Ömer Faruk Aydın
81beedede6 Merge pull request #2058 from automatisch/rest-delete-current-user
feat: Implement rest API endpoint to remove current user
2024-09-03 16:13:37 +03:00
Faruk AYDIN
33a2386d74 feat: Remove associated access tokens while removing user 2024-09-03 16:03:48 +03:00
Faruk AYDIN
0df5e5283e refactor: Remove user associations before removing user 2024-09-03 16:00:24 +03:00
Faruk AYDIN
560407b972 chore: Comment delete current user mutations as converted 2024-09-03 15:51:55 +03:00
Faruk AYDIN
f8c25ae508 feat: Implement rest API endpoint to remove current user 2024-09-03 15:50:44 +03:00
Ali BARIN
c524277665 Merge pull request #2054 from automatisch/aut-1224
Split UpsertSamlAuthProvider mutation into two endpoints
2024-09-03 11:42:05 +02:00
Ömer Faruk Aydın
a70fb009c7 Merge pull request #2055 from automatisch/rest-test-step
feat: Implement rest api endpoint to test step
2024-09-02 15:22:10 +03:00
Ömer Faruk Aydın
11e67f2ea3 Merge pull request #2056 from automatisch/rest-create-flow
feat: Implement create flow rest API endpoint
2024-09-02 15:21:46 +03:00
Faruk AYDIN
e7118ffe15 chore: Comment create flow mutation as converted 2024-09-02 15:03:59 +03:00
Faruk AYDIN
79e9455244 feat: Implement create flow rest API endpoint 2024-09-02 15:01:20 +03:00
Faruk AYDIN
6ca8e8958a feat: Implement rest api endpoint to test step 2024-09-02 14:00:31 +03:00
Faruk AYDIN
d3dc207166 feat: Extend step serializer with last execution step 2024-09-02 14:00:31 +03:00
Faruk AYDIN
51e200533b feat: Introduce lastExecutionStep relation to Step model 2024-09-02 14:00:31 +03:00
Ali BARIN
b8a25b87d8 Merge pull request #2053 from automatisch/webhook-tests-improvements
test: add wait for response on update flow
2024-09-02 10:04:47 +02:00
Ali BARIN
f4fe0a0d4f refactor(SamlConfiguration): rewrite mutations with REST API endpoints 2024-08-30 11:46:35 +00:00
Ali BARIN
1d4f829d29 chore: remove upsert-saml-auth-provider mutation 2024-08-30 11:46:06 +00:00
Ali BARIN
4afa79fca4 feat: write endpoitns to create and update SamlAuthProvider 2024-08-30 10:56:56 +00:00
Jakub P.
ec22184087 test: add wait for substeps response 2024-08-30 12:53:35 +02:00
Ali BARIN
413f3db5b4 test(update-flow): align user role permissions 2024-08-30 11:07:52 +02:00
Ali BARIN
8ddfcce787 chore: remove update-flow mutation 2024-08-30 11:07:52 +02:00
Ali BARIN
562341adfe refactor(web): rewrite mutation with PATCH /v1/flows/:flowId 2024-08-30 11:07:52 +02:00
Ali BARIN
9519ec53ef feat: write PATCH /v1/flows/:flowId 2024-08-30 11:07:52 +02:00
Ali BARIN
35bada360d refactor(update-config): move logic to config model 2024-08-30 11:07:44 +02:00
Ali BARIN
1f39765efe chore: remove update-config mutation 2024-08-30 11:07:44 +02:00
Ali BARIN
cce5b3b533 refactor(web): rewrite mutation with PATCH /v1/admin/config 2024-08-30 11:07:44 +02:00
Ali BARIN
e77a03b855 feat: write PATCH /v1/admin/config 2024-08-30 11:07:44 +02:00
Ali BARIN
7a54ff212e feat: incorporate NotAuthorized error in error handler 2024-08-30 10:23:28 +02:00
Ali BARIN
01340f4597 chore: remove redundant update-app-config mutation 2024-08-29 15:31:50 +02:00
Ali BARIN
af6fa80d20 test(reset-connection): cover formattedData with DB changes 2024-08-29 11:20:09 +02:00
Ali BARIN
e7474dcb9e refactor(reset-connection): streamline patches 2024-08-29 11:20:09 +02:00
Ali BARIN
0eb906d5df test(reset-connection): remove unnecessary read connection permission 2024-08-29 11:20:09 +02:00
Ali BARIN
c7babf227c feat: write POST /v1/connections/:connectionId/reset 2024-08-29 11:20:09 +02:00
Ali BARIN
d5c81c14f5 fix(FlowAppIcons): fix crash when no steps exist 2024-08-29 10:44:50 +02:00
Ali BARIN
59278378e5 chore: remove delete-connection mutation 2024-08-29 09:26:24 +02:00
Ali BARIN
990e69143d refactor(web): rewrite mutation with DELETE /v1/connections/:connectionId 2024-08-29 09:26:24 +02:00
Ali BARIN
c413ae06dc feat: write DELETE /v1/connections/:connectionId 2024-08-29 09:26:24 +02:00
Ali BARIN
456f8a30cc test(update-app-config): correct test case name 2024-08-29 09:26:16 +02:00
Ali BARIN
19c4561feb chore: remove update-app-config mutation 2024-08-29 09:26:16 +02:00
Ali BARIN
1392fed023 refactor(web): rewrite mutation with PATCH /v1/admin/apps/:appKey/config 2024-08-29 09:26:16 +02:00
Ali BARIN
ca81e14d63 feat: write PATCH /v1/admin/apps/:appKey/config 2024-08-29 09:26:16 +02:00
Ömer Faruk Aydın
8e7a8a02ec Merge pull request #2045 from automatisch/rest-admin-update-user
feat: Implement rest API endpoint to update users for admin
2024-08-28 18:07:24 +03:00
Faruk AYDIN
e45dfa94ed fix: Use updateUserMock instead of updateCurrentUserMock for admin API endpoint 2024-08-28 17:55:06 +03:00
Faruk AYDIN
a153787ae6 chore: Use patch instead of get for update user tests 2024-08-28 17:54:15 +03:00
Faruk AYDIN
cf37c43bc7 chore: Add update user mutation to converted mutations 2024-08-28 17:50:06 +03:00
Faruk AYDIN
d0aa2bca69 feat: Implement rest API endpoint to update users for admin 2024-08-28 17:49:38 +03:00
Ömer Faruk Aydın
7b3811e6ee Merge pull request #2044 from automatisch/rest-update-user
feat: Implement update user rest API endpoint
2024-08-28 17:21:54 +03:00
Faruk AYDIN
4054f551d4 feat: Implement update user rest API endpoint 2024-08-28 17:07:13 +03:00
Ömer Faruk Aydın
4eeda10f3f Merge pull request #2041 from automatisch/remove-redundant-async-handler-wrapper
fix: remove redundant asyncHandler wrapper
2024-08-28 12:38:36 +03:00
Ali BARIN
4231784ed2 fix: remove redundant asyncHandler wrapper 2024-08-28 09:20:30 +00:00
Ali BARIN
61ff6986d3 test(update-auth-client): cover HTTP 422 response 2024-08-28 11:16:46 +02:00
Ali BARIN
09bc0bba1e refactor(web): rewrite mutation with PATCH /v1/admin/apps/:appKey/auth-clients/:appAuthClientId 2024-08-28 11:16:46 +02:00
Ali BARIN
b2bda8479e feat: write PATCH /v1/admin/apps/:appKey/auth-clients/:appAuthClientId 2024-08-28 11:16:46 +02:00
Ömer Faruk Aydın
09b255f99e Merge pull request #2037 from automatisch/refactor-async-errors
refactor: Use express-async-errors instead of express-async-handler
2024-08-28 12:13:22 +03:00
Ali BARIN
0800642a2a refactor(create-config): move unique violation error handling to error-handler 2024-08-28 10:32:06 +02:00
Ali BARIN
48b2b006c0 refactor(web): rewrite mutation with POST /v1/admin/apps/:appKey/config 2024-08-28 10:32:06 +02:00
Ali BARIN
af4c1f08ec feat: write POST /v1/admin/apps/:key/config 2024-08-28 10:32:06 +02:00
Ali BARIN
87b26b6342 fix(app-config): add missing createdAt updatedAt fields in schema 2024-08-28 10:32:06 +02:00
Ali BARIN
706fb8d82f chore(backend): add test:watch script 2024-08-28 10:32:06 +02:00
Faruk AYDIN
f7ca59bd5f refactor: Use express-async-errors instead of express-async-handler 2024-08-28 11:10:31 +03:00
Ali BARIN
6540d0ea53 fix(AdminApplicationCreateAuthClient): correct typo in auth word 2024-08-27 16:34:09 +02:00
Ali BARIN
5995038e21 fix(error-handler): use HTTP 422 for validation errors 2024-08-27 16:34:09 +02:00
Ali BARIN
337ba6ea87 test(create-auth-client): cover error handler 2024-08-27 16:34:09 +02:00
Ali BARIN
04c6183752 refactor(create-auth-client): accept only auth client schema fields 2024-08-27 16:34:09 +02:00
Ali BARIN
0b63922f46 feat: map and expose objection.js errors 2024-08-27 16:34:09 +02:00
Ali BARIN
81c39d7d93 refactor: rewrite create-app-auth-client mutation as REST endpoint 2024-08-27 16:34:09 +02:00
Ömer Faruk Aydın
164d31dfbc Merge pull request #2034 from automatisch/rest-verify-connection-api
feat: Implement rest API endpoint to verify connection
2024-08-27 15:11:53 +03:00
Faruk AYDIN
1a833aad52 feat: Implement rest API endpoint to verify connection 2024-08-27 14:51:28 +03:00
Ömer Faruk Aydın
77246c1fde Merge pull request #2033 from automatisch/refactor-test-connection
Refactor test connection action
2024-08-26 16:35:16 +03:00
Faruk AYDIN
56c08a3587 fix: Solve truncate deadlock problem for test suite 2024-08-26 16:26:29 +03:00
Faruk AYDIN
ce6214dc0f refactor: Rename create test action as test connection 2024-08-26 16:26:03 +03:00
Faruk AYDIN
22002d50ac chore: Comment converted graphQL mutations 2024-08-26 16:01:15 +03:00
Ali BARIN
ab4e94695d Merge pull request #2030 from automatisch/AUT-1132
fix: prevent resetting test data until data is loaded
2024-08-26 11:37:37 +02:00
Ömer Faruk Aydın
47a01cec7e Merge pull request #2032 from automatisch/rest-delete-step
feat: Implement delete step rest API endpoint
2024-08-23 17:44:23 +03:00
Faruk AYDIN
0cf9bc1a32 feat: Implement delete step rest API endpoint 2024-08-23 16:55:44 +03:00
kasia.oczkowska
6552ebcd3c fix: prevent resetting test data until data is loaded 2024-08-23 13:07:05 +01:00
Ali BARIN
5af1d94fc0 Merge pull request #2028 from automatisch/AUT-1183
feat: update step only when data changes
2024-08-22 16:22:16 +02:00
Ali BARIN
a4ec7b3047 feat(compute-parameters): add valueType with parse option and string by default (#2025)
* feat(compute-parameters): add valueType with parse option and string by default

* test(compute-parameters): write tests for valueType with parse and undefined

* fix(compute-parameters): cover valueType = parse in nested objects

* test(compute-parameters): cover valueType = 'parse' in nested non-primitives

* fix(compute-parameters): mark fields optional
2024-08-22 16:20:18 +02:00
Ali BARIN
66f5003d91 Merge pull request #2027 from automatisch/harden-webhook-tests
test: harden webhook tests
2024-08-22 16:19:51 +02:00
kasia.oczkowska
0c754e4b4b feat: update step only when data changes 2024-08-22 11:57:25 +01:00
Jakub P.
e008087c4a test: harden webhook tests 2024-08-22 12:05:52 +02:00
Ali BARIN
53f63996bd Merge pull request #2024 from kuba618/AUT-1186
test: add simple webhook flow test
2024-08-22 11:16:22 +02:00
Ali BARIN
4fedf77991 Merge pull request #2026 from automatisch/aut-1187
refactor(compute-parameters): rewrite logic
2024-08-22 10:18:49 +02:00
Ali BARIN
34331d8763 refactor(compute-parameters) rename functions and variables 2024-08-21 11:35:09 +00:00
Jakub P.
2c21b7762c test: add simple webhook flow test 2024-08-20 19:17:08 +02:00
Ömer Faruk Aydın
7f9c2b687f Merge pull request #2022 from automatisch/use-objects-as-variables
feat(PowerInput): support whole objects as variables
2024-08-19 14:21:52 +03:00
Ali BARIN
b452ed648c feat(PowerInput): support whole objects as variables 2024-08-16 13:22:31 +00:00
Rıdvan Akca
98e4b843ea feat(clickup/actions): add create task and find task by id (#1615)
* feat(clickup): add create task action

* feat(clickup): add find task by id action

* fix(clickup): send optional parameters only when provided

---------

Co-authored-by: Ali BARIN <ali.barin53@gmail.com>
2024-08-15 15:59:58 +02:00
Ali BARIN
da2884d53c Merge pull request #1594 from automatisch/AUT-666
feat(clickup): add clickup integration
2024-08-15 14:44:11 +02:00
Ali BARIN
7f2937400a fix(clickup/create-list): send priority and due date only when provided 2024-08-15 12:07:40 +00:00
Ali BARIN
a3a4a8e431 fix(clickup/new-folders): correct internal ID 2024-08-15 12:07:40 +00:00
Ali BARIN
3249c954d3 fix(clickup/new-lists): correct internal ID 2024-08-15 12:07:40 +00:00
Ali BARIN
7395d2a74e fix(clickup/new-tasks): correct internal ID 2024-08-15 12:07:40 +00:00
Ali BARIN
2060b7b49d feat(clickup/updated-task): mark whatChanged optional 2024-08-15 12:07:40 +00:00
Rıdvan Akca
d263726c19 feat(clickup): add create list action 2024-08-15 12:07:40 +00:00
Rıdvan Akca
7e3325e959 feat(clickup): add create folder action 2024-08-15 12:07:40 +00:00
Rıdvan Akca
ec075f05c5 feat(clickup): add task changes trigger 2024-08-15 12:07:40 +00:00
Rıdvan Akca
200e483574 feat(clickup): add new tasks trigger 2024-08-15 12:07:40 +00:00
Rıdvan Akca
6c11bfe93d feat(clickup): add new lists trigger 2024-08-15 12:07:40 +00:00
Rıdvan Akca
b4cc7f4d81 feat(clickup): add new folders trigger 2024-08-15 12:07:38 +00:00
Rıdvan Akca
26fc63c52c feat(clickup): add clickup integration 2024-08-15 12:07:24 +00:00
Ali BARIN
116bf59b68 Merge pull request #1577 from automatisch/AUT-641
feat(jotform): add jotform integration
2024-08-14 16:23:42 +02:00
Ali BARIN
566f9dd5cc fix(jotform): use right custom API URL 2024-08-14 14:14:55 +00:00
Ali BARIN
ec740c07fa feat(jotform/auth): show default API URL 2024-08-14 14:14:20 +00:00
Ali BARIN
7506bf186b feat(jotform): prettify screen name 2024-08-14 14:14:20 +00:00
Ali BARIN
27c36b644d fix(jotform/list-forms): fix pagination 2024-08-14 14:14:20 +00:00
Ali BARIN
ed2b1029f6 docs(jotform/connection): incorporate API URL field 2024-08-14 14:14:20 +00:00
Rıdvan Akca
530a920517 feat(jotform): add new submissions trigger 2024-08-14 14:14:19 +00:00
Rıdvan Akca
42f8e635ed feat(jotform): add jotform integration 2024-08-14 14:13:57 +00:00
Ali BARIN
7ace67f906 Merge pull request #1571 from automatisch/AUT-632
feat(mailchimp): add mailchimp integration
2024-08-13 15:29:39 +02:00
Ali BARIN
1b437778dc docs: sort apps alphabetically 2024-08-13 13:16:54 +00:00
Ali BARIN
43b0c65aab fix(mailchimp): update mailchimp triggers and dynamic data 2024-08-13 13:16:39 +00:00
Rıdvan Akca
3f6a319ebe feat(mailchimp): add send campaign action 2024-08-13 13:16:39 +00:00
Rıdvan Akca
4cbd342e17 feat(mailchimp): add create campaign action 2024-08-13 13:16:39 +00:00
Rıdvan Akca
273f04128c feat(mailchimp): add email opened trigger 2024-08-13 13:16:39 +00:00
Rıdvan Akca
9a5cef08d6 feat(mailchimp): add new unsubscribers trigger 2024-08-13 13:16:39 +00:00
Rıdvan Akca
bbecfdb718 feat(mailchimp): add new subscribers trigger 2024-08-13 13:16:36 +00:00
Rıdvan Akca
cbed79fbf1 feat(mailchimp): add mailchimp integration 2024-08-13 13:16:09 +00:00
Ali BARIN
c4cbc024e6 Merge pull request #2019 from automatisch/aut-1093
fix(duplicate-flow): let users duplicate flows they have access to
2024-08-09 17:23:10 +02:00
Ali BARIN
2db8dbd5a3 Merge pull request #2018 from automatisch/AUT-1090
fix(carbone/add-template): correct typo in template
2024-08-09 11:37:49 +02:00
Ömer Faruk Aydın
13b995c9f2 Merge pull request #2017 from automatisch/AUT-1094
fix(update-flow-status): throw at incomplete trigger step
2024-08-09 11:06:14 +02:00
Ali BARIN
a0944193b6 Merge pull request #1627 from automatisch/dependabot/npm_and_yarn/ip-1.1.9
chore(deps): Bump ip from 1.1.5 to 1.1.9
2024-08-08 13:41:38 +02:00
Ali BARIN
c7f343020a Merge pull request #2016 from automatisch/dependabot/npm_and_yarn/fast-xml-parser-4.4.1
chore(deps): bump fast-xml-parser from 4.2.5 to 4.4.1
2024-08-08 13:38:32 +02:00
Ali BARIN
7a48ccc4f4 Merge pull request #1938 from automatisch/dependabot/npm_and_yarn/ws-7.5.10
chore(deps): bump ws from 7.5.6 to 7.5.10
2024-08-08 13:38:20 +02:00
Ali BARIN
cc1218b7a3 Merge pull request #1937 from automatisch/dependabot/npm_and_yarn/braces-3.0.3
chore(deps): bump braces from 3.0.2 to 3.0.3
2024-08-08 13:38:01 +02:00
Ali BARIN
385e640a92 Merge pull request #2014 from automatisch/AUT-1141
feat: make role input required in CreateUser
2024-08-08 12:08:23 +02:00
Ali BARIN
b40a59cbef Merge pull request #1990 from kuba618/AUT-1137
fix: improve paths for windows os
2024-08-08 12:08:05 +02:00
Ali BARIN
1a45ce5ea4 fix(duplicate-flow): let users duplicate flows they have access to 2024-08-08 09:23:54 +00:00
Ali BARIN
ab05048409 fix(carbone/add-template): correct typo in template 2024-08-08 08:56:58 +00:00
Ali BARIN
47aabbe9c5 fix(update-flow-status): throw at incomplete trigger step 2024-08-08 08:48:27 +00:00
Ali BARIN
58cd2c522e Merge pull request #1461 from automatisch/AUT-537
feat(google-sheets): add find worksheet action
2024-08-07 16:22:06 +02:00
Rıdvan Akca
1fe0cd9f84 feat(google-sheets): add find worksheet action 2024-08-07 14:21:51 +00:00
Ali BARIN
eeee1ba1a3 Merge pull request #1565 from automatisch/AUT-618
feat(mailerlite): add campaign sent trigger
2024-08-07 14:31:27 +02:00
Ali BARIN
3cb8880c5c Merge pull request #1564 from automatisch/AUT-617
feat(mailerlite): add subscriber unsubscribed trigger
2024-08-07 14:31:19 +02:00
Ali BARIN
80cec86225 Merge pull request #1563 from automatisch/AUT-616
feat(mailerlite): add subscriber created trigger
2024-08-07 14:31:12 +02:00
Ali BARIN
cc65ed8fb0 Merge pull request #1562 from automatisch/AUT-615
feat(mailerlite): add spam complaint trigger
2024-08-07 14:31:05 +02:00
Ali BARIN
0c3f1f4a5d Merge pull request #1561 from automatisch/AUT-614
feat(mailerlite): add mailerlite integration
2024-08-07 14:30:53 +02:00
dependabot[bot]
76375941ca chore(deps): bump fast-xml-parser from 4.2.5 to 4.4.1
Bumps [fast-xml-parser](https://github.com/NaturalIntelligence/fast-xml-parser) from 4.2.5 to 4.4.1.
- [Release notes](https://github.com/NaturalIntelligence/fast-xml-parser/releases)
- [Changelog](https://github.com/NaturalIntelligence/fast-xml-parser/blob/master/CHANGELOG.md)
- [Commits](https://github.com/NaturalIntelligence/fast-xml-parser/compare/v4.2.5...v4.4.1)

---
updated-dependencies:
- dependency-name: fast-xml-parser
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-08-07 12:22:09 +00:00
Ali BARIN
d2a0415def Merge pull request #2015 from automatisch/dependabot/npm_and_yarn/msgpackr-1.11.0
chore(deps): bump msgpackr from 1.5.6 to 1.11.0
2024-08-07 14:21:07 +02:00
dependabot[bot]
815c0834b2 chore(deps): bump msgpackr from 1.5.6 to 1.11.0
Bumps [msgpackr](https://github.com/kriszyp/msgpackr) from 1.5.6 to 1.11.0.
- [Release notes](https://github.com/kriszyp/msgpackr/releases)
- [Commits](https://github.com/kriszyp/msgpackr/commits)

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

Signed-off-by: dependabot[bot] <support@github.com>
2024-08-07 12:15:36 +00:00
kasia.oczkowska
7e1e1e2524 feat: make role input required in CreateUser 2024-08-07 12:41:45 +01:00
Ali BARIN
957d2793cb Merge pull request #2009 from automatisch/test-compute-parameters
test(compute-parameters): write tests for different type of values
2024-08-07 10:57:50 +02:00
Ömer Faruk Aydın
6ab86b7574 Merge pull request #2010 from automatisch/aut-1098
fix: mark steps incomplete when their parameters change
2024-08-07 10:07:00 +02:00
Ömer Faruk Aydın
1c75b7226d Merge pull request #1999 from automatisch/redis-sentinel
feat: support redis sentinel
2024-08-07 10:00:24 +02:00
Ömer Faruk Aydın
db22d8e2c9 Merge pull request #2012 from automatisch/aut-1154
feat(http-request/custom-request): expose response headers and status
2024-08-07 10:00:07 +02:00
Ömer Faruk Aydın
7838b9609c Merge pull request #2013 from automatisch/aut-1089
fix(github/create-issue): mark repo field as required
2024-08-07 09:59:51 +02:00
Ali BARIN
2a1a0421b6 fix(github/create-issue): mark repo field as required 2024-08-06 14:42:21 +00:00
Ali BARIN
125ea0457e feat(http-request/custom-request): expose response headers and status 2024-08-06 13:35:42 +00:00
Ali BARIN
c1f5f0632b fix: mark steps incomplete when their parameters change 2024-08-05 16:34:09 +00:00
Ömer Faruk Aydın
8c84ab29c6 Merge pull request #1998 from automatisch/code-execution-app
feat(code/run-javascript): run JS code and introduce monaco editor
2024-08-05 17:32:18 +02:00
Ali BARIN
2767af11b2 fix: move nodemon config to separate package.json property 2024-08-05 14:00:02 +00:00
Ali BARIN
59bbc4c182 fix: remove single quotes in package scripts 2024-08-05 14:00:02 +00:00
Jakub P.
a755ee8dc1 fix: improve paths for windows os 2024-08-05 14:00:02 +00:00
Ali BARIN
4b1e66add3 feat(code/run-javascript): omit empty key entries 2024-08-05 13:46:41 +00:00
Faruk AYDIN
4f6727810b feat(code): Improve the default code by adding usage comments 2024-08-05 13:46:41 +00:00
Faruk AYDIN
60fdfc2b48 chore(code): Make font size of the code editor a bit bigger 2024-08-05 13:46:41 +00:00
Faruk AYDIN
268d8c8b7d feat(code): Add linebreaks to the default code value 2024-08-05 13:46:41 +00:00
Ali BARIN
49d4071928 feat(code/run-javascript): run async code and introduce monaco editor 2024-08-05 13:46:41 +00:00
Faruk AYDIN
c99b9dbe0a feat: Implement draft version of the code execution app 2024-08-05 13:46:41 +00:00
Ali BARIN
09d3a06b27 Merge pull request #2005 from automatisch/AUT-1065
fix: in FlowStep wrap in Form component only controlled inputs
2024-08-05 15:45:06 +02:00
Ali BARIN
0d49bc003f Merge pull request #2004 from automatisch/fix-dockerfile
fix: Adjust dockerfile env syntax to new dsl
2024-08-05 15:43:41 +02:00
Ali BARIN
86a5569bf7 test(compute-parameters): write tests for different type of values 2024-08-05 13:35:16 +00:00
Ali BARIN
ad9fe7dec6 Merge pull request #2007 from automatisch/release/v0.13.1
Update version to 0.13.1
2024-08-05 12:28:16 +02:00
Ali BARIN
24bf07e068 Update version to 0.13.1 2024-08-02 15:54:26 +02:00
Ali BARIN
bae234827f Merge pull request #2006 from automatisch/use-unparsed-numbers-in-compute-parameters
fix(compute-parameters): use unparsed numbers
2024-08-02 15:42:21 +02:00
Ali BARIN
81c698f45b fix(compute-parameters): use unparsed numbers 2024-08-02 12:22:03 +00:00
Ali BARIN
c9fecec575 Merge pull request #2002 from automatisch/aut-1255
feat: expose installationCompleted in GET /v1/automatisch/info
2024-08-02 11:46:48 +02:00
Ali BARIN
2f42dfdc51 Merge pull request #2001 from automatisch/remove-pwa
feat: remove PWA
2024-08-02 11:16:44 +02:00
kasia.oczkowska
5bac68b0de fix: in FlowStep wrap in Form component only controlled inputs 2024-08-02 09:31:36 +01:00
Ali BARIN
5afd500c26 Merge pull request #2003 from automatisch/release/v0.13.0
Update version to 0.13.0
2024-08-01 18:30:55 +02:00
Faruk AYDIN
03f3e5f6ab fix: Adjust dockerfile env syntax to new dsl 2024-08-01 18:15:00 +02:00
Ali BARIN
cc1a924c8b feat: use installationCompleted from useAutomatischInfo hook 2024-08-01 13:38:06 +00:00
Ali BARIN
02005a3f09 feat: expose installationCompleted in GET /v1/automatisch/info 2024-08-01 13:02:21 +00:00
Ali BARIN
d9219a5a48 feat: remove PWA 2024-08-01 12:28:23 +00:00
Ali BARIN
66f9cb8d25 feat: support redis sentinel 2024-07-30 18:31:57 +00:00
dependabot[bot]
0dea5150a0 chore(deps): bump ws from 7.5.6 to 7.5.10
Bumps [ws](https://github.com/websockets/ws) from 7.5.6 to 7.5.10.
- [Release notes](https://github.com/websockets/ws/releases)
- [Commits](https://github.com/websockets/ws/compare/7.5.6...7.5.10)

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

Signed-off-by: dependabot[bot] <support@github.com>
2024-06-18 08:56:00 +00:00
dependabot[bot]
c99e8d270d chore(deps): bump braces from 3.0.2 to 3.0.3
Bumps [braces](https://github.com/micromatch/braces) from 3.0.2 to 3.0.3.
- [Changelog](https://github.com/micromatch/braces/blob/master/CHANGELOG.md)
- [Commits](https://github.com/micromatch/braces/compare/3.0.2...3.0.3)

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

Signed-off-by: dependabot[bot] <support@github.com>
2024-06-17 12:51:03 +00:00
dependabot[bot]
145172f486 chore(deps): Bump ip from 1.1.5 to 1.1.9
Bumps [ip](https://github.com/indutny/node-ip) from 1.1.5 to 1.1.9.
- [Commits](https://github.com/indutny/node-ip/compare/v1.1.5...v1.1.9)

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

Signed-off-by: dependabot[bot] <support@github.com>
2024-03-04 14:22:03 +00:00
Rıdvan Akca
e2c5d843df feat(mailerlite): add campaign sent trigger 2024-01-26 18:47:24 +03:00
Rıdvan Akca
557ea55ddf feat(mailerlite): add subscriber unsubscribed trigger 2024-01-26 18:36:49 +03:00
Rıdvan Akca
1591a4edd2 feat(mailerlite): add subscriber created trigger 2024-01-26 18:29:39 +03:00
Rıdvan Akca
b30b5024a8 feat(mailerlite): add spam complaint trigger 2024-01-26 18:22:00 +03:00
Rıdvan Akca
8ef2bd3b8d feat(mailerlite): add mailerlite integration 2024-01-26 13:44:34 +03:00
712 changed files with 40622 additions and 22547 deletions

View File

@@ -5,8 +5,11 @@ BACKEND_PORT=3000
WEB_PORT=3001
echo "Configuring backend environment variables..."
cd packages/backend
rm -rf .env
echo "
PORT=$BACKEND_PORT
WEB_APP_URL=http://localhost:$WEB_PORT
@@ -21,24 +24,35 @@ WEBHOOK_SECRET_KEY=sample_webhook_secret_key
APP_SECRET_KEY=sample_app_secret_key
REDIS_HOST=redis
SERVE_WEB_APP_SEPARATELY=true" >> .env
echo "Installing backend dependencies..."
yarn
cd $CURRENT_DIR
echo "Configuring web environment variables..."
cd packages/web
rm -rf .env
echo "
PORT=$WEB_PORT
REACT_APP_BACKEND_URL=http://localhost:$BACKEND_PORT
" >> .env
echo "Installing web dependencies..."
yarn
cd $CURRENT_DIR
echo "Installing and linking dependencies..."
yarn
yarn lerna bootstrap
echo "Migrating database..."
cd packages/backend
yarn db:migrate
yarn db:seed:user
echo "Done!"
echo "Done!"

View File

@@ -41,8 +41,11 @@ jobs:
with:
node-version: 18
- name: Install dependencies
run: cd packages/backend && yarn
run: yarn
working-directory: packages/backend
- name: Copy .env-example.test file to .env.test
run: cd packages/backend && cp .env-example.test .env.test
run: cp .env-example.test .env.test
working-directory: packages/backend
- name: Run tests
run: cd packages/backend && yarn test
run: yarn test:coverage
working-directory: packages/backend

View File

@@ -18,11 +18,13 @@ jobs:
with:
node-version: '18'
cache: 'yarn'
cache-dependency-path: yarn.lock
cache-dependency-path: packages/backend/yarn.lock
- run: echo "💡 The ${{ github.repository }} repository has been cloned to the runner."
- run: echo "🖥️ The workflow is now ready to test your code on the runner."
- run: yarn --frozen-lockfile
- run: cd packages/backend && yarn lint
working-directory: packages/backend
- run: yarn lint
working-directory: packages/backend
- run: echo "🍏 This job's status is ${{ job.status }}."
start-backend-server:
runs-on: ubuntu-latest
@@ -35,11 +37,13 @@ jobs:
with:
node-version: '18'
cache: 'yarn'
cache-dependency-path: yarn.lock
cache-dependency-path: packages/backend/yarn.lock
- run: echo "💡 The ${{ github.repository }} repository has been cloned to the runner."
- run: echo "🖥️ The workflow is now ready to test your code on the runner."
- run: yarn --frozen-lockfile && yarn lerna bootstrap
- run: cd packages/backend && yarn start
- run: yarn --frozen-lockfile
working-directory: packages/backend
- run: yarn start
working-directory: packages/backend
env:
ENCRYPTION_KEY: sample_encryption_key
WEBHOOK_SECRET_KEY: sample_webhook_secret_key
@@ -55,11 +59,13 @@ jobs:
with:
node-version: '18'
cache: 'yarn'
cache-dependency-path: yarn.lock
cache-dependency-path: packages/backend/yarn.lock
- run: echo "💡 The ${{ github.repository }} repository has been cloned to the runner."
- run: echo "🖥️ The workflow is now ready to test your code on the runner."
- run: yarn --frozen-lockfile && yarn lerna bootstrap
- run: cd packages/backend && yarn start:worker
- run: yarn --frozen-lockfile
working-directory: packages/backend
- run: yarn start:worker
working-directory: packages/backend
env:
ENCRYPTION_KEY: sample_encryption_key
WEBHOOK_SECRET_KEY: sample_webhook_secret_key
@@ -75,11 +81,13 @@ jobs:
with:
node-version: '18'
cache: 'yarn'
cache-dependency-path: yarn.lock
cache-dependency-path: packages/web/yarn.lock
- run: echo "💡 The ${{ github.repository }} repository has been cloned to the runner."
- run: echo "🖥️ The workflow is now ready to test your code on the runner."
- run: yarn --frozen-lockfile && yarn lerna bootstrap
- run: cd packages/web && yarn build
- run: yarn --frozen-lockfile
working-directory: packages/web
- run: yarn build
working-directory: packages/web
env:
CI: false
- run: echo "🍏 This job's status is ${{ job.status }}."

View File

@@ -3,12 +3,13 @@ on:
push:
branches:
- main
pull_request:
paths:
- 'packages/backend/**'
- 'packages/e2e-tests/**'
- 'packages/web/**'
- '!packages/backend/src/apps/**'
# TODO: Add pull request after optimizing the total excecution time of the test suite.
# pull_request:
# paths:
# - 'packages/backend/**'
# - 'packages/e2e-tests/**'
# - 'packages/web/**'
# - '!packages/backend/src/apps/**'
workflow_dispatch:
env:
@@ -58,13 +59,21 @@ jobs:
- uses: actions/setup-node@v3
with:
node-version: 18
- name: Install dependencies
run: yarn && yarn lerna bootstrap
- name: Install web dependencies
run: yarn
working-directory: ./packages/web
- name: Install backend dependencies
run: yarn
working-directory: ./packages/backend
- name: Install e2e-tests dependencies
run: yarn
working-directory: ./packages/e2e-tests
- name: Install Playwright Browsers
run: yarn playwright install --with-deps
working-directory: ./packages/e2e-tests
- name: Build Automatisch web
working-directory: ./packages/web
run: yarn build
working-directory: ./packages/web
env:
# Keep this until we clean up warnings in build processes
CI: false

1
.gitignore vendored
View File

@@ -4,7 +4,6 @@ logs
npm-debug.log*
yarn-debug.log*
yarn-error.log*
lerna-debug.log*
.pnpm-debug.log*
# Diagnostic reports (https://nodejs.org/api/report.html)

View File

@@ -1,20 +1,22 @@
# syntax=docker/dockerfile:1
FROM node:18-alpine
ENV PORT 3000
ENV PORT=3000
RUN \
apk --no-cache add --virtual build-dependencies python3 build-base git
apk --no-cache add --virtual build-dependencies python3 build-base git make g++
WORKDIR /automatisch
# copy the app, note .dockerignore
COPY . /automatisch
RUN yarn
RUN cd packages/web && yarn
RUN cd packages/web && yarn build
RUN cd packages/backend && yarn --production
RUN \
rm -rf /usr/local/share/.cache/ && \
apk del build-dependencies

View File

@@ -1,13 +0,0 @@
{
"packages": [
"packages/*"
],
"version": "0.10.0",
"npmClient": "yarn",
"useWorkspaces": true,
"command": {
"add": {
"exact": true
}
}
}

View File

@@ -1,32 +0,0 @@
{
"name": "@automatisch/root",
"license": "See LICENSE file",
"private": true,
"scripts": {
"start": "lerna run --stream --parallel --scope=@*/{web,backend} dev",
"start:web": "lerna run --stream --scope=@*/web dev",
"start:backend": "lerna run --stream --scope=@*/backend dev",
"build:docs": "cd ./packages/docs && yarn install && yarn build"
},
"workspaces": {
"packages": [
"packages/*"
],
"nohoist": [
"**/babel-loader",
"**/webpack",
"**/@automatisch/web",
"**/ajv"
]
},
"devDependencies": {
"eslint": "^8.13.0",
"eslint-config-prettier": "^8.3.0",
"eslint-plugin-prettier": "^4.0.0",
"lerna": "^4.0.0",
"prettier": "^2.5.1"
},
"publishConfig": {
"access": "public"
}
}

View File

@@ -10,7 +10,7 @@ import process from 'process';
async function fetchAdminRole() {
const role = await Role.query()
.where({
key: 'admin',
name: 'Admin',
})
.limit(1)
.first();

View File

@@ -1,6 +1,6 @@
import { knexSnakeCaseMappers } from 'objection';
import appConfig from './src/config/app.js';
import path from 'path';
import path, { join } from 'path';
import { fileURLToPath } from 'url';
const fileExtension = 'js';
@@ -20,12 +20,12 @@ const knexConfig = {
searchPath: [appConfig.postgresSchema],
pool: { min: 0, max: 20 },
migrations: {
directory: __dirname + '/src/db/migrations',
directory: join(__dirname, '/src/db/migrations'),
extension: fileExtension,
loadExtensions: [`.${fileExtension}`],
},
seeds: {
directory: __dirname + '/src/db/seeds',
directory: join(__dirname, '/src/db/seeds'),
},
...(appConfig.isTest ? knexSnakeCaseMappers() : {}),
};

View File

@@ -5,12 +5,14 @@
"description": "The open source Zapier alternative. Build workflow automation without spending time and money.",
"type": "module",
"scripts": {
"dev": "nodemon --watch 'src/**/*.js' --exec 'node' src/server.js",
"worker": "nodemon --watch 'src/**/*.js' --exec 'node' src/worker.js",
"dev": "nodemon --exec node src/server.js",
"worker": "nodemon --exec node src/worker.js",
"start": "node src/server.js",
"start:worker": "node src/worker.js",
"pretest": "APP_ENV=test node ./test/setup/prepare-test-env.js",
"test": "APP_ENV=test vitest run",
"test:watch": "APP_ENV=test vitest watch",
"test:coverage": "yarn test --coverage",
"lint": "eslint .",
"db:create": "node ./bin/database/create.js",
"db:seed:user": "node ./bin/database/seed-user.js",
@@ -22,8 +24,7 @@
"dependencies": {
"@bull-board/express": "^3.10.1",
"@casl/ability": "^6.5.0",
"@graphql-tools/graphql-file-loader": "^7.3.4",
"@graphql-tools/load": "^7.5.2",
"@faker-js/faker": "^9.2.0",
"@node-saml/passport-saml": "^4.0.4",
"@rudderstack/rudder-sdk-node": "^1.1.2",
"@sentry/node": "^7.42.0",
@@ -37,18 +38,18 @@
"crypto-js": "^4.1.1",
"debug": "~2.6.9",
"dotenv": "^10.0.0",
"eslint": "^8.13.0",
"eslint-config-prettier": "^8.3.0",
"eslint-plugin-prettier": "^4.0.0",
"express": "~4.18.2",
"express-async-handler": "^1.2.0",
"express-async-errors": "^3.1.1",
"express-basic-auth": "^1.2.1",
"express-graphql": "^0.12.0",
"fast-xml-parser": "^4.0.11",
"graphql-middleware": "^6.1.15",
"graphql-shield": "^7.5.0",
"graphql-tools": "^8.2.0",
"handlebars": "^4.7.7",
"http-errors": "~1.6.3",
"http-proxy-agent": "^7.0.0",
"https-proxy-agent": "^7.0.1",
"isolated-vm": "^5.0.1",
"jsonwebtoken": "^9.0.0",
"knex": "^2.4.0",
"libphonenumber-js": "^1.10.48",
@@ -65,6 +66,7 @@
"pg": "^8.7.1",
"php-serialize": "^4.0.2",
"pluralize": "^8.0.0",
"prettier": "^2.5.1",
"raw-body": "^2.5.2",
"showdown": "^2.1.0",
"uuid": "^9.0.1",
@@ -96,12 +98,19 @@
"url": "https://github.com/automatisch/automatisch/issues"
},
"devDependencies": {
"@vitest/coverage-v8": "^2.1.5",
"node-gyp": "^10.1.0",
"nodemon": "^2.0.13",
"supertest": "^6.3.3",
"vitest": "^1.1.3"
"vitest": "^2.1.5"
},
"publishConfig": {
"access": "public"
},
"nodemonConfig": {
"watch": [
"src/"
],
"ext": "js"
}
}

View File

@@ -1,5 +1,6 @@
import createError from 'http-errors';
import express from 'express';
import 'express-async-errors';
import cors from 'cors';
import appConfig from './config/app.js';

View File

@@ -12,7 +12,7 @@ export default defineApp({
apiBaseUrl: 'https://api.airtable.com',
iconUrl: '{BASE_URL}/apps/airtable/assets/favicon.svg',
authDocUrl: '{DOCS_URL}/apps/airtable/connection',
primaryColor: 'FFBF00',
primaryColor: '#FFBF00',
supportsConnections: true,
beforeRequest: [addAuthHeader],
auth,

View File

@@ -12,7 +12,7 @@ export default defineApp({
apiBaseUrl: 'https://cloud.appwrite.io',
iconUrl: '{BASE_URL}/apps/appwrite/assets/favicon.svg',
authDocUrl: '{DOCS_URL}/apps/appwrite/connection',
primaryColor: 'FD366E',
primaryColor: '#FD366E',
supportsConnections: true,
beforeRequest: [setBaseUrl, addAuthHeader],
auth,

View File

@@ -12,7 +12,7 @@ export default defineApp({
apiBaseUrl: '',
iconUrl: '{BASE_URL}/apps/azure-openai/assets/favicon.svg',
authDocUrl: '{DOCS_URL}/apps/azure-openai/connection',
primaryColor: '000000',
primaryColor: '#000000',
supportsConnections: true,
beforeRequest: [setBaseUrl, addAuthHeader],
auth,

View File

@@ -7,7 +7,7 @@ export default defineAction({
'Creates an attachment of a specified object by given parent ID.',
arguments: [
{
label: 'Templete Data',
label: 'Template Data',
key: 'templateData',
type: 'string',
required: true,

View File

@@ -11,7 +11,7 @@ export default defineApp({
supportsConnections: true,
baseUrl: 'https://carbone.io',
apiBaseUrl: 'https://api.carbone.io',
primaryColor: '6f42c1',
primaryColor: '#6f42c1',
beforeRequest: [addAuthHeader],
auth,
actions,

View File

@@ -0,0 +1,72 @@
import defineAction from '../../../../helpers/define-action.js';
export default defineAction({
name: 'Create folder',
key: 'createFolder',
description: 'Creates a new folder.',
arguments: [
{
label: 'Workspace',
key: 'workspaceId',
type: 'dropdown',
required: true,
description: '',
variables: true,
source: {
type: 'query',
name: 'getDynamicData',
arguments: [
{
name: 'key',
value: 'listWorkspaces',
},
],
},
},
{
label: 'Space',
key: 'spaceId',
type: 'dropdown',
required: true,
dependsOn: ['parameters.workspaceId'],
description: '',
variables: true,
source: {
type: 'query',
name: 'getDynamicData',
arguments: [
{
name: 'key',
value: 'listSpaces',
},
{
name: 'parameters.workspaceId',
value: '{parameters.workspaceId}',
},
],
},
},
{
label: 'Folder Name',
key: 'folderName',
type: 'string',
required: true,
description: '',
variables: true,
},
],
async run($) {
const { spaceId, folderName } = $.step.parameters;
const body = {
name: folderName,
};
const { data } = await $.http.post(`/v2/space/${spaceId}/folder`, body);
$.setActionItem({
raw: data,
});
},
});

View File

@@ -0,0 +1,135 @@
import defineAction from '../../../../helpers/define-action.js';
export default defineAction({
name: 'Create list',
key: 'createList',
description: 'Creates a new list.',
arguments: [
{
label: 'Workspace',
key: 'workspaceId',
type: 'dropdown',
required: true,
description: '',
variables: true,
source: {
type: 'query',
name: 'getDynamicData',
arguments: [
{
name: 'key',
value: 'listWorkspaces',
},
],
},
},
{
label: 'Space',
key: 'spaceId',
type: 'dropdown',
required: true,
dependsOn: ['parameters.workspaceId'],
description: '',
variables: true,
source: {
type: 'query',
name: 'getDynamicData',
arguments: [
{
name: 'key',
value: 'listSpaces',
},
{
name: 'parameters.workspaceId',
value: '{parameters.workspaceId}',
},
],
},
},
{
label: 'Folder',
key: 'folderId',
type: 'dropdown',
required: true,
dependsOn: ['parameters.spaceId'],
description: '',
variables: true,
source: {
type: 'query',
name: 'getDynamicData',
arguments: [
{
name: 'key',
value: 'listFolders',
},
{
name: 'parameters.spaceId',
value: '{parameters.spaceId}',
},
],
},
},
{
label: 'List Name',
key: 'listName',
type: 'string',
required: true,
description: '',
variables: true,
},
{
label: 'List Info',
key: 'listInfo',
type: 'string',
required: false,
description: '',
variables: true,
},
{
label: 'Priority',
key: 'priority',
type: 'dropdown',
required: false,
description: '',
variables: true,
options: [
{ label: 'Urgent', value: 1 },
{ label: 'High', value: 2 },
{ label: 'Normal', value: 3 },
{ label: 'Low', value: 4 },
],
},
{
label: 'Due Date',
key: 'dueDate',
type: 'string',
required: false,
description: 'format: integer <int64>',
variables: true,
},
],
async run($) {
const { folderId, listName, listInfo, priority, dueDate } =
$.step.parameters;
const body = {
name: listName,
content: listInfo,
};
if (priority) {
body.priority = priority;
}
if (dueDate) {
body.due_date = dueDate;
}
const { data } = await $.http.post(`/v2/folder/${folderId}/list`, body);
$.setActionItem({
raw: data,
});
},
});

View File

@@ -0,0 +1,294 @@
import defineAction from '../../../../helpers/define-action.js';
export default defineAction({
name: 'Create task',
key: 'createTask',
description: 'Creates a new task.',
arguments: [
{
label: 'Workspace',
key: 'workspaceId',
type: 'dropdown',
required: true,
description: '',
variables: true,
source: {
type: 'query',
name: 'getDynamicData',
arguments: [
{
name: 'key',
value: 'listWorkspaces',
},
],
},
},
{
label: 'Space',
key: 'spaceId',
type: 'dropdown',
required: true,
dependsOn: ['parameters.workspaceId'],
description: '',
variables: true,
source: {
type: 'query',
name: 'getDynamicData',
arguments: [
{
name: 'key',
value: 'listSpaces',
},
{
name: 'parameters.workspaceId',
value: '{parameters.workspaceId}',
},
],
},
},
{
label: 'Folder',
key: 'folderId',
type: 'dropdown',
required: true,
dependsOn: ['parameters.spaceId'],
description: '',
variables: true,
source: {
type: 'query',
name: 'getDynamicData',
arguments: [
{
name: 'key',
value: 'listFolders',
},
{
name: 'parameters.spaceId',
value: '{parameters.spaceId}',
},
],
},
},
{
label: 'List',
key: 'listId',
type: 'dropdown',
required: true,
dependsOn: ['parameters.folderId'],
description: '',
variables: true,
source: {
type: 'query',
name: 'getDynamicData',
arguments: [
{
name: 'key',
value: 'listLists',
},
{
name: 'parameters.folderId',
value: '{parameters.folderId}',
},
],
},
},
{
label: 'Task Name',
key: 'taskName',
type: 'string',
required: true,
description: '',
variables: true,
},
{
label: 'Task Description',
key: 'taskDescription',
type: 'string',
required: false,
description: '',
variables: true,
},
{
label: 'Markdown Content',
key: 'markdownContent',
type: 'dropdown',
required: false,
description: '',
variables: true,
options: [
{ label: 'False', value: 'false' },
{ label: 'True', value: 'true' },
],
},
{
label: 'Assignees',
key: 'assigneeIds',
type: 'dynamic',
required: false,
description: '',
fields: [
{
label: 'Assignee',
key: 'assigneeId',
type: 'dropdown',
required: false,
dependsOn: ['parameters.listId'],
variables: true,
source: {
type: 'query',
name: 'getDynamicData',
arguments: [
{
name: 'key',
value: 'listAssignees',
},
{
name: 'parameters.listId',
value: '{parameters.listId}',
},
],
},
},
],
},
{
label: 'Task Status',
key: 'taskStatus',
type: 'dropdown',
required: false,
dependsOn: ['parameters.listId'],
description: '',
variables: true,
source: {
type: 'query',
name: 'getDynamicData',
arguments: [
{
name: 'key',
value: 'listStatuses',
},
{
name: 'parameters.listId',
value: '{parameters.listId}',
},
],
},
},
{
label: 'Tags',
key: 'tagIds',
type: 'dynamic',
required: false,
description: '',
fields: [
{
label: 'tag',
key: 'tagId',
type: 'dropdown',
required: false,
variables: true,
source: {
type: 'query',
name: 'getDynamicData',
arguments: [
{
name: 'key',
value: 'listTags',
},
],
},
},
],
},
{
label: 'Priority',
key: 'priority',
type: 'dropdown',
required: false,
description: '',
variables: true,
options: [
{ label: 'Urgent', value: 1 },
{ label: 'High', value: 2 },
{ label: 'Normal', value: 3 },
{ label: 'Low', value: 4 },
],
},
{
label: 'Due Date',
key: 'dueDate',
type: 'string',
required: false,
description: 'format: integer <int64>',
variables: true,
},
{
label: 'Start Date',
key: 'startDate',
type: 'string',
required: false,
description: 'format: integer <int64>',
variables: true,
},
],
async run($) {
const {
listId,
taskName,
taskDescription,
markdownContent,
assigneeIds,
taskStatus,
tagIds,
priority,
dueDate,
startDate,
} = $.step.parameters;
const tags = tagIds.map((tag) => tag.tagId);
const assignees = assigneeIds.map((assignee) =>
Number(assignee.assigneeId)
);
const body = {
name: taskName,
};
if (assignees.length) {
body.assignees = assignees;
}
if (taskStatus) {
body.status = taskStatus;
}
if (tags.length) {
body.tags = tags;
}
if (priority) {
body.priority = priority;
}
if (dueDate) {
body.due_date = dueDate;
}
if (startDate) {
body.start_date = startDate;
}
if (markdownContent) {
body.markdown_description = taskDescription;
} else {
body.description = taskDescription;
}
const { data } = await $.http.post(`/v2/list/${listId}/task`, body);
$.setActionItem({
raw: data,
});
},
});

View File

@@ -0,0 +1,82 @@
import defineAction from '../../../../helpers/define-action.js';
export default defineAction({
name: 'Find task by id',
key: 'findTaskById',
description: 'Finds a task using id.',
arguments: [
{
label: 'Task ID',
key: 'taskId',
type: 'string',
required: true,
description: '',
variables: true,
},
{
label: 'Use Custom ID',
key: 'useCustomId',
type: 'dropdown',
required: false,
description: '',
variables: true,
options: [
{
label: 'True',
value: true,
},
{
label: 'False',
value: false,
},
],
additionalFields: {
type: 'query',
name: 'getDynamicFields',
arguments: [
{
name: 'key',
value: 'listFieldsWhenUsingCustomId',
},
{
name: 'parameters.useCustomId',
value: '{parameters.useCustomId}',
},
],
},
},
{
label: 'Include Subtasks?',
key: 'includeSubtasks',
type: 'dropdown',
required: false,
description: '',
variables: true,
options: [
{
label: 'True',
value: true,
},
{
label: 'False',
value: false,
},
],
},
],
async run($) {
const { taskId, useCustomId, includeSubtasks } = $.step.parameters;
const params = {
custom_task_ids: useCustomId || false,
include_subtasks: includeSubtasks,
};
const { data } = await $.http.get(`/v2/task/${taskId}`, { params });
$.setActionItem({
raw: data,
});
},
});

View File

@@ -0,0 +1,6 @@
import createFolder from './create-folder/index.js';
import createList from './create-list/index.js';
import createTask from './create-task/index.js';
import findTaskById from './find-task-by-id/index.js';
export default [createFolder, createList, createTask, findTaskById];

View File

@@ -0,0 +1,27 @@
<svg width="185" height="185" viewBox="0 0 185 185" fill="none" xmlns="http://www.w3.org/2000/svg">
<g filter="url(#filter0_d)">
<rect x="30" y="20" width="125" height="125" rx="62.5" fill="white"/>
<rect x="30" y="20" width="125" height="125" rx="62.5" fill="white"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M55.8789 105.714L69.3974 95.3593C76.5762 104.732 84.1998 109.051 92.6948 109.051C101.143 109.051 108.557 104.781 115.414 95.4832L129.119 105.59C119.232 118.996 106.932 126.079 92.6948 126.079C78.5049 126.079 66.0907 119.046 55.8789 105.714Z" fill="url(#paint0_linear)"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M92.6491 60.7078L68.5883 81.4406L57.4727 68.5407L92.6969 38.1885L127.647 68.5644L116.477 81.417L92.6491 60.7078Z" fill="url(#paint1_linear)"/>
</g>
<defs>
<filter id="filter0_d" x="0" y="0" width="185" height="185" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0"/>
<feOffset dy="10"/>
<feGaussianBlur stdDeviation="15"/>
<feColorMatrix type="matrix" values="0 0 0 0 0.0627451 0 0 0 0 0.117647 0 0 0 0 0.211765 0 0 0 0.1 0"/>
<feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow"/>
<feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow" result="shape"/>
</filter>
<linearGradient id="paint0_linear" x1="55.8789" y1="116.251" x2="129.119" y2="116.251" gradientUnits="userSpaceOnUse">
<stop stop-color="#8930FD"/>
<stop offset="1" stop-color="#49CCF9"/>
</linearGradient>
<linearGradient id="paint1_linear" x1="57.4727" y1="67.6025" x2="127.647" y2="67.6025" gradientUnits="userSpaceOnUse">
<stop stop-color="#FF02F0"/>
<stop offset="1" stop-color="#FFC800"/>
</linearGradient>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 1.8 KiB

View File

@@ -0,0 +1,21 @@
import { URLSearchParams } from 'url';
export default async function generateAuthUrl($) {
const oauthRedirectUrlField = $.app.auth.fields.find(
(field) => field.key == 'oAuthRedirectUrl'
);
const redirectUri = oauthRedirectUrlField.value;
const state = Math.random().toString();
const searchParams = new URLSearchParams({
client_id: $.auth.data.clientId,
redirect_uri: redirectUri,
state,
});
const url = `https://app.clickup.com/api?${searchParams.toString()}`;
await $.auth.set({
url,
originalState: state,
});
}

View File

@@ -0,0 +1,46 @@
import generateAuthUrl from './generate-auth-url.js';
import verifyCredentials from './verify-credentials.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/clickup/connections/add',
placeholder: null,
description:
'When asked to input a redirect URL in ClickUp, 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,
};

View File

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

View File

@@ -0,0 +1,31 @@
import getCurrentUser from '../common/get-current-user.js';
const verifyCredentials = async ($) => {
if ($.auth.data.originalState !== $.auth.data.state) {
throw new Error(`The 'state' parameter does not match.`);
}
const { data } = await $.http.post('/v2/oauth/token', {
client_id: $.auth.data.clientId,
client_secret: $.auth.data.clientSecret,
code: $.auth.data.code,
});
await $.auth.set({
accessToken: data.access_token,
tokenType: data.token_type,
});
const currentUser = await getCurrentUser($);
const screenName = [currentUser.username, currentUser.email]
.filter(Boolean)
.join(' @ ');
await $.auth.set({
clientId: $.auth.data.clientId,
clientSecret: $.auth.data.clientSecret,
screenName,
});
};
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,6 @@
const getCurrentUser = async ($) => {
const { data } = await $.http.get('/v2/user');
return data.user;
};
export default getCurrentUser;

View File

@@ -0,0 +1,19 @@
import listAssignees from './list-assignees/index.js';
import listFolders from './list-folders/index.js';
import listLists from './list-lists/index.js';
import listSpaces from './list-spaces/index.js';
import listStatuses from './list-statuses/index.js';
import listTags from './list-tags/index.js';
import listTasks from './list-tasks/index.js';
import listWorkspaces from './list-workspaces/index.js';
export default [
listAssignees,
listFolders,
listLists,
listSpaces,
listStatuses,
listTags,
listTasks,
listWorkspaces,
];

View File

@@ -0,0 +1,28 @@
export default {
name: 'List assignees',
key: 'listAssignees',
async run($) {
const assignees = {
data: [],
};
const listId = $.step.parameters.listId;
if (!listId) {
return assignees;
}
const { data } = await $.http.get(`/v2/list/${listId}/member`);
if (data.members) {
for (const member of data.members) {
assignees.data.push({
value: member.id,
name: member.username,
});
}
}
return assignees;
},
};

View File

@@ -0,0 +1,28 @@
export default {
name: 'List folders',
key: 'listFolders',
async run($) {
const folders = {
data: [],
};
const spaceId = $.step.parameters.spaceId;
if (!spaceId) {
return folders;
}
const { data } = await $.http.get(`/v2/space/${spaceId}/folder`);
if (data.folders) {
for (const folder of data.folders) {
folders.data.push({
value: folder.id,
name: folder.name,
});
}
}
return folders;
},
};

View File

@@ -0,0 +1,28 @@
export default {
name: 'List lists',
key: 'listLists',
async run($) {
const lists = {
data: [],
};
const folderId = $.step.parameters.folderId;
if (!folderId) {
return lists;
}
const { data } = await $.http.get(`/v2/folder/${folderId}/list`);
if (data.lists) {
for (const list of data.lists) {
lists.data.push({
value: list.id,
name: list.name,
});
}
}
return lists;
},
};

View File

@@ -0,0 +1,28 @@
export default {
name: 'List spaces',
key: 'listSpaces',
async run($) {
const spaces = {
data: [],
};
const workspaceId = $.step.parameters.workspaceId;
if (!workspaceId) {
return spaces;
}
const { data } = await $.http.get(`/v2/team/${workspaceId}/space`);
if (data.spaces) {
for (const space of data.spaces) {
spaces.data.push({
value: space.id,
name: space.name,
});
}
}
return spaces;
},
};

View File

@@ -0,0 +1,28 @@
export default {
name: 'List statuses',
key: 'listStatuses',
async run($) {
const statuses = {
data: [],
};
const listId = $.step.parameters.listId;
if (!listId) {
return statuses;
}
const { data } = await $.http.get(`/v2/list/${listId}`);
if (data.statuses) {
for (const status of data.statuses) {
statuses.data.push({
value: status.status,
name: status.status,
});
}
}
return statuses;
},
};

View File

@@ -0,0 +1,28 @@
export default {
name: 'List tags',
key: 'listTags',
async run($) {
const tags = {
data: [],
};
const spaceId = $.step.parameters.spaceId;
if (!spaceId) {
return spaceId;
}
const { data } = await $.http.get(`v2/space/${spaceId}/tag`);
if (data.tags) {
for (const tag of data.tags) {
tags.data.push({
value: tag.name,
name: tag.name,
});
}
}
return tags;
},
};

View File

@@ -0,0 +1,41 @@
export default {
name: 'List tasks',
key: 'listTasks',
async run($) {
const tasks = {
data: [],
};
const listId = $.step.parameters.listId;
let next = false;
if (!listId) {
return tasks;
}
const params = {
order_by: 'created',
reverse: true,
};
do {
const { data } = await $.http.get(`/v2/list/${listId}/task`, { params });
if (data.last_page) {
next = false;
} else {
next = true;
}
if (data.tasks) {
for (const task of data.tasks) {
tasks.data.push({
value: task.id,
name: task.name,
});
}
}
} while (next);
return tasks;
},
};

View File

@@ -0,0 +1,23 @@
export default {
name: 'List workspaces',
key: 'listWorkspaces',
async run($) {
const workspaces = {
data: [],
};
const { data } = await $.http.get('/v2/team');
if (data.teams) {
for (const workspace of data.teams) {
workspaces.data.push({
value: workspace.id,
name: workspace.name,
});
}
}
return workspaces;
},
};

View File

@@ -0,0 +1,3 @@
import useCustomId from './use-custom-id/index.js';
export default [useCustomId];

View File

@@ -0,0 +1,29 @@
export default {
name: 'List workspaces when using custom id',
key: 'listFieldsWhenUsingCustomId',
async run($) {
if ($.step.parameters.useCustomId) {
return [
{
label: 'Workspace',
key: 'workspaceId',
type: 'dropdown',
required: true,
description: '',
variables: true,
source: {
type: 'query',
name: 'getDynamicData',
arguments: [
{
name: 'key',
value: 'listWorkspaces',
},
],
},
},
];
}
},
};

View File

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

View File

@@ -0,0 +1,6 @@
import newFolders from './new-folders/index.js';
import newLists from './new-lists/index.js';
import newTasks from './new-tasks/index.js';
import updatedTask from './updated-task/index.js';
export default [newFolders, newLists, newTasks, updatedTask];

View File

@@ -0,0 +1,105 @@
import Crypto from 'crypto';
import defineTrigger from '../../../../helpers/define-trigger.js';
export default defineTrigger({
name: 'New folders',
key: 'newFolder',
type: 'webhook',
description: 'Triggers when a new folder is created.',
arguments: [
{
label: 'Workspace',
key: 'workspaceId',
type: 'dropdown',
required: true,
description: '',
variables: true,
source: {
type: 'query',
name: 'getDynamicData',
arguments: [
{
name: 'key',
value: 'listWorkspaces',
},
],
},
},
{
label: 'Space',
key: 'spaceId',
type: 'dropdown',
required: false,
dependsOn: ['parameters.workspaceId'],
description: '',
variables: true,
source: {
type: 'query',
name: 'getDynamicData',
arguments: [
{
name: 'key',
value: 'listSpaces',
},
{
name: 'parameters.workspaceId',
value: '{parameters.workspaceId}',
},
],
},
},
],
async run($) {
const dataItem = {
raw: $.request.body,
meta: {
internalId: $.request.body.folder_id,
},
};
$.pushTriggerItem(dataItem);
},
async testRun($) {
const sampleEventData = {
event: 'folderCreated',
folder_id: '90180382912',
webhook_id: Crypto.randomUUID(),
};
const dataItem = {
raw: sampleEventData,
meta: {
internalId: '',
},
};
$.pushTriggerItem(dataItem);
},
async registerHook($) {
const { workspaceId, spaceId } = $.step.parameters;
const payload = {
name: $.flow.id,
endpoint: $.webhookUrl,
events: ['folderCreated'],
};
if (spaceId) {
payload.space_id = spaceId;
}
const { data } = await $.http.post(
`/v2/team/${workspaceId}/webhook`,
payload
);
await $.flow.setRemoteWebhookId(data.id);
},
async unregisterHook($) {
await $.http.delete(`/v2/webhook/${$.flow.remoteWebhookId}`);
},
});

View File

@@ -0,0 +1,129 @@
import Crypto from 'crypto';
import defineTrigger from '../../../../helpers/define-trigger.js';
export default defineTrigger({
name: 'New lists',
key: 'newLists',
type: 'webhook',
description: 'Triggers when a new list is created.',
arguments: [
{
label: 'Workspace',
key: 'workspaceId',
type: 'dropdown',
required: true,
description: '',
variables: true,
source: {
type: 'query',
name: 'getDynamicData',
arguments: [
{
name: 'key',
value: 'listWorkspaces',
},
],
},
},
{
label: 'Space',
key: 'spaceId',
type: 'dropdown',
required: false,
dependsOn: ['parameters.workspaceId'],
description: '',
variables: true,
source: {
type: 'query',
name: 'getDynamicData',
arguments: [
{
name: 'key',
value: 'listSpaces',
},
{
name: 'parameters.workspaceId',
value: '{parameters.workspaceId}',
},
],
},
},
{
label: 'Folder',
key: 'folderId',
type: 'dropdown',
required: false,
dependsOn: ['parameters.spaceId'],
description: '',
variables: true,
source: {
type: 'query',
name: 'getDynamicData',
arguments: [
{
name: 'key',
value: 'listFolders',
},
{
name: 'parameters.spaceId',
value: '{parameters.spaceId}',
},
],
},
},
],
async run($) {
const dataItem = {
raw: $.request.body,
meta: {
internalId: $.request.body.list_id,
},
};
$.pushTriggerItem(dataItem);
},
async testRun($) {
const sampleEventData = {
event: 'listCreated',
list_id: '901800588812',
webhook_id: Crypto.randomUUID(),
};
const dataItem = {
raw: sampleEventData,
meta: {
internalId: sampleEventData.webhook_id,
},
};
$.pushTriggerItem(dataItem);
},
async registerHook($) {
const { workspaceId, spaceId, folderId } = $.step.parameters;
const payload = {
name: $.flow.id,
endpoint: $.webhookUrl,
events: ['listCreated'],
space_id: spaceId,
};
if (folderId) {
payload.folder_id = folderId;
}
const { data } = await $.http.post(
`/v2/team/${workspaceId}/webhook`,
payload
);
await $.flow.setRemoteWebhookId(data.id);
},
async unregisterHook($) {
await $.http.delete(`/v2/webhook/${$.flow.remoteWebhookId}`);
},
});

View File

@@ -0,0 +1,186 @@
import Crypto from 'crypto';
import defineTrigger from '../../../../helpers/define-trigger.js';
export default defineTrigger({
name: 'New tasks',
key: 'newTasks',
type: 'webhook',
description: 'Triggers when a new task is created.',
arguments: [
{
label: 'Workspace',
key: 'workspaceId',
type: 'dropdown',
required: true,
description: '',
variables: true,
source: {
type: 'query',
name: 'getDynamicData',
arguments: [
{
name: 'key',
value: 'listWorkspaces',
},
],
},
},
{
label: 'Space',
key: 'spaceId',
type: 'dropdown',
required: false,
dependsOn: ['parameters.workspaceId'],
description: '',
variables: true,
source: {
type: 'query',
name: 'getDynamicData',
arguments: [
{
name: 'key',
value: 'listSpaces',
},
{
name: 'parameters.workspaceId',
value: '{parameters.workspaceId}',
},
],
},
},
{
label: 'Folder',
key: 'folderId',
type: 'dropdown',
required: false,
dependsOn: ['parameters.spaceId'],
description: '',
variables: true,
source: {
type: 'query',
name: 'getDynamicData',
arguments: [
{
name: 'key',
value: 'listFolders',
},
{
name: 'parameters.spaceId',
value: '{parameters.spaceId}',
},
],
},
},
{
label: 'List',
key: 'listId',
type: 'dropdown',
required: false,
dependsOn: ['parameters.folderId'],
description: '',
variables: true,
source: {
type: 'query',
name: 'getDynamicData',
arguments: [
{
name: 'key',
value: 'listLists',
},
{
name: 'parameters.folderId',
value: '{parameters.folderId}',
},
],
},
},
{
label: 'Task',
key: 'taskId',
type: 'dropdown',
required: false,
dependsOn: ['parameters.listId'],
description:
'Choose an optional task to determine when this flow should be activated. In this scenario, only subtasks will initiate this flow.',
variables: true,
source: {
type: 'query',
name: 'getDynamicData',
arguments: [
{
name: 'key',
value: 'listTasks',
},
{
name: 'parameters.listId',
value: '{parameters.listId}',
},
],
},
},
],
async run($) {
const dataItem = {
raw: $.request.body,
meta: {
internalId: $.request.body.task_id,
},
};
$.pushTriggerItem(dataItem);
},
async testRun($) {
const sampleEventData = {
event: 'taskCreated',
task_id: '86enn7pg7',
webhook_id: Crypto.randomUUID(),
history_items: [],
};
const dataItem = {
raw: sampleEventData,
meta: {
internalId: sampleEventData.webhook_id,
},
};
$.pushTriggerItem(dataItem);
},
async registerHook($) {
const { workspaceId, spaceId, folderId, listId, taskId } =
$.step.parameters;
const payload = {
name: $.flow.id,
endpoint: $.webhookUrl,
events: ['taskCreated'],
space_id: spaceId,
};
if (folderId) {
payload.folder_id = folderId;
}
if (listId) {
payload.list_id = listId;
}
if (taskId) {
payload.task_id = taskId;
}
const { data } = await $.http.post(
`/v2/team/${workspaceId}/webhook`,
payload
);
await $.flow.setRemoteWebhookId(data.id);
},
async unregisterHook($) {
await $.http.delete(`/v2/webhook/${$.flow.remoteWebhookId}`);
},
});

View File

@@ -0,0 +1,172 @@
import Crypto from 'crypto';
import defineTrigger from '../../../../helpers/define-trigger.js';
export default defineTrigger({
name: 'Updated task',
key: 'updatedTask',
type: 'webhook',
description: 'Triggers when a task is updated.',
arguments: [
{
label: 'Workspace',
key: 'workspaceId',
type: 'dropdown',
required: true,
description: '',
variables: true,
source: {
type: 'query',
name: 'getDynamicData',
arguments: [
{
name: 'key',
value: 'listWorkspaces',
},
],
},
},
{
label: 'Space',
key: 'spaceId',
type: 'dropdown',
required: false,
dependsOn: ['parameters.workspaceId'],
description: '',
variables: true,
source: {
type: 'query',
name: 'getDynamicData',
arguments: [
{
name: 'key',
value: 'listSpaces',
},
{
name: 'parameters.workspaceId',
value: '{parameters.workspaceId}',
},
],
},
},
{
label: 'Folder',
key: 'folderId',
type: 'dropdown',
required: false,
dependsOn: ['parameters.spaceId'],
description: '',
variables: true,
source: {
type: 'query',
name: 'getDynamicData',
arguments: [
{
name: 'key',
value: 'listFolders',
},
{
name: 'parameters.spaceId',
value: '{parameters.spaceId}',
},
],
},
},
{
label: 'List',
key: 'listId',
type: 'dropdown',
required: false,
dependsOn: ['parameters.folderId'],
description: '',
variables: true,
source: {
type: 'query',
name: 'getDynamicData',
arguments: [
{
name: 'key',
value: 'listLists',
},
{
name: 'parameters.folderId',
value: '{parameters.folderId}',
},
],
},
},
{
label: 'What Changed?',
key: 'whatChanged',
type: 'dropdown',
required: false,
variables: true,
options: [
{ label: 'Status', value: 'taskStatusUpdated' },
{ label: 'Assignee Added', value: 'taskAssigneeUpdated' },
{ label: 'Priority', value: 'taskPriorityUpdated' },
{ label: 'Tag Added', value: 'taskTagUpdated' },
],
},
],
async run($) {
const dataItem = {
raw: $.request.body,
meta: {
internalId: Crypto.randomUUID(),
},
};
$.pushTriggerItem(dataItem);
},
async testRun($) {
const sampleEventData = {
event: 'taskUpdated',
task_id: '86enn7pg7',
webhook_id: Crypto.randomUUID(),
history_items: [],
};
const dataItem = {
raw: sampleEventData,
meta: {
internalId: sampleEventData.webhook_id,
},
};
$.pushTriggerItem(dataItem);
},
async registerHook($) {
const { workspaceId, spaceId, folderId, listId, whatChanged } =
$.step.parameters;
const payload = {
name: $.flow.id,
endpoint: $.webhookUrl,
space_id: spaceId,
};
payload.events = [whatChanged || 'taskUpdated'];
if (folderId) {
payload.folder_id = folderId;
}
if (listId) {
payload.list_id = listId;
}
const { data } = await $.http.post(
`/v2/team/${workspaceId}/webhook`,
payload
);
await $.flow.setRemoteWebhookId(data.id);
},
async unregisterHook($) {
await $.http.delete(`/v2/webhook/${$.flow.remoteWebhookId}`);
},
});

View File

@@ -0,0 +1,3 @@
import runJavascript from './run-javascript/index.js';
export default [runJavascript];

View File

@@ -0,0 +1,84 @@
import defineAction from '../../../../helpers/define-action.js';
export default defineAction({
name: 'Run Javascript',
key: 'runJavascript',
description:
'Run browser Javascript code. You can not use NodeJS specific features and npm packages.',
arguments: [
{
label: 'Inputs',
key: 'inputs',
type: 'dynamic',
required: false,
description:
'To be able to use data from previous steps, you need to expose them as input entries. You can access these input values in your code by using the `inputs` argument.',
value: [
{
key: '',
value: '',
},
],
fields: [
{
label: 'Key',
key: 'key',
type: 'string',
required: true,
variables: true,
},
{
label: 'Value',
key: 'value',
type: 'string',
required: true,
variables: true,
valueType: 'parse',
},
],
},
{
label: 'Code Snippet',
key: 'codeSnippet',
type: 'code',
required: true,
variables: false,
value:
'const code = async (inputs) => { \n // E.g. if you have an input called username,\n // you can access its value by calling inputs.username\n // Return value will be used as output of this step.\n\n return true;\n};',
},
],
async run($) {
const { inputs = [], codeSnippet } = $.step.parameters;
const objectifiedInput = {};
for (const input of inputs) {
if (input.key) {
objectifiedInput[input.key] = input.value;
}
}
const ivm = (await import('isolated-vm')).default;
const isolate = new ivm.Isolate({ memoryLimit: 128 });
try {
const context = await isolate.createContext();
await context.global.set(
'inputs',
new ivm.ExternalCopy(objectifiedInput).copyInto()
);
const compiledCodeSnippet = await isolate.compileScript(
`${codeSnippet}; code(inputs);`
);
const codeFunction = await compiledCodeSnippet.run(context, {
reference: true,
promise: true,
});
$.setActionItem({ raw: { output: await codeFunction.copy() } });
} finally {
isolate.dispose();
}
},
});

View File

@@ -0,0 +1,5 @@
<svg xmlns="http://www.w3.org/2000/svg" width="800px" height="800px" viewBox="0 0 512 512">
<polyline points="160 368 32 256 160 144" style="fill:none;stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-width:32px"/>
<polyline points="352 368 480 256 352 144" style="fill:none;stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-width:32px"/>
<line x1="304" y1="96" x2="208" y2="416" style="fill:none;stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-width:32px"/>
</svg>

After

Width:  |  Height:  |  Size: 519 B

View File

@@ -0,0 +1,14 @@
import defineApp from '../../helpers/define-app.js';
import actions from './actions/index.js';
export default defineApp({
name: 'Code',
key: 'code',
baseUrl: '',
apiBaseUrl: '',
iconUrl: '{BASE_URL}/apps/code/assets/favicon.svg',
authDocUrl: '{DOCS_URL}/apps/code/connection',
primaryColor: '#000000',
supportsConnections: false,
actions,
});

View File

@@ -9,6 +9,6 @@ export default defineApp({
supportsConnections: false,
baseUrl: '',
apiBaseUrl: '',
primaryColor: '001F52',
primaryColor: '#001F52',
actions,
});

View File

@@ -9,6 +9,6 @@ export default defineApp({
supportsConnections: false,
baseUrl: '',
apiBaseUrl: '',
primaryColor: '001F52',
primaryColor: '#001F52',
actions,
});

View File

@@ -11,7 +11,7 @@ export default defineApp({
supportsConnections: true,
baseUrl: 'https://deepl.com',
apiBaseUrl: 'https://api.deepl.com',
primaryColor: '0d2d45',
primaryColor: '#0d2d45',
beforeRequest: [addAuthHeader],
auth,
actions,

View File

@@ -9,6 +9,6 @@ export default defineApp({
supportsConnections: false,
baseUrl: '',
apiBaseUrl: '',
primaryColor: '001F52',
primaryColor: '#001F52',
actions,
});

View File

@@ -14,7 +14,7 @@ export default defineApp({
supportsConnections: true,
baseUrl: 'https://discord.com',
apiBaseUrl: 'https://discord.com/api',
primaryColor: '5865f2',
primaryColor: '#5865f2',
beforeRequest: [addAuthHeader],
auth,
dynamicData,

View File

@@ -11,7 +11,7 @@ export default defineApp({
apiBaseUrl: 'https://disqus.com/api',
iconUrl: '{BASE_URL}/apps/disqus/assets/favicon.svg',
authDocUrl: '{DOCS_URL}/apps/disqus/connection',
primaryColor: '2E9FFF',
primaryColor: '#2E9FFF',
supportsConnections: true,
beforeRequest: [addAuthHeader],
auth,

View File

@@ -11,7 +11,7 @@ export default defineApp({
supportsConnections: true,
baseUrl: 'https://dropbox.com',
apiBaseUrl: 'https://api.dropboxapi.com',
primaryColor: '0061ff',
primaryColor: '#0061ff',
beforeRequest: [addAuthHeader],
auth,
actions,

View File

@@ -9,6 +9,6 @@ export default defineApp({
supportsConnections: false,
baseUrl: '',
apiBaseUrl: '',
primaryColor: '001F52',
primaryColor: '#001F52',
actions,
});

View File

@@ -10,7 +10,7 @@ export default defineApp({
iconUrl: '{BASE_URL}/apps/flickr/assets/favicon.svg',
authDocUrl: '{DOCS_URL}/apps/flickr/connection',
docUrl: 'https://automatisch.io/docs/flickr',
primaryColor: '000000',
primaryColor: '#000000',
supportsConnections: true,
baseUrl: 'https://www.flickr.com/',
apiBaseUrl: 'https://www.flickr.com/services',

View File

@@ -11,7 +11,7 @@ export default defineApp({
supportsConnections: true,
baseUrl: 'https://flowers-software.com',
apiBaseUrl: 'https://webapp.flowers-software.com/api',
primaryColor: '02AFC7',
primaryColor: '#02AFC7',
beforeRequest: [addAuthHeader],
auth,
triggers,

View File

@@ -10,7 +10,7 @@ export default defineApp({
supportsConnections: false,
baseUrl: '',
apiBaseUrl: '',
primaryColor: '001F52',
primaryColor: '#001F52',
actions,
dynamicFields,
});

View File

@@ -11,7 +11,7 @@ export default defineApp({
apiBaseUrl: '',
iconUrl: '{BASE_URL}/apps/ghost/assets/favicon.svg',
authDocUrl: '{DOCS_URL}/apps/ghost/connection',
primaryColor: '15171A',
primaryColor: '#15171A',
supportsConnections: true,
beforeRequest: [setBaseUrl, addAuthHeader],
auth,

View File

@@ -10,7 +10,7 @@ export default defineAction({
label: 'Repo',
key: 'repo',
type: 'dropdown',
required: false,
required: true,
variables: true,
source: {
type: 'query',

View File

@@ -12,7 +12,7 @@ export default defineApp({
apiBaseUrl: 'https://api.github.com',
iconUrl: '{BASE_URL}/apps/github/assets/favicon.svg',
authDocUrl: '{DOCS_URL}/apps/github/connection',
primaryColor: '000000',
primaryColor: '#000000',
supportsConnections: true,
beforeRequest: [addAuthHeader],
auth,

View File

@@ -12,7 +12,7 @@ export default defineApp({
apiBaseUrl: 'https://gitlab.com',
iconUrl: '{BASE_URL}/apps/gitlab/assets/favicon.svg',
authDocUrl: '{DOCS_URL}/apps/gitlab/connection',
primaryColor: 'FC6D26',
primaryColor: '#FC6D26',
supportsConnections: true,
beforeRequest: [setBaseUrl, addAuthHeader],
auth,

View File

@@ -11,7 +11,7 @@ export default defineApp({
apiBaseUrl: 'https://www.googleapis.com/calendar',
iconUrl: '{BASE_URL}/apps/google-calendar/assets/favicon.svg',
authDocUrl: '{DOCS_URL}/apps/google-calendar/connection',
primaryColor: '448AFF',
primaryColor: '#448AFF',
supportsConnections: true,
beforeRequest: [addAuthHeader],
auth,

View File

@@ -11,7 +11,7 @@ export default defineApp({
apiBaseUrl: 'https://www.googleapis.com/drive',
iconUrl: '{BASE_URL}/apps/google-drive/assets/favicon.svg',
authDocUrl: '{DOCS_URL}/apps/google-drive/connection',
primaryColor: '1FA463',
primaryColor: '#1FA463',
supportsConnections: true,
beforeRequest: [addAuthHeader],
auth,

View File

@@ -11,7 +11,7 @@ export default defineApp({
apiBaseUrl: 'https://forms.googleapis.com',
iconUrl: '{BASE_URL}/apps/google-forms/assets/favicon.svg',
authDocUrl: '{DOCS_URL}/apps/google-forms/connection',
primaryColor: '673AB7',
primaryColor: '#673AB7',
supportsConnections: true,
beforeRequest: [addAuthHeader],
auth,

View File

@@ -0,0 +1,175 @@
import defineAction from '../../../../helpers/define-action.js';
export default defineAction({
name: 'Find worksheet',
key: 'findWorksheet',
description:
'Finds a worksheet by title. Optionally, create a worksheet if none are found.',
arguments: [
{
label: 'Drive',
key: 'driveId',
type: 'dropdown',
required: false,
description:
'The Google Drive where your spreadsheet resides. If nothing is selected, then your personal Google Drive will be used.',
variables: true,
source: {
type: 'query',
name: 'getDynamicData',
arguments: [
{
name: 'key',
value: 'listDrives',
},
],
},
},
{
label: 'Spreadsheet',
key: 'spreadsheetId',
type: 'dropdown',
required: true,
dependsOn: ['parameters.driveId'],
variables: true,
source: {
type: 'query',
name: 'getDynamicData',
arguments: [
{
name: 'key',
value: 'listSpreadsheets',
},
{
name: 'parameters.driveId',
value: '{parameters.driveId}',
},
],
},
},
{
label: 'Title',
key: 'title',
type: 'string',
required: true,
description:
'The worksheet title needs to match exactly, and the search is case-sensitive.',
variables: true,
},
{
label: 'Create worksheet if none are found.',
key: 'createWorksheet',
type: 'dropdown',
required: false,
options: [
{ label: 'Yes', value: true },
{ label: 'No', value: false },
],
additionalFields: {
type: 'query',
name: 'getDynamicFields',
arguments: [
{
name: 'key',
value: 'listCreateWorksheetFields',
},
{
name: 'parameters.createWorksheet',
value: '{parameters.createWorksheet}',
},
],
},
},
],
async run($) {
const createWorksheet = $.step.parameters.createWorksheet;
async function findWorksheet() {
const {
data: { sheets },
} = await $.http.get(`/v4/spreadsheets/${$.step.parameters.spreadsheetId}`);
const selectedSheet = sheets.find(
(sheet) => sheet.properties.title === $.step.parameters.title
);
return selectedSheet;
}
const selectedSheet = await findWorksheet();
if (selectedSheet) {
$.setActionItem({
raw: selectedSheet,
});
return;
}
if (createWorksheet) {
const headers = $.step.parameters.headers;
const headerValues = headers.map((entry) => entry.header);
const body = {
requests: [
{
addSheet: {
properties: {
title: $.step.parameters.title,
},
},
},
],
};
const { data } = await $.http.post(
`/v4/spreadsheets/${$.step.parameters.spreadsheetId}:batchUpdate`,
body
);
if (headerValues.length) {
const body = {
requests: [
{
updateCells: {
rows: [
{
values: headerValues.map((header) => ({
userEnteredValue: { stringValue: header },
})),
},
],
fields: '*',
start: {
sheetId:
data.replies[data.replies.length - 1].addSheet.properties
.sheetId,
rowIndex: 0,
columnIndex: 0,
},
},
},
],
};
await $.http.post(
`/v4/spreadsheets/${$.step.parameters.spreadsheetId}:batchUpdate`,
body
);
const createdSheet = await findWorksheet();
$.setActionItem({
raw: createdSheet,
});
return;
}
}
$.setActionItem({
raw: null,
});
},
});

View File

@@ -1,5 +1,11 @@
import createSpreadsheet from './create-spreadsheet/index.js';
import createSpreadsheetRow from './create-spreadsheet-row/index.js';
import createWorksheet from './create-worksheet/index.js';
import findWorksheet from './find-worksheet/index.js';
export default [createSpreadsheet, createSpreadsheetRow, createWorksheet];
export default [
createSpreadsheet,
createSpreadsheetRow,
createWorksheet,
findWorksheet,
];

View File

@@ -1,3 +1,4 @@
import listSheetHeaders from './list-sheet-headers/index.js';
import listCreateWorksheetFields from './list-create-worksheet-fields/index.js';
export default [listSheetHeaders];
export default [listSheetHeaders, listCreateWorksheetFields];

View File

@@ -0,0 +1,26 @@
export default {
name: 'List create worksheet fields',
key: 'listCreateWorksheetFields',
async run($) {
if ($.step.parameters.createWorksheet) {
return [
{
label: 'Headers',
key: 'headers',
type: 'dynamic',
required: false,
fields: [
{
label: 'Header',
key: 'header',
type: 'string',
required: true,
variables: true,
},
],
},
];
}
},
};

View File

@@ -13,7 +13,7 @@ export default defineApp({
apiBaseUrl: 'https://sheets.googleapis.com',
iconUrl: '{BASE_URL}/apps/google-sheets/assets/favicon.svg',
authDocUrl: '{DOCS_URL}/apps/google-sheets/connection',
primaryColor: '0F9D58',
primaryColor: '#0F9D58',
supportsConnections: true,
beforeRequest: [addAuthHeader],
auth,

View File

@@ -12,7 +12,7 @@ export default defineApp({
apiBaseUrl: 'https://tasks.googleapis.com',
iconUrl: '{BASE_URL}/apps/google-tasks/assets/favicon.svg',
authDocUrl: '{DOCS_URL}/apps/google-tasks/connection',
primaryColor: '0066DA',
primaryColor: '#0066DA',
supportsConnections: true,
beforeRequest: [addAuthHeader],
auth,

View File

@@ -11,7 +11,7 @@ export default defineApp({
apiBaseUrl: 'https://app.tryhelix.ai',
iconUrl: '{BASE_URL}/apps/helix/assets/favicon.svg',
authDocUrl: '{DOCS_URL}/apps/helix/connection',
primaryColor: '000000',
primaryColor: '#000000',
supportsConnections: true,
beforeRequest: [setBaseUrl, addAuthHeader],
auth,

View File

@@ -145,6 +145,13 @@ export default defineAction({
responseData = Buffer.from(responseData).toString('base64');
}
$.setActionItem({ raw: { data: responseData } });
$.setActionItem({
raw: {
data: responseData,
headers: response.headers,
status: response.status,
statusText: response.statusText
}
});
},
});

View File

@@ -9,6 +9,6 @@ export default defineApp({
supportsConnections: false,
baseUrl: '',
apiBaseUrl: '',
primaryColor: '000000',
primaryColor: '#000000',
actions,
});

View File

@@ -11,7 +11,7 @@ export default defineApp({
supportsConnections: true,
baseUrl: 'https://www.hubspot.com',
apiBaseUrl: 'https://api.hubapi.com',
primaryColor: 'F95C35',
primaryColor: '#F95C35',
beforeRequest: [addAuthHeader],
auth,
actions,

View File

@@ -13,7 +13,7 @@ export default defineApp({
apiBaseUrl: 'https://invoicing.co/api',
iconUrl: '{BASE_URL}/apps/invoice-ninja/assets/favicon.svg',
authDocUrl: '{DOCS_URL}/apps/invoice-ninja/connection',
primaryColor: '000000',
primaryColor: '#000000',
supportsConnections: true,
beforeRequest: [setBaseUrl, addAuthHeader],
auth,

View File

@@ -0,0 +1 @@
<svg xmlns:xlink="http://www.w3.org/1999/xlink" class="jff-logo-img" width="53" height="59" viewBox="0 0 53 59" fill="none" xmlns="http://www.w3.org/2000/svg" aria-hidden="true"><path d="M14.4509 55.1332C15.5462 56.1951 14.7721 58.0143 13.2168 58.0143H3.4831C1.56265 58.0143 0 56.4995 0 54.6377V45.2017C0 43.6939 1.87664 42.9436 2.97195 44.0054L14.4509 55.1332Z" fill="#0A1551"></path><path d="M29.6655 55.8676C26.7843 53.0052 26.7843 48.3642 29.6655 45.5018L40.0638 35.1713C42.945 32.3089 47.6164 32.3089 50.4976 35.1713C53.3788 38.0338 53.3788 42.6747 50.4976 45.5371L40.0993 55.8676C37.2181 58.73 32.5468 58.73 29.6655 55.8676Z" fill="#FFB629"></path><path d="M2.1968 29.9101C-0.684414 27.0476 -0.684413 22.4067 2.1968 19.5443L19.696 2.14685C22.5772 -0.71559 27.2486 -0.715594 30.1298 2.14685C33.011 5.00929 33.011 9.65022 30.1298 12.5127L12.6306 29.9101C9.74937 32.7725 5.078 32.7725 2.1968 29.9101Z" fill="#0099FF"></path><path d="M16.5015 42.3095C13.6203 39.4471 13.6203 34.8062 16.5015 31.9437L40.1461 8.45322C43.0273 5.59079 47.6986 5.59079 50.5798 8.45322C53.4611 11.3157 53.4611 15.9566 50.5798 18.819L26.9353 42.3095C24.0541 45.1719 19.3827 45.1719 16.5015 42.3095Z" fill="#FF6100"></path></svg>

After

Width:  |  Height:  |  Size: 1.2 KiB

View File

@@ -0,0 +1,30 @@
import verifyCredentials from './verify-credentials.js';
import isStillVerified from './is-still-verified.js';
export default {
fields: [
{
key: 'apiUrl',
label: 'API URL',
type: 'string',
required: false,
readOnly: false,
value: 'https://api.jotform.com',
placeholder: 'https://${subdomain}.jotform.com/api',
clickToCopy: true,
},
{
key: 'apiKey',
label: 'API Key',
type: 'string',
required: true,
readOnly: false,
value: null,
placeholder: null,
clickToCopy: false,
},
],
verifyCredentials,
isStillVerified,
};

View File

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

View File

@@ -0,0 +1,12 @@
import getCurrentUser from '../common/get-current-user.js';
const verifyCredentials = async ($) => {
const user = await getCurrentUser($);
await $.auth.set({
screenName: user.name,
apiKey: $.auth.data.apiKey,
});
};
export default verifyCredentials;

View File

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

View File

@@ -0,0 +1,7 @@
const getCurrentUser = async ($) => {
const response = await $.http.get('/user');
const currentUser = response.data.content;
return currentUser;
};
export default getCurrentUser;

View File

@@ -0,0 +1,11 @@
const setBaseUrl = ($, requestConfig) => {
if ($.auth.data.apiUrl) {
requestConfig.baseURL = $.auth.data.apiUrl;
} else if ($.app.apiBaseUrl) {
requestConfig.baseURL = $.app.apiBaseUrl;
}
return requestConfig;
};
export default setBaseUrl;

View File

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

View File

@@ -0,0 +1,41 @@
export default {
name: 'List forms',
key: 'listForms',
async run($) {
const forms = {
data: [],
};
let hasMore = false;
const params = {
limit: 1000,
offset: 0,
orderby: 'created_at',
};
do {
const { data } = await $.http.get('/user/forms', { params });
params.offset = params.offset + params.limit;
if (data.content?.length) {
for (const form of data.content) {
if (form.status === 'ENABLED') {
forms.data.push({
value: form.id,
name: form.title,
});
}
}
}
if (data.resultSet.count >= data.resultSet.limit) {
hasMore = true;
} else {
hasMore = false;
}
} while (hasMore);
return forms;
},
};

View File

@@ -0,0 +1,21 @@
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 triggers from './triggers/index.js';
import dynamicData from './dynamic-data/index.js';
export default defineApp({
name: 'Jotform',
key: 'jotform',
iconUrl: '{BASE_URL}/apps/jotform/assets/favicon.svg',
authDocUrl: '{DOCS_URL}/apps/jotform/connection',
supportsConnections: true,
baseUrl: 'https://www.jotform.com',
apiBaseUrl: 'https://api.jotform.com',
primaryColor: '#FF6100',
beforeRequest: [setBaseUrl, addAuthHeader],
auth,
triggers,
dynamicData,
});

View File

@@ -0,0 +1,3 @@
import newSubmissions from './new-submissions/index.js';
export default [newSubmissions];

View File

@@ -0,0 +1,109 @@
import Crypto from 'crypto';
import { URLSearchParams } from 'url';
import defineTrigger from '../../../../helpers/define-trigger.js';
export default defineTrigger({
name: 'New submissions',
key: 'newSubmissions',
type: 'webhook',
description:
'Triggers when a new submission has been added to a specific form.',
arguments: [
{
label: 'Form',
key: 'formId',
type: 'dropdown',
required: true,
description: '',
variables: true,
source: {
type: 'query',
name: 'getDynamicData',
arguments: [
{
name: 'key',
value: 'listForms',
},
],
},
},
],
async run($) {
const dataItem = {
raw: $.request.body,
meta: {
internalId: Crypto.randomUUID(),
},
};
$.pushTriggerItem(dataItem);
},
async testRun($) {
const sampleEventData = {
ip: '127.0.0.1',
type: 'WEB',
appID: '',
event: '',
action: '',
formID: Crypto.randomUUID(),
parent: '',
pretty: 'Name:test, E-mail:user@automatisch.io',
teamID: '',
unread: '',
product: '',
subject: '',
isSilent: '',
username: 'username',
deviceIDs: 'Array',
formTitle: 'Opt-In Form-Get Free Email Updates!',
fromTable: '',
customBody: '',
documentID: '',
rawRequest: '',
webhookURL: '',
customTitle: '',
trackAction: 'Array',
customParams: '',
submissionID: Crypto.randomUUID(),
customBodyParams: 'Array',
customTitleParams: 'Array',
};
const dataItem = {
raw: sampleEventData,
meta: {
internalId: sampleEventData.submissionID,
},
};
$.pushTriggerItem(dataItem);
},
async registerHook($) {
const formId = $.step.parameters.formId;
const params = new URLSearchParams({
webhookURL: $.webhookUrl,
});
const { data } = await $.http.post(
`/form/${formId}/webhooks`,
params.toString()
);
await $.flow.setRemoteWebhookId(data.content[0]);
},
async unregisterHook($) {
const formId = $.step.parameters.formId;
const { data } = await $.http.get(`/form/${formId}/webhooks`);
const webhookURLs = Object.values(data.content);
const webhookId = webhookURLs.findIndex((url) => url === $.webhookUrl);
await $.http.delete(`/form/${formId}/webhooks/${webhookId}`);
},
});

View File

@@ -0,0 +1,180 @@
import defineAction from '../../../../helpers/define-action.js';
export default defineAction({
name: 'Create campaign',
key: 'createCampaign',
description: 'Creates a new campaign draft.',
arguments: [
{
label: 'Campaign Name',
key: 'campaignName',
type: 'string',
required: false,
description: '',
variables: true,
},
{
label: 'Audience',
key: 'audienceId',
type: 'dropdown',
required: true,
description: '',
variables: true,
source: {
type: 'query',
name: 'getDynamicData',
arguments: [
{
name: 'key',
value: 'listAudiences',
},
],
},
},
{
label: 'Segment or Tag',
key: 'segmentOrTagId',
type: 'dropdown',
required: false,
dependsOn: ['parameters.audienceId'],
description:
'Choose the specific segment or tag to which you"d like to direct the campaign. If no segment or tag is chosen, the campaign will be distributed to the entire audience previously selected.',
variables: true,
source: {
type: 'query',
name: 'getDynamicData',
arguments: [
{
name: 'key',
value: 'listSegmentsOrTags',
},
{
name: 'parameters.audienceId',
value: '{parameters.audienceId}',
},
],
},
},
{
label: 'Email Subject',
key: 'emailSubject',
type: 'string',
required: true,
description: '',
variables: true,
},
{
label: 'Preview Text',
key: 'previewText',
type: 'string',
required: false,
description:
'The snippet will be visible in the inbox following the subject line.',
variables: true,
},
{
label: 'From Name',
key: 'fromName',
type: 'string',
required: true,
description: 'The "from" name on the campaign (not an email address).',
variables: true,
},
{
label: 'From Email Address',
key: 'fromEmailAddress',
type: 'string',
required: true,
description: 'The reply-to email address for the campaign.',
variables: true,
},
{
label: 'To Name',
key: 'toName',
type: 'string',
required: false,
description:
'Supports *|MERGETAGS|* for recipient name, such as *|FNAME|*, *|LNAME|*, *|FNAME|* *|LNAME|*, etc.',
variables: true,
},
{
label: 'Template',
key: 'templateId',
type: 'dropdown',
required: false,
description:
'Select either a template or provide HTML email content, you cannot provide both. If both fields are left blank, the campaign draft will have no content.',
variables: true,
source: {
type: 'query',
name: 'getDynamicData',
arguments: [
{
name: 'key',
value: 'listTemplates',
},
],
},
},
{
label: 'Email Content (HTML)',
key: 'emailContent',
type: 'string',
required: false,
description:
'Select either a template or provide HTML email content, you cannot provide both. If both fields are left blank, the campaign draft will have no content.',
variables: true,
},
],
async run($) {
const {
campaignName,
audienceId,
segmentOrTagId,
emailSubject,
previewText,
fromName,
fromEmailAddress,
toName,
templateId,
emailContent,
} = $.step.parameters;
const body = {
type: 'regular',
recipients: {
list_id: audienceId,
segment_opts: {
saved_segment_id: Number(segmentOrTagId),
},
},
settings: {
subject_line: emailSubject,
reply_to: fromEmailAddress,
title: campaignName,
preview_text: previewText,
from_name: fromName,
to_name: toName,
},
};
const { data: campaign } = await $.http.post('/3.0/campaigns', body);
const campaignBody = {
template: {
id: Number(templateId),
},
html: emailContent,
};
const { data } = await $.http.put(
`/3.0/campaigns/${campaign.id}/content`,
campaignBody
);
$.setActionItem({
raw: data,
});
},
});

View File

@@ -0,0 +1,4 @@
import createCampaign from './create-campaign/index.js';
import sendCampaign from './send-campaign/index.js';
export default [createCampaign, sendCampaign];

View File

@@ -0,0 +1,39 @@
import defineAction from '../../../../helpers/define-action.js';
export default defineAction({
name: 'Send campaign',
key: 'sendCampaign',
description: 'Sends a campaign draft.',
arguments: [
{
label: 'Campaign',
key: 'campaignId',
type: 'dropdown',
required: true,
description: '',
variables: true,
source: {
type: 'query',
name: 'getDynamicData',
arguments: [
{
name: 'key',
value: 'listCampaigns',
},
],
},
},
],
async run($) {
const campaignId = $.step.parameters.campaignId;
await $.http.post(`/3.0/campaigns/${campaignId}/actions/send`);
$.setActionItem({
raw: {
output: 'sent',
},
});
},
});

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 5.0 KiB

View File

@@ -0,0 +1,19 @@
import { URLSearchParams } from 'url';
export default async function generateAuthUrl($) {
const oauthRedirectUrlField = $.app.auth.fields.find(
(field) => field.key == 'oAuthRedirectUrl'
);
const redirectUri = oauthRedirectUrlField.value;
const searchParams = new URLSearchParams({
response_type: 'code',
client_id: $.auth.data.clientId,
redirect_uri: redirectUri,
});
const url = `https://login.mailchimp.com/oauth2/authorize?${searchParams.toString()}`;
await $.auth.set({
url,
});
}

View File

@@ -0,0 +1,46 @@
import generateAuthUrl from './generate-auth-url.js';
import verifyCredentials from './verify-credentials.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/mailchimp/connections/add',
placeholder: null,
description:
'When asked to input a redirect URL in Mailchimp, 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,
};

View File

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

View File

@@ -0,0 +1,40 @@
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 params = new URLSearchParams({
grant_type: 'authorization_code',
client_id: $.auth.data.clientId,
client_secret: $.auth.data.clientSecret,
redirect_uri: redirectUri,
code: $.auth.data.code,
});
const { data } = await $.http.post(
'https://login.mailchimp.com/oauth2/token',
params.toString()
);
await $.auth.set({
accessToken: data.access_token,
tokenType: data.token_type,
});
const currentUser = await getCurrentUser($);
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,
serverPrefix: currentUser.dc,
screenName: currentUser.login.login_name,
});
};
export default verifyCredentials;

View File

@@ -0,0 +1,12 @@
const addAuthHeader = ($, requestConfig) => {
if (
!requestConfig.additionalProperties?.skipAddingAuthHeader &&
$.auth.data?.accessToken
) {
requestConfig.headers.Authorization = `Bearer ${$.auth.data.accessToken}`;
}
return requestConfig;
};
export default addAuthHeader;

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