From d6b9410932af5ec170a63c6e2b127529466b5d34 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C4=B1dvan=20Akca?= Date: Fri, 1 Mar 2024 16:19:35 +0300 Subject: [PATCH] feat(firebase): add create cloud firestore document action --- .../create-cloud-firestore-document/index.js | 116 ++++++++++++++++++ .../src/apps/firebase/actions/index.js | 3 + packages/backend/src/apps/firebase/index.js | 2 + packages/docs/pages/.vitepress/config.js | 1 + packages/docs/pages/apps/firebase/actions.md | 12 ++ 5 files changed, 134 insertions(+) create mode 100644 packages/backend/src/apps/firebase/actions/create-cloud-firestore-document/index.js create mode 100644 packages/backend/src/apps/firebase/actions/index.js create mode 100644 packages/docs/pages/apps/firebase/actions.md diff --git a/packages/backend/src/apps/firebase/actions/create-cloud-firestore-document/index.js b/packages/backend/src/apps/firebase/actions/create-cloud-firestore-document/index.js new file mode 100644 index 00000000..fa53ba62 --- /dev/null +++ b/packages/backend/src/apps/firebase/actions/create-cloud-firestore-document/index.js @@ -0,0 +1,116 @@ +import defineAction from '../../../../helpers/define-action.js'; + +export default defineAction({ + name: 'Create Cloud Firestore document', + key: 'createCloudFirestoreDocument', + description: 'Creates a new document 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', + }, + ], + }, + }, + { + label: 'Convert Numerics', + key: 'convertNumerics', + type: 'dropdown', + required: false, + description: + "If any value represents a valid numerical value, whether it's an integer or a floating-point number, this field directs the database to store it as a numeric data type instead of a string.", + variables: true, + options: [ + { label: 'Yes', value: true }, + { label: 'No', value: false }, + ], + }, + { + label: 'Document ID', + key: 'documentId', + type: 'string', + required: false, + description: + 'The document ID to use for this document. If not specified, an ID will be assigned.', + variables: true, + }, + { + label: 'Document Data', + key: 'documentData', + type: 'dynamic', + required: false, + description: '', + fields: [ + { + label: 'Key', + key: 'key', + type: 'string', + required: false, + variables: true, + }, + { + label: 'Value', + key: 'value', + type: 'string', + required: false, + variables: true, + }, + ], + }, + ], + + async run($) { + const projectId = $.auth.data.projectId; + const { collectionId, documentId, documentData, convertNumerics } = + $.step.parameters; + + const documentDataObject = documentData.reduce((result, entry) => { + const key = entry.key?.toLowerCase(); + const value = entry.value; + const isNumber = !isNaN(parseFloat(value)); + + if (key && value) { + const formattedValue = + convertNumerics && isNumber + ? { integerValue: parseFloat(value) } + : { stringValue: value }; + + return { + ...result, + [key]: formattedValue, + }; + } + + return result; + }, {}); + + const body = { + fields: documentDataObject, + }; + + const { data } = await $.http.post( + `/v1/projects/${projectId}/databases/(default)/documents/${collectionId}?documentId=${documentId}`, + body, + { + additionalProperties: { + setFirestoreBaseUrl: true, + }, + } + ); + + $.setActionItem({ + raw: data, + }); + }, +}); diff --git a/packages/backend/src/apps/firebase/actions/index.js b/packages/backend/src/apps/firebase/actions/index.js new file mode 100644 index 00000000..dfe900d2 --- /dev/null +++ b/packages/backend/src/apps/firebase/actions/index.js @@ -0,0 +1,3 @@ +import createCloudFirestoreDocument from './create-cloud-firestore-document/index.js'; + +export default [createCloudFirestoreDocument]; diff --git a/packages/backend/src/apps/firebase/index.js b/packages/backend/src/apps/firebase/index.js index 34d7ac51..2226f89a 100644 --- a/packages/backend/src/apps/firebase/index.js +++ b/packages/backend/src/apps/firebase/index.js @@ -4,6 +4,7 @@ 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'; +import actions from './actions/index.js'; export default defineApp({ name: 'Firebase', @@ -18,4 +19,5 @@ export default defineApp({ auth, triggers, dynamicData, + actions, }); diff --git a/packages/docs/pages/.vitepress/config.js b/packages/docs/pages/.vitepress/config.js index d524328d..15146bc8 100644 --- a/packages/docs/pages/.vitepress/config.js +++ b/packages/docs/pages/.vitepress/config.js @@ -100,6 +100,7 @@ export default defineConfig({ collapsible: true, collapsed: true, items: [ + { text: 'Actions', link: '/apps/firebase/actions' }, { text: 'Triggers', link: '/apps/firebase/triggers' }, { text: 'Connection', link: '/apps/firebase/connection' }, ], diff --git a/packages/docs/pages/apps/firebase/actions.md b/packages/docs/pages/apps/firebase/actions.md new file mode 100644 index 00000000..37ad1b2d --- /dev/null +++ b/packages/docs/pages/apps/firebase/actions.md @@ -0,0 +1,12 @@ +--- +favicon: /favicons/firebase.svg +items: + - name: Create Cloud Firestore document + desc: Creates a new document within a Cloud Firestore collection. +--- + + + +