algolia-firebase-nodejs icon indicating copy to clipboard operation
algolia-firebase-nodejs copied to clipboard

Code for who need with Firestore (import and sync)

Open adrianoresende opened this issue 7 years ago • 1 comments

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);
  });
}

adrianoresende avatar Sep 11 '18 01:09 adrianoresende

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) }); });

MarioCodarin avatar Feb 08 '19 18:02 MarioCodarin