all files / documents/ stores.js

100% Statements 32/32
100% Branches 8/8
100% Functions 6/6
100% Lines 32/32
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76                                79× 79× 78× 78×   79×       122× 122× 122× 78× 78×   122×       79× 79×       122×   122× 122×   122× 122×   122× 79× 79× 79× 79×     122×       79× 79× 79×       79× 79× 78×   79×          
import Ember from 'ember';
import { object } from './util/computed';
import { destroyObject } from './util/destroy';
 
const {
  getOwner,
  assign
} = Ember;
 
export default Ember.Service.extend({
 
  openStores: object().readOnly(),
 
  _storeFactory: null,
  _adapterFactories: object(),
 
  storeFactory() {
    let Factory = this._storeFactory;
    if(!Factory) {
      Factory = getOwner(this).factoryFor('documents:store');
      this._storeFactory = Factory;
    }
    return Factory;
  },
 
  adapterFactory(name) {
    let factories = this.get('_adapterFactories');
    let factory = factories[name];
    if(!factory) {
      factory = getOwner(this).factoryFor(`documents:adapter/${name}`);
      factories[name] = factory;
    }
    return factory;
  },
 
  createStore(opts) {
    let stores = this;
    return this.storeFactory().create(assign({ stores }, opts));
  },
 
  store(opts) {
    opts = assign({ adapter: 'couch' }, opts);
 
    let Adapter = this.adapterFactory(opts.adapter);
    let identifier = Adapter.class.identifierFor(opts);
 
    let open = this.get('openStores');
    let store = open[identifier];
 
    if(!store) {
      let adapter = Adapter.create(assign({ identifier }, opts));
      opts = assign(opts, { adapter });
      store = this.createStore(opts);
      open[identifier] = store;
    }
 
    return store;
  },
 
  _storeWillDestroy(store) {
    let identifier = store.get('adapter.identifier');
    let openStores = this.get('openStores');
    delete openStores[identifier];
  },
 
  willDestroy() {
    let stores = this.cacheFor('openStores');
    if(stores) {
      destroyObject(stores);
    }
    this._super();
  }
 
});