How to remove records in store when they are not in server anymore


#1

I have application which may lost connection with server for days and when it finally reconnect some record exist in store didn’t exist in server any more.

I try to fix it but can’t get any where.

store.findall didn’t seems to have option to delete record not returned by server.

I can’t find ways to chain store.unloadAll and store.findAll without have the blank state take effect on the screen and cause flickering

I also can’t find out how to get what actually returned by server without go completely manual (make my own ajax calls,which won’t scale obviously)

I am wondering what everyone else is using to sync record in store with server.

Thanks for any help


#2

We use CouchDB as server and ember-pouch as ember-data adapter. This combination takes care of all your sync problems.


#3

I looked at it sometimes ago and although i like the idea, i really can’t figure out how to handle permissions if i sync the database to the client.


#4

Permissions can be done per DB so when we need secure we use a private database per user setup. It is no problem to have 2000 databases. We don’t use it but there is new tool for this called Spiegel. See also https://bloggr.exmer.com/secret (and try disconnecting from the internet)


#5

Seems find it, store.query will return what actually returned by server and i can manually unload the record now.

import DS from 'ember-data';
import _ from 'npm:lodash'

export default DS.Store.extend({
    reloadFromServer(modelName) {
        return this.query(modelName, {}).then((serverRecordArray) => {
            let storeRecordArray = this.peekAll(modelName)
            _.differenceBy(storeRecordArray.toArray(), serverRecordArray.toArray(), (i) => {
                return i.get('id');
            }).forEach((record) => {
                this.unloadRecord(record)
            })
            return this.peekAll(modelName)
        })
    }
});