From 094c6c0c2757e388a7f42512bba4356ebf3e9a2d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C4=B1dvan=20Akca?= Date: Sat, 20 Apr 2024 13:26:26 +0200 Subject: [PATCH] feat(firebase): add create firebase realtime database record action --- .../index.js | 100 ++++++++++++++++++ .../src/apps/firebase/actions/index.js | 7 +- packages/docs/pages/apps/firebase/actions.md | 2 + 3 files changed, 108 insertions(+), 1 deletion(-) create mode 100644 packages/backend/src/apps/firebase/actions/create-firebase-realtime-database-record/index.js diff --git a/packages/backend/src/apps/firebase/actions/create-firebase-realtime-database-record/index.js b/packages/backend/src/apps/firebase/actions/create-firebase-realtime-database-record/index.js new file mode 100644 index 00000000..fd53d590 --- /dev/null +++ b/packages/backend/src/apps/firebase/actions/create-firebase-realtime-database-record/index.js @@ -0,0 +1,100 @@ +import defineAction from '../../../../helpers/define-action.js'; + +export default defineAction({ + name: 'Create Firebase Realtime Database Record', + key: 'createFirebaseRealtimeDatabaseRecord', + description: 'Creates a child object within your Firebase Realtime Database.', + arguments: [ + { + label: 'Path', + key: 'path', + type: 'string', + required: true, + description: + "Indicate the path to the key of the object where the child objects to be queried are located, for example, 'foo/bar/here'.", + variables: true, + }, + { + 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: 'New ID', + key: 'newId', + type: 'string', + required: false, + description: + 'The key to use for this object, or leave it blank for Firebase to create one automatically.', + variables: true, + }, + { + label: 'Data', + key: 'childData', + 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($) { + let path = $.step.parameters.path; + const { convertNumerics, newId, childData } = $.step.parameters; + + if (newId) { + path = `${path}/${newId}.json`; + } else { + path = `${path}.json`; + } + + const formattedChildObjectData = childData.reduce((result, entry) => { + const key = entry?.key; + const value = entry?.value; + const isNumber = !isNaN(parseFloat(value)); + + if (isNumber && convertNumerics) { + result[key] = parseFloat(value); + } else { + result[key] = value; + } + + return result; + }, {}); + + const body = formattedChildObjectData; + + const { data } = await $.http.post(path, body, { + additionalProperties: { + setFirestoreBaseUrl: false, + }, + }); + + $.setActionItem({ + raw: data, + }); + }, +}); diff --git a/packages/backend/src/apps/firebase/actions/index.js b/packages/backend/src/apps/firebase/actions/index.js index db60e2f2..3112c6b6 100644 --- a/packages/backend/src/apps/firebase/actions/index.js +++ b/packages/backend/src/apps/firebase/actions/index.js @@ -1,4 +1,9 @@ import createCloudFirestoreDocument from './create-cloud-firestore-document/index.js'; +import createFirebaseRealtimeDatabaseRecord from './create-firebase-realtime-database-record/index.js'; import findCloudFirestoreDocument from './find-cloud-firestore-document/index.js'; -export default [createCloudFirestoreDocument, findCloudFirestoreDocument]; +export default [ + createCloudFirestoreDocument, + createFirebaseRealtimeDatabaseRecord, + findCloudFirestoreDocument, +]; diff --git a/packages/docs/pages/apps/firebase/actions.md b/packages/docs/pages/apps/firebase/actions.md index 8cd921d4..d99575ca 100644 --- a/packages/docs/pages/apps/firebase/actions.md +++ b/packages/docs/pages/apps/firebase/actions.md @@ -3,6 +3,8 @@ favicon: /favicons/firebase.svg items: - name: Create Cloud Firestore document desc: Creates a new document within a Cloud Firestore collection. + - name: Create Firebase Realtime Database Record + desc: Creates a child object within your Firebase Realtime Database. - name: Find Cloud Firestore document desc: Finds a document within a collection. ---