diff -r 1f340f3597a8 -r ea92f4fe783d client/src/sagas/BaseSyncronizer.js --- a/client/src/sagas/BaseSyncronizer.js Tue Oct 09 19:07:47 2018 +0200 +++ b/client/src/sagas/BaseSyncronizer.js Mon Oct 08 18:35:47 2018 +0200 @@ -1,5 +1,9 @@ -import { put } from 'redux-saga/effects' -import Immutable from 'immutable'; +import { put } from 'redux-saga/effects'; +import * as R from 'ramda'; +import { ActionEnum } from '../constants'; + +const testLocalListHas = R.useWith(R.compose,[R.contains, R.prop]); +const getPropValues = R.compose(R.values, R.prop); export const SyncMixin = Base => class extends Base { @@ -10,32 +14,9 @@ this.localDiffs = null; } - // abstract methods - - // local diffs (immutable) - // getLocalDiffs() - - // remote urls - // getRemoteLoadUrl() - // getRemoteDeleteUrl(localObjInst); - // getRemoteCreateUrl(localObjInst) - // getRemoteUpdateUrl(localObjInst) - - // build remote json message - // getRemoteData(localObjInst) - // getLocalRecord(remoteObj) - - // actions - // doDeleteLocalObj(localObjId); - // resetLocalObj(localObjInst) - // loadObj(objRecord) - * loadFromRemote() { - - const objIds = this.syncEntries - .filter((syncEntry) => syncEntry.action !== 2) - .map((syncEntry) => syncEntry.ext_id); + const objIds = R.compose(R.map(R.prop('ext_id')),R.reject(R.propEq('action', ActionEnum.UPDATED)))(this.syncEntries); if(objIds.length === 0) { return ; @@ -46,23 +27,27 @@ for (var remoteObj of remoteObjs.results) { - if(this.localDiffs.get('deleted').has(remoteObj.ext_id)) { + if(testLocalListHas(remoteObj.ext_id, 'deleted')(this.localDiffs)) { + // if(this.localDiffs.get('deleted').has(remoteObj.ext_id)) { // The session has been deleted locally, we will delete it later continue; } - if(this.localDiffs.get('created').has(remoteObj.ext_id)) { + if(testLocalListHas(remoteObj.ext_id, 'created')(this.localDiffs)) { + // if(this.localDiffs.get('created').has(remoteObj.ext_id)) { // The session has been modified both locally and remotely // the server wins, it will be loaded locally, we must remove it from the list of locally changed sessions - const newCreatedMap = this.localDiffs.get('created').delete(remoteObj.ext_id); - this.localDiffs = this.localDiffs.set('created', newCreatedMap); + this.localDiffs = R.merge(this.localDiffs, { created: R.omit([remoteObj.ext_id,], this.localDiffs.created) } ); + // const newCreatedMap = this.localDiffs.get('created').delete(remoteObj.ext_id); + // this.localDiffs = this.localDiffs.set('created', newCreatedMap); } - if(this.localDiffs.get('updated').has(remoteObj.ext_id)) { + if(testLocalListHas(remoteObj.ext_id, 'updated')(this.localDiffs)) { // The session has been modified both locally and remotely // the server wins, it will be loaded locally, we must remove it from the list of locally changed sessions - const newModifiedMap = this.localDiffs.get('updated').delete(remoteObj.ext_id); - this.localDiffs = this.localDiffs.set('updated', newModifiedMap); + // const newModifiedMap = this.localDiffs.get('updated').delete(remoteObj.ext_id); + // this.localDiffs = this.localDiffs.set('updated', newModifiedMap); + this.localDiffs = R.merge(this.localDiffs, { updated: R.omit([remoteObj.ext_id,], this.localDiffs.updated) } ); } let objRecord = this.getLocalRecord(remoteObj); @@ -76,23 +61,17 @@ .filter((syncObj) => syncObj.action === 2) .map((syncObj) => syncObj.ext_id); - let deleteObjs = this.localDiffs.get('deleted'); - let updatedObjs = this.localDiffs.get('updated'); - let createdObjs = this.localDiffs.get('created'); + let deleteObjs = R.prop('deleted', this.localDiffs); + let updatedObjs = R.prop('updated', this.localDiffs); + let createdObjs = R.prop('created', this.localDiffs); for (var objId of objToDelete) { - if(deleteObjs.has(objId)) { - // we remove it from the list of sessions to delete - deleteObjs = deleteObjs.delete(objId); - } - if(updatedObjs.has(objId)) { - updatedObjs = updatedObjs.delete(objId); - } - if(createdObjs.has(objId)) { - createdObjs = createdObjs.delete(objId); - } + const omitObjId = R.omit([objId,]) + deleteObjs = omitObjId(deleteObjs); + updatedObjs = omitObjId(updatedObjs); + createdObjs = omitObjId(createdObjs); yield put(this.doDeleteLocalObj(objId)); } - this.localDiffs = Immutable.Map({created: createdObjs, updated: updatedObjs, deleted: deleteObjs}); + this.localDiffs = {created: createdObjs, updated: updatedObjs, deleted: deleteObjs}; } * syncObjects() { @@ -103,9 +82,10 @@ yield this.deleteFromRemote(); let localObjInst; + const getLocalDiffPropValues = R.flip(getPropValues)(this.localDiffs); // delete remote obj - for(localObjInst of this.localDiffs.get('deleted').values()) { + for(localObjInst of getLocalDiffPropValues('deleted')) { try { yield this.client.delete(this.getRemoteDeleteUrl(localObjInst)); @@ -117,17 +97,17 @@ // otherwise, this is ok } - yield put(this.doDeleteLocalObj(localObjInst.get('_id'))); + yield put(this.doDeleteLocalObj(localObjInst._id)); } - for(localObjInst of this.localDiffs.get('created').values()) { + for(localObjInst of getLocalDiffPropValues('created')) { const remoteData = this.getRemoteData(localObjInst); //TODO: SET VERSION !!!! yield this.client.post(this.getRemoteCreateUrl(localObjInst), remoteData); yield put(this.resetLocalObj(localObjInst)); } - for(localObjInst of this.localDiffs.get('updated').values()) { + for(localObjInst of getLocalDiffPropValues('updated')) { const remoteData = this.getRemoteData(localObjInst); //TODO: SET VERSION !!!! yield this.client.put(this.getRemoteUpdateUrl(localObjInst), remoteData);