From 910563b5cbbbda5201b46a558067e9971dd4bb31 Mon Sep 17 00:00:00 2001 From: Shams mosowi Date: Fri, 7 Feb 2020 07:37:21 +1100 Subject: [PATCH] Feat: algolia firestore trigger integration --- .../functions/src/algolia/algoliaConfig.ts | 44 ++++++++++++++++ .../src/algolia/collectionsConfig.ts | 18 ------- .../functions/src/algolia/index.ts | 50 +++++++++++-------- cloud_functions/functions/src/index.ts | 7 ++- cloud_functions/node_modules/.yarn-integrity | 10 ++++ 5 files changed, 88 insertions(+), 41 deletions(-) create mode 100644 cloud_functions/functions/src/algolia/algoliaConfig.ts delete mode 100644 cloud_functions/functions/src/algolia/collectionsConfig.ts create mode 100644 cloud_functions/node_modules/.yarn-integrity diff --git a/cloud_functions/functions/src/algolia/algoliaConfig.ts b/cloud_functions/functions/src/algolia/algoliaConfig.ts new file mode 100644 index 00000000..fcf14fa8 --- /dev/null +++ b/cloud_functions/functions/src/algolia/algoliaConfig.ts @@ -0,0 +1,44 @@ +const algoliaConfig = [ + { + name: "founders", + fieldsToSync: [ + "firstName", + "lastName", + "founderType", + "cohort", + "employerLogos", + ], + }, + { + name: "advisors", + fieldsToSync: [ + "firstName", + "lastName", + "location", + "title", + "type", + "bio", + "linkedIn", + "expertise", + "profilePhoto", + "bookingLink", + "twitter", + "antlerPoc", + ], + }, + { + name: "portfolio", + fieldsToSync: [ + "cohort", + "companyName", + "oneLine", + "logo", + "website", + "crunchbase", + "angelList", + "sector", + ], + }, +]; + +export default algoliaConfig; diff --git a/cloud_functions/functions/src/algolia/collectionsConfig.ts b/cloud_functions/functions/src/algolia/collectionsConfig.ts deleted file mode 100644 index f7e0f667..00000000 --- a/cloud_functions/functions/src/algolia/collectionsConfig.ts +++ /dev/null @@ -1,18 +0,0 @@ -const algoliaConfig = [ - { name: "founders" }, - { - name: "portfolio", - fieldsToSync: [ - "cohort", - "company", - "oneLine", - "logo", - "website", - "crunchbase", - "angelList", - "sector", - ], - }, -]; - -export default algoliaConfig; diff --git a/cloud_functions/functions/src/algolia/index.ts b/cloud_functions/functions/src/algolia/index.ts index 194f9c4f..55ea2891 100644 --- a/cloud_functions/functions/src/algolia/index.ts +++ b/cloud_functions/functions/src/algolia/index.ts @@ -2,60 +2,68 @@ import * as algoliasearch from "algoliasearch"; import * as functions from "firebase-functions"; import { env } from "../config"; -import collectionsConfig from "./collectionsConfig"; + const APP_ID = env.algolia.app; const ADMIN_KEY = env.algolia.key; const client = algoliasearch(APP_ID, ADMIN_KEY); // returns object of fieldsToSync -const algoliaReducer = docData => (acc: any, curr: string) => { - if (docData[curr]) return { ...acc, [curr]: docData[curr] }; +const algoliaReducer = (docData: FirebaseFirestore.DocumentData) => ( + acc: any, + curr: string +) => { + if (docData?.[curr]) return { ...acc, [curr]: docData[curr] }; else return acc; }; -const addToAlgolia = (fieldsToSync?: string[]) => ( +const addToAlgolia = (fieldsToSync: string[]) => ( snapshot: FirebaseFirestore.DocumentSnapshot ) => { const collectionName = snapshot.ref.parent.id; const objectID = snapshot.id; const docData = snapshot.data(); - const index = client.initIndex(collectionName); - if (fieldsToSync === undefined) - return index.addObject({ ...docData, objectID }); + if (!docData) return false; // returns if theres no data in the doc const algoliaData = fieldsToSync.reduce(algoliaReducer(docData), {}); - return index.addObject({ ...algoliaData, objectID }); + if (Object.keys(algoliaData).length === 0) return false; // returns if theres nothing to sync + const index = client.initIndex(collectionName); // initialize algolia index + return index.addObject({ ...algoliaData, objectID }); // add new algolia entry }; -const updateAlgolia = (fieldsToSync?: string[]) => ( +const updateAlgolia = (fieldsToSync: string[]) => ( snapshot: functions.Change ) => { const collectionName = snapshot.after.ref.parent.id; const objectID = snapshot.after.id; const docData = snapshot.after.data(); - const index = client.initIndex(collectionName); - - if (fieldsToSync === undefined) - return index.saveObject({ ...docData, objectID }); + if (!docData) return false; // returns if theres no data in the doc const algoliaData = fieldsToSync.reduce(algoliaReducer(docData), {}); - return index.addObject({ ...algoliaData, objectID }); + if (Object.keys(algoliaData).length === 0) return false; // returns if theres nothing to sync + const index = client.initIndex(collectionName); // initialize algolia index + return index.saveObject({ ...algoliaData, objectID }); // add update algolia entry }; const deleteFromAlgolia = (snapshot: FirebaseFirestore.DocumentSnapshot) => { const collectionName = snapshot.ref.parent.id; const objectID = snapshot.id; - const index = client.initIndex(collectionName); - return index.deleteObject(objectID); + const index = client.initIndex(collectionName); // initialize algolia index + return index.deleteObject(objectID); // delete algolia entry }; -module.exports = collectionsConfig.map(collection => ({ - [`${collection.name}_onCreate`]: functions.firestore +/** + * returns 3 different trigger functions (onCreate,onUpdate,onDelete) in an object + * @param collection configuration object + */ +const algoliaFnsGenerator = collection => ({ + onCreate: functions.firestore .document(`${collection.name}/{docId}`) .onCreate(addToAlgolia(collection.fieldsToSync)), - [`${collection.name}_onUpdate`]: functions.firestore + onUpdate: functions.firestore .document(`${collection.name}/{docId}`) .onUpdate(updateAlgolia(collection.fieldsToSync)), - [`${collection.name}_onDelete`]: functions.firestore + onDelete: functions.firestore .document(`${collection.name}/{docId}`) .onDelete(deleteFromAlgolia), -})); +}); + +export default algoliaFnsGenerator; diff --git a/cloud_functions/functions/src/index.ts b/cloud_functions/functions/src/index.ts index 94b36b8d..fc365a2e 100644 --- a/cloud_functions/functions/src/index.ts +++ b/cloud_functions/functions/src/index.ts @@ -1,3 +1,6 @@ export { exportTable } from "./export"; -import * as algoliaFunctions from "./algolia"; -export const ALGOLIA = { ...algoliaFunctions }; +import algoliaFnsGenerator from "./algolia"; +import algoliaConfig from "./algolia/algoliaConfig"; +export const algolia = algoliaConfig.reduce((acc: any, collection) => { + return { ...acc, [collection.name]: algoliaFnsGenerator(collection) }; +}, {}); diff --git a/cloud_functions/node_modules/.yarn-integrity b/cloud_functions/node_modules/.yarn-integrity new file mode 100644 index 00000000..02fe3e7a --- /dev/null +++ b/cloud_functions/node_modules/.yarn-integrity @@ -0,0 +1,10 @@ +{ + "systemParams": "darwin-x64-64", + "modulesFolders": [], + "flags": [], + "linkedModules": [], + "topLevelPatterns": [], + "lockfileEntries": {}, + "files": [], + "artifacts": {} +} \ No newline at end of file