SyncManager exclude savedItems from retrievedItems, syncing source string

This commit is contained in:
Mo Bitar
2018-01-23 10:05:23 -06:00
parent 05af90290b
commit ed3f0aa620
14 changed files with 62 additions and 40 deletions

View File

@@ -143,7 +143,7 @@ angular.module('app')
} }
// Lots of dirtying can happen above, so we'll sync // Lots of dirtying can happen above, so we'll sync
syncManager.sync(); syncManager.sync("editorMenuOnSelect");
}.bind(this) }.bind(this)
this.hasAvailableExtensions = function() { this.hasAvailableExtensions = function() {

View File

@@ -69,7 +69,7 @@ angular.module('app')
this.refreshData = function() { this.refreshData = function() {
this.isRefreshing = true; this.isRefreshing = true;
syncManager.sync(function(response){ syncManager.sync((response) => {
$timeout(function(){ $timeout(function(){
this.isRefreshing = false; this.isRefreshing = false;
}.bind(this), 200) }.bind(this), 200)
@@ -78,7 +78,7 @@ angular.module('app')
} else { } else {
this.syncUpdated(); this.syncUpdated();
} }
}.bind(this)); }, null, "refreshData");
} }
this.syncUpdated = function() { this.syncUpdated = function() {

View File

@@ -9,8 +9,8 @@ angular.module('app')
} }
/* Used to avoid circular dependencies where syncManager cannot be imported but rootScope can */ /* Used to avoid circular dependencies where syncManager cannot be imported but rootScope can */
$rootScope.sync = function() { $rootScope.sync = function(source) {
syncManager.sync(); syncManager.sync("$rootScope.sync - " + source);
} }
$rootScope.lockApplication = function() { $rootScope.lockApplication = function() {
@@ -49,7 +49,7 @@ angular.module('app')
dbManager.openDatabase(null, function() { dbManager.openDatabase(null, function() {
// new database, delete syncToken so that items can be refetched entirely from server // new database, delete syncToken so that items can be refetched entirely from server
syncManager.clearSyncToken(); syncManager.clearSyncToken();
syncManager.sync(); syncManager.sync("openDatabase");
}) })
} }
@@ -61,10 +61,10 @@ angular.module('app')
$rootScope.$broadcast("initial-data-loaded"); $rootScope.$broadcast("initial-data-loaded");
syncManager.sync(null); syncManager.sync("initiateSync");
// refresh every 30s // refresh every 30s
setInterval(function () { setInterval(function () {
syncManager.sync(null); syncManager.sync("timer");
}, 30000); }, 30000);
}); });
} }
@@ -115,7 +115,7 @@ angular.module('app')
} }
note.setDirty(true); note.setDirty(true);
syncManager.sync(); syncManager.sync("updateTagsForNote");
} }
/* /*
@@ -145,7 +145,7 @@ angular.module('app')
return; return;
} }
tag.setDirty(true); tag.setDirty(true);
syncManager.sync(callback); syncManager.sync(callback, null, "tagsSave");
$rootScope.$broadcast("tag-changed"); $rootScope.$broadcast("tag-changed");
modelManager.resortTag(tag); modelManager.resortTag(tag);
} }
@@ -161,7 +161,7 @@ angular.module('app')
syncManager.sync(function(){ syncManager.sync(function(){
// force scope tags to update on sub directives // force scope tags to update on sub directives
$scope.safeApply(); $scope.safeApply();
}); }, null, "removeTag");
} }
} }
@@ -199,7 +199,7 @@ angular.module('app')
callback(true); callback(true);
} }
} }
}) }, null, "saveNote")
} }
$scope.safeApply = function(fn) { $scope.safeApply = function(fn) {
@@ -240,7 +240,7 @@ angular.module('app')
} else { } else {
$scope.notifyDelete(); $scope.notifyDelete();
} }
}); }, null, "deleteNote");
} }

View File

@@ -80,7 +80,7 @@ class AccountMenu {
}, 1000) }, 1000)
}); });
}) })
}) }, null, "submitPasswordChange")
} }
$scope.submitMfaForm = function() { $scope.submitMfaForm = function() {
@@ -162,7 +162,7 @@ class AccountMenu {
var block = function() { var block = function() {
$timeout(function(){ $timeout(function(){
$scope.onSuccessfulAuth()(); $scope.onSuccessfulAuth()();
syncManager.sync(); syncManager.sync("onAuthSuccess");
}) })
} }
@@ -280,7 +280,7 @@ class AccountMenu {
syncManager.sync((response) => { syncManager.sync((response) => {
callback(response, errorCount); callback(response, errorCount);
}, {additionalFields: ["created_at", "updated_at"]}); }, {additionalFields: ["created_at", "updated_at"]}, "importJSONData");
}.bind(this) }.bind(this)
if(data.auth_params) { if(data.auth_params) {
@@ -443,7 +443,7 @@ class AccountMenu {
alert("Your items have been successfully re-encrypted and synced. You must sign out of all other signed in applications (mobile, desktop, web) and sign in again, or else you may corrupt your data.") alert("Your items have been successfully re-encrypted and synced. You must sign out of all other signed in applications (mobile, desktop, web) and sign in again, or else you may corrupt your data.")
$scope.newPasswordData = {}; $scope.newPasswordData = {};
}, 1000) }, 1000)
}); }, null, "reencryptPressed");
} }

View File

@@ -51,7 +51,7 @@ class EditorMenu {
} }
component.setAppDataItem("defaultEditor", true); component.setAppDataItem("defaultEditor", true);
component.setDirty(true); component.setDirty(true);
syncManager.sync(); syncManager.sync("makeEditorDefault");
$scope.defaultEditor = component; $scope.defaultEditor = component;
} }
@@ -59,7 +59,7 @@ class EditorMenu {
$scope.removeEditorDefault = function(component) { $scope.removeEditorDefault = function(component) {
component.setAppDataItem("defaultEditor", false); component.setAppDataItem("defaultEditor", false);
component.setDirty(true); component.setDirty(true);
syncManager.sync(); syncManager.sync("removeEditorDefault");
$scope.defaultEditor = null; $scope.defaultEditor = null;
} }

View File

@@ -302,7 +302,7 @@ angular.module('app')
var prefs = new Item({content_type: prefsContentType}); var prefs = new Item({content_type: prefsContentType});
modelManager.addItem(prefs); modelManager.addItem(prefs);
prefs.setDirty(true); prefs.setDirty(true);
$rootScope.sync(); $rootScope.sync("authManager singletonCreate");
valueCallback(prefs); valueCallback(prefs);
}); });
@@ -312,7 +312,7 @@ angular.module('app')
this.syncUserPreferences = function() { this.syncUserPreferences = function() {
this.userPreferences.setDirty(true); this.userPreferences.setDirty(true);
$rootScope.sync(); $rootScope.sync("syncUserPreferences");
} }
this.getUserPrefValue = function(key, defaultValue) { this.getUserPrefValue = function(key, defaultValue) {

View File

@@ -425,7 +425,7 @@ class ComponentManager {
saveMessage.action = response && response.error ? "save-error" : "save-success"; saveMessage.action = response && response.error ? "save-error" : "save-success";
this.replyToMessage(component, message, {error: response.error}) this.replyToMessage(component, message, {error: response.error})
this.handleMessage(component, saveMessage); this.handleMessage(component, saveMessage);
}); }, null, "handleSaveItemsMessage");
}); });
} }
@@ -447,7 +447,7 @@ class ComponentManager {
this.modelManager.addItem(item); this.modelManager.addItem(item);
this.modelManager.resolveReferencesForItem(item); this.modelManager.resolveReferencesForItem(item);
item.setDirty(true); item.setDirty(true);
this.syncManager.sync(); this.syncManager.sync("handleCreateItemMessage");
this.replyToMessage(component, message, {item: this.jsonForItem(item, component)}) this.replyToMessage(component, message, {item: this.jsonForItem(item, component)})
}); });
} }
@@ -470,7 +470,7 @@ class ComponentManager {
this.modelManager.setItemToBeDeleted(model); this.modelManager.setItemToBeDeleted(model);
} }
this.syncManager.sync(); this.syncManager.sync("handleDeleteItemsMessage");
} }
}); });
} }
@@ -486,7 +486,7 @@ class ComponentManager {
this.runWithPermissions(component, [], () => { this.runWithPermissions(component, [], () => {
component.componentData = message.data.componentData; component.componentData = message.data.componentData;
component.setDirty(true); component.setDirty(true);
this.syncManager.sync(); this.syncManager.sync("handleSetComponentDataMessage");
}); });
} }
@@ -569,7 +569,7 @@ class ComponentManager {
} }
} }
component.setDirty(true); component.setDirty(true);
this.syncManager.sync(); this.syncManager.sync("promptForPermissions");
} }
this.permissionDialogs = this.permissionDialogs.filter((pendingDialog) => { this.permissionDialogs = this.permissionDialogs.filter((pendingDialog) => {
@@ -635,7 +635,7 @@ class ComponentManager {
this.modelManager.addItem(component); this.modelManager.addItem(component);
component.setDirty(true); component.setDirty(true);
this.syncManager.sync(); this.syncManager.sync("installComponent");
} }
activateComponent(component) { activateComponent(component) {
@@ -650,7 +650,7 @@ class ComponentManager {
if(didChange) { if(didChange) {
component.setDirty(true); component.setDirty(true);
this.syncManager.sync(); this.syncManager.sync("activateComponent");
} }
if(!this.activeComponents.includes(component)) { if(!this.activeComponents.includes(component)) {
@@ -709,7 +709,7 @@ class ComponentManager {
if(didChange) { if(didChange) {
component.setDirty(true); component.setDirty(true);
this.syncManager.sync(); this.syncManager.sync("deactivateComponent");
} }
_.pull(this.activeComponents, component); _.pull(this.activeComponents, component);
@@ -729,7 +729,7 @@ class ComponentManager {
deleteComponent(component) { deleteComponent(component) {
this.modelManager.setItemToBeDeleted(component); this.modelManager.setItemToBeDeleted(component);
this.syncManager.sync(); this.syncManager.sync("deleteComponent");
} }
isComponentActive(component) { isComponentActive(component) {

View File

@@ -51,14 +51,14 @@ class DesktopManager {
console.log("Web|Component Installation Complete", componentData); console.log("Web|Component Installation Complete", componentData);
var component = this.modelManager.mapResponseItemsToLocalModels([componentData], ModelManager.MappingSourceDesktopInstalled)[0]; var component = this.modelManager.mapResponseItemsToLocalModels([componentData], ModelManager.MappingSourceDesktopInstalled)[0];
component.setDirty(true); component.setDirty(true);
this.syncManager.sync(); this.syncManager.sync("desktop_onComponentInstallationComplete");
} }
desktop_updateComponentComplete(componentData) { desktop_updateComponentComplete(componentData) {
console.log("Web|Component Update Complete", componentData); console.log("Web|Component Update Complete", componentData);
var component = this.modelManager.mapResponseItemsToLocalModels([componentData], ModelManager.MappingSourceDesktopInstalled)[0]; var component = this.modelManager.mapResponseItemsToLocalModels([componentData], ModelManager.MappingSourceDesktopInstalled)[0];
component.setDirty(true); component.setDirty(true);
this.syncManager.sync(); this.syncManager.sync("desktop_updateComponentComplete");
} }
/* Used to resolve "sn://" */ /* Used to resolve "sn://" */

View File

@@ -50,7 +50,7 @@ class MigrationManager {
this.modelManager.setItemToBeDeleted(editor); this.modelManager.setItemToBeDeleted(editor);
} }
this.syncManager.sync(); this.syncManager.sync("addEditorToComponentMigrator");
} }
}) })
} }

View File

@@ -54,6 +54,8 @@ class ModelManager {
this.informModelsOfUUIDChangeForItem(newItem, item.uuid, newItem.uuid); this.informModelsOfUUIDChangeForItem(newItem, item.uuid, newItem.uuid);
console.log(item.uuid, "-->", newItem.uuid);
var block = () => { var block = () => {
this.addItem(newItem); this.addItem(newItem);
newItem.setDirty(true); newItem.setDirty(true);

View File

@@ -24,7 +24,7 @@ class PackageManager {
this.modelManager.addItem(assembled); this.modelManager.addItem(assembled);
assembled.setDirty(true); assembled.setDirty(true);
this.syncManager.sync(); this.syncManager.sync("installPackage");
console.log("Created assembled", assembled); console.log("Created assembled", assembled);

View File

@@ -58,6 +58,7 @@ class SingletonManager {
// This way we know there was some action and things need to be resolved. The saved items will come up // This way we know there was some action and things need to be resolved. The saved items will come up
// in filterItemsWithPredicate(this.modelManager.allItems) and be deleted anyway // in filterItemsWithPredicate(this.modelManager.allItems) and be deleted anyway
let savedSingletonItemsCount = this.filterItemsWithPredicate(savedItems, predicate).length; let savedSingletonItemsCount = this.filterItemsWithPredicate(savedItems, predicate).length;
if(retrievedSingletonItems.length > 0 || savedSingletonItemsCount > 0) { if(retrievedSingletonItems.length > 0 || savedSingletonItemsCount > 0) {
/* /*
Check local inventory and make sure only 1 similar item exists. If more than 1, delete oldest Check local inventory and make sure only 1 similar item exists. If more than 1, delete oldest
@@ -109,7 +110,7 @@ class SingletonManager {
this.modelManager.setItemToBeDeleted(d); this.modelManager.setItemToBeDeleted(d);
} }
this.$rootScope.sync(); this.$rootScope.sync("resolveSingletons");
// Send remaining item to callback // Send remaining item to callback
singletonHandler.singleton = winningItem; singletonHandler.singleton = winningItem;

View File

@@ -189,7 +189,17 @@ class SyncManager {
this.$interval.cancel(this.syncStatus.checker); this.$interval.cancel(this.syncStatus.checker);
} }
sync(callback, options = {}) { sync(callback, options = {}, source) {
if(!options) options = {};
if(typeof callback == 'string') {
// is source string, used to avoid filling parameters on call
source = callback;
callback = null;
}
// console.log("Syncing from", source);
var allDirtyItems = this.modelManager.getDirtyItems(); var allDirtyItems = this.modelManager.getDirtyItems();
@@ -271,6 +281,15 @@ class SyncManager {
this.$rootScope.$broadcast("sync:updated_token", this.syncToken); this.$rootScope.$broadcast("sync:updated_token", this.syncToken);
// Filter retrieved_items to remove any items that may be in saved_items for this complete sync operation
// When signing in, and a user requires many round trips to complete entire retrieval of data, an item may be saved
// on the first trip, then on subsequent trips using cursor_token, this same item may be returned, since it's date is
// greater than cursor_token. We keep track of all saved items in whole sync operation with this.allSavedItems
// We need this because singletonManager looks at retrievedItems as higher precendence than savedItems, but if it comes in both
// then that's problematic.
let allSavedUUIDs = this.allSavedItems.map((item) => {return item.uuid});
response.retrieved_items = response.retrieved_items.filter((candidate) => {return !allSavedUUIDs.includes(candidate.uuid)});
// Map retrieved items to local data // Map retrieved items to local data
var retrieved var retrieved
= this.handleItemsResponse(response.retrieved_items, null, ModelManager.MappingSourceRemoteRetrieved); = this.handleItemsResponse(response.retrieved_items, null, ModelManager.MappingSourceRemoteRetrieved);
@@ -307,12 +326,12 @@ class SyncManager {
if(this.cursorToken || this.syncStatus.needsMoreSync) { if(this.cursorToken || this.syncStatus.needsMoreSync) {
setTimeout(function () { setTimeout(function () {
this.sync(callback, options); this.sync(callback, options, "onSyncSuccess cursorToken || needsMoreSync");
}.bind(this), 10); // wait 10ms to allow UI to update }.bind(this), 10); // wait 10ms to allow UI to update
} else if(this.repeatOnCompletion) { } else if(this.repeatOnCompletion) {
this.repeatOnCompletion = false; this.repeatOnCompletion = false;
setTimeout(function () { setTimeout(function () {
this.sync(callback, options); this.sync(callback, options, "onSyncSuccess repeatOnCompletion");
}.bind(this), 10); // wait 10ms to allow UI to update }.bind(this), 10); // wait 10ms to allow UI to update
} else { } else {
this.writeItemsToLocalStorage(this.allRetreivedItems, false, null); this.writeItemsToLocalStorage(this.allRetreivedItems, false, null);

View File

@@ -30,7 +30,7 @@ class SysExtManager {
if(needsSync) { if(needsSync) {
resolvedSingleton.setDirty(true); resolvedSingleton.setDirty(true);
this.syncManager.sync(); this.syncManager.sync("resolveExtensionsManager");
} }
}, (valueCallback) => { }, (valueCallback) => {
// Safe to create. Create and return object. // Safe to create. Create and return object.
@@ -71,7 +71,7 @@ class SysExtManager {
this.modelManager.addItem(component); this.modelManager.addItem(component);
component.setDirty(true); component.setDirty(true);
this.syncManager.sync(); this.syncManager.sync("resolveExtensionsManager createNew");
valueCallback(component); valueCallback(component);
}); });