From dff1c5e38798a8b71b5723e95ba17a7cc671b1e4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C4=B1dvan=20Akca?= Date: Fri, 1 Mar 2024 15:55:34 +0300 Subject: [PATCH] feat(firebase): add new documents within firestore collection trigger --- .../src/apps/firebase/dynamic-data/index.js | 3 + .../list-firestore-collections/index.js | 32 +++++++++ packages/backend/src/apps/firebase/index.js | 4 ++ .../src/apps/firebase/triggers/index.js | 3 + .../index.js | 66 +++++++++++++++++++ packages/docs/pages/.vitepress/config.js | 5 +- packages/docs/pages/apps/firebase/triggers.md | 12 ++++ packages/docs/pages/guide/available-apps.md | 1 + .../docs/pages/public/favicons/firestore.svg | 52 +++++++++++++++ 9 files changed, 177 insertions(+), 1 deletion(-) create mode 100644 packages/backend/src/apps/firebase/dynamic-data/index.js create mode 100644 packages/backend/src/apps/firebase/dynamic-data/list-firestore-collections/index.js create mode 100644 packages/backend/src/apps/firebase/triggers/index.js create mode 100644 packages/backend/src/apps/firebase/triggers/new-documents-within-firestore-collection/index.js create mode 100644 packages/docs/pages/apps/firebase/triggers.md create mode 100644 packages/docs/pages/public/favicons/firestore.svg diff --git a/packages/backend/src/apps/firebase/dynamic-data/index.js b/packages/backend/src/apps/firebase/dynamic-data/index.js new file mode 100644 index 00000000..02f38aa6 --- /dev/null +++ b/packages/backend/src/apps/firebase/dynamic-data/index.js @@ -0,0 +1,3 @@ +import listFirestoreCollections from './list-firestore-collections/index.js'; + +export default [listFirestoreCollections]; diff --git a/packages/backend/src/apps/firebase/dynamic-data/list-firestore-collections/index.js b/packages/backend/src/apps/firebase/dynamic-data/list-firestore-collections/index.js new file mode 100644 index 00000000..8ad0982b --- /dev/null +++ b/packages/backend/src/apps/firebase/dynamic-data/list-firestore-collections/index.js @@ -0,0 +1,32 @@ +export default { + name: 'List firestore collections', + key: 'listFirestoreCollections', + + async run($) { + const firestoreCollections = { + data: [], + }; + const projectId = $.auth.data.projectId; + + const { data } = await $.http.post( + `/v1/projects/${projectId}/databases/(default)/documents:listCollectionIds`, + null, + { + additionalProperties: { + setFirestoreBaseUrl: true, + }, + } + ); + + if (data.collectionIds?.length) { + for (const collectionId of data.collectionIds) { + firestoreCollections.data.push({ + value: collectionId, + name: collectionId, + }); + } + } + + return firestoreCollections; + }, +}; diff --git a/packages/backend/src/apps/firebase/index.js b/packages/backend/src/apps/firebase/index.js index 1f159526..34d7ac51 100644 --- a/packages/backend/src/apps/firebase/index.js +++ b/packages/backend/src/apps/firebase/index.js @@ -2,6 +2,8 @@ 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: 'Firebase', @@ -14,4 +16,6 @@ export default defineApp({ supportsConnections: true, beforeRequest: [setBaseUrl, addAuthHeader], auth, + triggers, + dynamicData, }); diff --git a/packages/backend/src/apps/firebase/triggers/index.js b/packages/backend/src/apps/firebase/triggers/index.js new file mode 100644 index 00000000..3f46f9b4 --- /dev/null +++ b/packages/backend/src/apps/firebase/triggers/index.js @@ -0,0 +1,3 @@ +import newDocumentsWithinFirestoreCollection from './new-documents-within-firestore-collection/index.js'; + +export default [newDocumentsWithinFirestoreCollection]; diff --git a/packages/backend/src/apps/firebase/triggers/new-documents-within-firestore-collection/index.js b/packages/backend/src/apps/firebase/triggers/new-documents-within-firestore-collection/index.js new file mode 100644 index 00000000..fe528d76 --- /dev/null +++ b/packages/backend/src/apps/firebase/triggers/new-documents-within-firestore-collection/index.js @@ -0,0 +1,66 @@ +import defineTrigger from '../../../../helpers/define-trigger.js'; + +export default defineTrigger({ + name: 'New documents within a firestore collection', + key: 'newDocumentsWithinFirestoreCollection', + pollInterval: 15, + description: + 'Triggers when a new document is added within a Cloud Firestore collection.', + arguments: [ + { + label: 'Collection', + key: 'collectionId', + type: 'dropdown', + required: true, + description: '', + variables: true, + source: { + type: 'query', + name: 'getDynamicData', + arguments: [ + { + name: 'key', + value: 'listFirestoreCollections', + }, + ], + }, + }, + ], + + async run($) { + const projectId = $.auth.data.projectId; + const collectionId = $.step.parameters.collectionId; + const params = { + pageSize: 100, + pageToken: undefined, + }; + + do { + const { data } = await $.http.get( + `/v1/projects/${projectId}/databases/(default)/documents/${collectionId}`, + { + params, + additionalProperties: { + setFirestoreBaseUrl: true, + }, + } + ); + params.pageToken = data.nextPageToken; + + if (!data?.documents?.length) { + return; + } + + for (const document of data.documents) { + const nameParts = document.name.split('/'); + const id = nameParts[nameParts.length - 1]; + $.pushTriggerItem({ + raw: document, + meta: { + internalId: id, + }, + }); + } + } while (params.pageToken); + }, +}); diff --git a/packages/docs/pages/.vitepress/config.js b/packages/docs/pages/.vitepress/config.js index 4fa96b2e..d524328d 100644 --- a/packages/docs/pages/.vitepress/config.js +++ b/packages/docs/pages/.vitepress/config.js @@ -99,7 +99,10 @@ export default defineConfig({ text: 'Firebase', collapsible: true, collapsed: true, - items: [{ text: 'Connection', link: '/apps/firebase/connection' }], + items: [ + { text: 'Triggers', link: '/apps/firebase/triggers' }, + { text: 'Connection', link: '/apps/firebase/connection' }, + ], }, { text: 'Flickr', diff --git a/packages/docs/pages/apps/firebase/triggers.md b/packages/docs/pages/apps/firebase/triggers.md new file mode 100644 index 00000000..234fab10 --- /dev/null +++ b/packages/docs/pages/apps/firebase/triggers.md @@ -0,0 +1,12 @@ +--- +favicon: /favicons/firebase.svg +items: + - name: New documents within a firestore collection + desc: Triggers when a new document is added within a Cloud Firestore collection. +--- + + + + diff --git a/packages/docs/pages/guide/available-apps.md b/packages/docs/pages/guide/available-apps.md index d0f7e7ee..084c1d56 100644 --- a/packages/docs/pages/guide/available-apps.md +++ b/packages/docs/pages/guide/available-apps.md @@ -9,6 +9,7 @@ The following integrations are currently supported by Automatisch. - [Discord](/apps/discord/actions) - [Dropbox](/apps/dropbox/actions) - [Filter](/apps/filter/actions) +- [Firebase](/apps/firebase/triggers) - [Flickr](/apps/flickr/triggers) - [Formatter](/apps/formatter/actions) - [Ghost](/apps/ghost/triggers) diff --git a/packages/docs/pages/public/favicons/firestore.svg b/packages/docs/pages/public/favicons/firestore.svg new file mode 100644 index 00000000..f396a8fd --- /dev/null +++ b/packages/docs/pages/public/favicons/firestore.svg @@ -0,0 +1,52 @@ + + + + logo_lockup_firebase_vertical + Created with Sketch. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file