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