client/src/sagas/BaseSyncronizer.js
changeset 168 ea92f4fe783d
parent 129 d48946d164c6
--- 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);