Skip to content

An adapter that replaces `Backbone.sync` to save to `Firebase Firestore` instead of using ajax.

License

Notifications You must be signed in to change notification settings

jeffreycahyono/backbone.firestore

Repository files navigation

Backbone Firebase FireStore Backend

Build Status Coverage Status npm version

An adapter that replaces Backbone.sync to save to Firebase Firestore instead of using ajax.

Usage

Import backbone.firestore and attach it to your models and collections:

const firebase = require("firebase");
require("firebase/firestore");
import {Collection, Model} from 'backbone';
import {FirestoreAdapter} from 'backbone.firestore';

firebase.initializeApp({
  apiKey: '### FIREBASE API KEY ###',
  authDomain: '### FIREBASE AUTH DOMAIN ###',
  projectId: '### CLOUD FIRESTORE PROJECT ID ###'
});

const SomeCollection = Collection.extend({

  /**
   * This collection will linked to Firestore collection which its name is
   * 'SomeCollection' => firebase.firestore().collection('SomeCollection')
   */
  firestore: new FirestoreAdapter('SomeCollection'), 

});

const SomeModel = Model.extend({

  /**
   * A model can also has firestore property linked to 
   * Firestore collection  'SomeCollection'
   */
  firestore: new FirestoreAdapter('SomeCollection')

});

To enable realtime update for subsequent changes, use subscriptionEnabled: true in the fetch options

const myModel = new SomeModel({ id: 1234 });
//any changes in firestore doc of id 1234 will also synced to myModel
myModel.fetch({subscriptionEnabled: true});

const myCol = new SomeCollection();
//any changes in firestore collection will also synced to myCol
myCol.fetch({ subscriptionEnabled: true });

To unsubscribe from realtime update

import { FirestoreAdapter, unsubscribeUpdate } from 'backbone.firestore';

//myModel won't sync to firestore document changes
unsubscribeUpdate(myModel);

//myCol won't sync to firestore collection / queries changes
unsubscribeUpdate(myCol);

To perform firestore query

const myCol = new SomeCollection();
let options = {
  //use firestoreQuery callback which its argument is CollectionReference and
  //return the query
  firestoreQuery = colRef => colRef.where('age', '<=', 50).orderBy('age')  
}
myCol.fetch(options);

To synchronise with the normal REST api server that uses backbone collection url property, you can pass the ajaxSync flag to any options:

const myModel = new SomeModel();
myModel.fetch({
  ajaxSync: true  // Fetches from the server
});

myModel.save({
  new: "value"
}, {
  ajaxSync: true  // Pushes back to the server
});

JavaScript ES5

var bbFirestore = require('backbone.firestore');
var FirestoreAdapter = bbFirestore.FirestoreAdapter;

JavaScript ES6+

import {FirestoreAdapter} from 'backbone.firestore';

Contributing

Install NodeJS and run yarn or npm i to get your dependencies, then:

  1. Open an issue identifying the fault
  2. Provide a fix, with tests demonstrating the issue
  3. Create .env in root project directory to provide the firebase firestore credentials. There is an example in .env.example
  4. Run npm test
  5. Create a pull request

Acknowledgments

About

An adapter that replaces `Backbone.sync` to save to `Firebase Firestore` instead of using ajax.

Topics

Resources

License

Stars

Watchers

Forks

Packages

No packages published