algolia-firebase-nodejs
algolia-firebase-nodejs copied to clipboard
Code for who need with Firestore (import and sync)
This code is for Cloud Firestore, new version of Realtime database
Import
var dotenv = require('dotenv');
var firebaseAdmin = require("firebase-admin");
var algoliasearch = require('algoliasearch');
dotenv.load();
var serviceAccount = require("./serviceAccountKey.json");
firebaseAdmin.initializeApp({
credential: firebaseAdmin.credential.cert(serviceAccount),
databaseURL: process.env.FIREBASE_DATABASE_URL
});
var firestore = firebaseAdmin.firestore();
var algolia = algoliasearch(process.env.ALGOLIA_APP_ID, process.env.ALGOLIA_API_KEY);
var index = algolia.initIndex('contact');
var contactCollection = firestore.collection("/contact");
contactCollection.get().then(dataSnapshot => initialImport(dataSnapshot));
function initialImport(dataSnapshot) {
// Array of data to index
var objectsToIndex = [];
// Process each child Firebase object
dataSnapshot.docs.map(doc => {
// get the key and data from the snapshot
var childKey = doc.id;
var childData = doc.data();
// Specify Algolia's objectID using the Firebase object key
childData.objectID = childKey;
// Add object for indexing
objectsToIndex.push(childData);
})
// Add or update new objects
index.saveObjects(objectsToIndex, err => {
if (err) {
throw err;
}
console.log('Firestore <-> Algolia import done!');
process.exit(0);
});
}
Sync
var dotenv = require('dotenv');
var firebaseAdmin = require("firebase-admin");
var algoliasearch = require('algoliasearch');
dotenv.load();
var serviceAccount = require("./serviceAccountKey.json");
firebaseAdmin.initializeApp({
credential: firebaseAdmin.credential.cert(serviceAccount),
databaseURL: process.env.FIREBASE_DATABASE_URL
});
var firestore = firebaseAdmin.firestore();
var algolia = algoliasearch(process.env.ALGOLIA_APP_ID, process.env.ALGOLIA_API_KEY);
var index = algolia.initIndex('contact');
var contactCollection = firestore.collection("/contact");
contactCollection.onSnapshot(snapshot => {
snapshot.docChanges.forEach(change => {
if (change.type === 'added') addOrUpdateIndexRecord(change.doc)
if (change.type === 'modified') addOrUpdateIndexRecord(change.doc)
if (change.type === 'removed') deleteIndexRecord(change.doc)
});
});
function addOrUpdateIndexRecord(dataSnapshot) {
let firebaseObject = dataSnapshot.data();
// Specify Algolia's objectID using the Firebase object key
firebaseObject.objectID = dataSnapshot.id;
// Add or update object
index.saveObject(firebaseObject, err => {
if (err) {
throw err;
}
console.log('Firebase <-> Algolia object saved!', firebaseObject.objectID);
});
}
function deleteIndexRecord(dataSnapshot) {
// Get Algolia's objectID from the Firebase object key
const objectID = dataSnapshot.id;
// Remove the object from Algolia
index.deleteObject(objectID, err => {
if (err) {
throw err;
}
console.log('Firebase <-> Algolia object deleted!', objectID);
});
}
in
contactCollection.onSnapshot(snapshot => { snapshot.docChanges.forEach(change => { if (change.type === 'added') addOrUpdateIndexRecord(change.doc) if (change.type === 'modified') addOrUpdateIndexRecord(change.doc) if (change.type === 'removed') deleteIndexRecord(change.doc) }); });
docChanges should be a function so
contactCollection.onSnapshot(snapshot => { snapshot.docChanges().forEach(change => { if (change.type === 'added') addOrUpdateIndexRecord(change.doc) if (change.type === 'modified') addOrUpdateIndexRecord(change.doc) if (change.type === 'removed') deleteIndexRecord(change.doc) }); });