From 6e5c0cc0c77da1fe21e1363bc4d9cc13c9760119 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C4=B1dvan=20Akca?= Date: Thu, 25 Jan 2024 16:02:43 +0300 Subject: [PATCH] feat(appwrite): add new documents trigger --- .../src/apps/appwrite/dynamic-data/index.js | 4 + .../dynamic-data/list-collections/index.js | 33 ++++++++ .../dynamic-data/list-databases/index.js | 26 +++++++ packages/backend/src/apps/appwrite/index.js | 4 + .../src/apps/appwrite/triggers/index.js | 3 + .../appwrite/triggers/new-documents/index.js | 76 +++++++++++++++++++ packages/docs/pages/.vitepress/config.js | 5 +- packages/docs/pages/apps/appwrite/triggers.md | 12 +++ packages/docs/pages/guide/available-apps.md | 1 + 9 files changed, 163 insertions(+), 1 deletion(-) create mode 100644 packages/backend/src/apps/appwrite/dynamic-data/index.js create mode 100644 packages/backend/src/apps/appwrite/dynamic-data/list-collections/index.js create mode 100644 packages/backend/src/apps/appwrite/dynamic-data/list-databases/index.js create mode 100644 packages/backend/src/apps/appwrite/triggers/index.js create mode 100644 packages/backend/src/apps/appwrite/triggers/new-documents/index.js create mode 100644 packages/docs/pages/apps/appwrite/triggers.md diff --git a/packages/backend/src/apps/appwrite/dynamic-data/index.js b/packages/backend/src/apps/appwrite/dynamic-data/index.js new file mode 100644 index 00000000..45eecdb0 --- /dev/null +++ b/packages/backend/src/apps/appwrite/dynamic-data/index.js @@ -0,0 +1,4 @@ +import listCollections from './list-collections/index.js'; +import listDatabases from './list-databases/index.js'; + +export default [listCollections, listDatabases]; diff --git a/packages/backend/src/apps/appwrite/dynamic-data/list-collections/index.js b/packages/backend/src/apps/appwrite/dynamic-data/list-collections/index.js new file mode 100644 index 00000000..fa7eabd2 --- /dev/null +++ b/packages/backend/src/apps/appwrite/dynamic-data/list-collections/index.js @@ -0,0 +1,33 @@ +export default { + name: 'List collections', + key: 'listCollections', + + async run($) { + const collections = { + data: [], + }; + const databaseId = $.step.parameters.databaseId; + + if (!databaseId) { + return collections; + } + + const { data } = await $.http.get( + `/v1/databases/${databaseId}/collections` + ); + + if (data?.collections) { + const sortedCollections = data.collections.sort((a, b) => + a.$createdAt - b.$createdAt ? 1 : -1 + ); + for (const collection of sortedCollections) { + collections.data.push({ + value: collection.$id, + name: collection.name, + }); + } + } + + return collections; + }, +}; diff --git a/packages/backend/src/apps/appwrite/dynamic-data/list-databases/index.js b/packages/backend/src/apps/appwrite/dynamic-data/list-databases/index.js new file mode 100644 index 00000000..5cdd6107 --- /dev/null +++ b/packages/backend/src/apps/appwrite/dynamic-data/list-databases/index.js @@ -0,0 +1,26 @@ +export default { + name: 'List databases', + key: 'listDatabases', + + async run($) { + const databases = { + data: [], + }; + + const { data } = await $.http.get('/v1/databases'); + + if (data?.databases) { + const sortedDatabases = data.databases.sort((a, b) => + a.$createdAt - b.$createdAt ? 1 : -1 + ); + for (const database of sortedDatabases) { + databases.data.push({ + value: database.$id, + name: database.name, + }); + } + } + + return databases; + }, +}; diff --git a/packages/backend/src/apps/appwrite/index.js b/packages/backend/src/apps/appwrite/index.js index 77dd13cb..4fa30c75 100644 --- a/packages/backend/src/apps/appwrite/index.js +++ b/packages/backend/src/apps/appwrite/index.js @@ -2,6 +2,8 @@ import defineApp from '../../helpers/define-app.js'; import addAuthHeader from './common/add-auth-header.js'; import setBaseUrl from './common/set-base-url.js'; import auth from './auth/index.js'; +import triggers from './triggers/index.js'; +import dynamicData from './dynamic-data/index.js'; export default defineApp({ name: 'Appwrite', @@ -14,4 +16,6 @@ export default defineApp({ supportsConnections: true, beforeRequest: [setBaseUrl, addAuthHeader], auth, + triggers, + dynamicData, }); diff --git a/packages/backend/src/apps/appwrite/triggers/index.js b/packages/backend/src/apps/appwrite/triggers/index.js new file mode 100644 index 00000000..30d4b6cc --- /dev/null +++ b/packages/backend/src/apps/appwrite/triggers/index.js @@ -0,0 +1,3 @@ +import newDocuments from './new-documents/index.js'; + +export default [newDocuments]; diff --git a/packages/backend/src/apps/appwrite/triggers/new-documents/index.js b/packages/backend/src/apps/appwrite/triggers/new-documents/index.js new file mode 100644 index 00000000..97ac66d2 --- /dev/null +++ b/packages/backend/src/apps/appwrite/triggers/new-documents/index.js @@ -0,0 +1,76 @@ +import defineTrigger from '../../../../helpers/define-trigger.js'; + +export default defineTrigger({ + name: 'New documents', + key: 'newDocuments', + pollInterval: 15, + description: 'Triggers when a new document is created.', + arguments: [ + { + label: 'Database', + key: 'databaseId', + type: 'dropdown', + required: true, + description: '', + variables: true, + source: { + type: 'query', + name: 'getDynamicData', + arguments: [ + { + name: 'key', + value: 'listDatabases', + }, + ], + }, + }, + { + label: 'Collection', + key: 'collectionId', + type: 'dropdown', + required: true, + dependsOn: ['parameters.databaseId'], + description: '', + variables: true, + source: { + type: 'query', + name: 'getDynamicData', + arguments: [ + { + name: 'key', + value: 'listCollections', + }, + { + name: 'parameters.databaseId', + value: '{parameters.databaseId}', + }, + ], + }, + }, + ], + + async run($) { + const { databaseId, collectionId } = $.step.parameters; + + const { data } = await $.http.get( + `/v1/databases/${databaseId}/collections/${collectionId}/documents` + ); + + if (!data?.documents?.length) { + return; + } + + const sortedDocuments = data.documents.sort((a, b) => + a.$createdAt - b.$createdAt ? 1 : -1 + ); + + for (const document of sortedDocuments) { + $.pushTriggerItem({ + raw: document, + meta: { + internalId: document.$id, + }, + }); + } + }, +}); diff --git a/packages/docs/pages/.vitepress/config.js b/packages/docs/pages/.vitepress/config.js index 2c1208ea..219a1d51 100644 --- a/packages/docs/pages/.vitepress/config.js +++ b/packages/docs/pages/.vitepress/config.js @@ -45,7 +45,10 @@ export default defineConfig({ text: 'Appwrite', collapsible: true, collapsed: true, - items: [{ text: 'Connection', link: '/apps/appwrite/connection' }], + items: [ + { text: 'Triggers', link: '/apps/appwrite/triggers' }, + { text: 'Connection', link: '/apps/appwrite/connection' }, + ], }, { text: 'Carbone', diff --git a/packages/docs/pages/apps/appwrite/triggers.md b/packages/docs/pages/apps/appwrite/triggers.md new file mode 100644 index 00000000..2177a8a9 --- /dev/null +++ b/packages/docs/pages/apps/appwrite/triggers.md @@ -0,0 +1,12 @@ +--- +favicon: /favicons/appwrite.svg +items: + - name: New documets + desc: Triggers when a new document is created. +--- + + + + diff --git a/packages/docs/pages/guide/available-apps.md b/packages/docs/pages/guide/available-apps.md index 40d2ad18..ad2b4c0c 100644 --- a/packages/docs/pages/guide/available-apps.md +++ b/packages/docs/pages/guide/available-apps.md @@ -3,6 +3,7 @@ The following integrations are currently supported by Automatisch. - [Airtable](/apps/airtable/actions) +- [Appwrite](/apps/appwrite/triggers) - [Carbone](/apps/carbone/actions) - [Datastore](/apps/datastore/actions) - [DeepL](/apps/deepl/actions)