item sync, deletion

This commit is contained in:
Mo Bitar
2016-12-27 23:51:21 -06:00
parent 139c8c62e6
commit e39793c2a1
7 changed files with 232 additions and 114 deletions

View File

@@ -11,11 +11,10 @@ angular.module('app.frontend')
// apiController.verifyEncryptionStatusOfAllItems($scope.defaultUser, function(success){});
}
apiController.getCurrentUser(function(user, items){
if(user && items) {
console.log("Get user response", user, items);
apiController.getCurrentUser(function(user){
if(user) {
console.log("Get user response", user);
$scope.defaultUser = user;
modelManager.items = items;
$rootScope.title = "Notes — Standard Notes";
onUserSet();
} else {

View File

@@ -9,6 +9,9 @@ class Note extends Item {
if(!this.content.title) {
this.content.title = "";
}
if(!this.content.text) {
this.content.text = "";
}
}

View File

@@ -76,10 +76,10 @@ angular.module('app.frontend')
Restangular.one("users/current").get().then(function(response){
var plain = response.plain();
var items = plain.items;
this.decryptItemsWithLocalKey(items);
items = this.mapResponseItemsToLocalModels(items);
this.decryptItems(items);
items = modelManager.mapResponseItemsToLocalModels(items);
var user = _.omit(plain, ["items"]);
callback(user, items);
callback(user);
}.bind(this))
.catch(function(response){
console.log("Error getting current user", response);
@@ -236,6 +236,19 @@ angular.module('app.frontend')
})
}
this.refreshItems = function(updatedAfter, callback) {
var request = Restangular.one("users", this.user.uuid).one("items");
request.get(updatedAfter ? {"updated_after" : updatedAfter.toString()} : {})
.then(function(response){
console.log("refresh response", response.items);
var items = this.handleItemsResponse(response.items);
callback(items);
}.bind(this))
.catch(function(response) {
callback(response.data);
})
}
this.saveItems = function(items, callback) {
if(!this.user.uuid) {
this.writeItemsToLocalStorage();
@@ -248,27 +261,14 @@ angular.module('app.frontend')
}.bind(this));
request.post().then(function(response) {
var savedItems = response.items;
this.decryptItemsWithLocalKey(savedItems);
items.forEach(function(item){
var savedCounterpart = _.find(savedItems, {uuid: item.uuid});
item.mergeMetadataFromItem(savedCounterpart);
})
this.handleItemsResponse(response.items);
callback(response);
}.bind(this))
}
this.mapResponseItemsToLocalModels = function(items) {
return _.map(items, function(json_obj){
if(json_obj.content_type == "Note") {
return new Note(json_obj);
} else if(json_obj.content_type == "Tag") {
return new Tag(json_obj);
} else {
return new Item(json_obj);
}
});
this.handleItemsResponse = function(responseItems) {
this.decryptItems(responseItems);
return modelManager.mapResponseItemsToLocalModels(responseItems);
}
this.createRequestParamsForItem = function(item) {
@@ -361,7 +361,7 @@ angular.module('app.frontend')
this.importJSONData = function(jsonString, callback) {
var data = JSON.parse(jsonString);
var customModelManager = new ModelManager();
customModelManager.items = this.mapResponseItemsToLocalModels(data.items);
customModelManager.mapResponseItemsToLocalModels(data.items);
console.log("Importing data", JSON.parse(jsonString));
this.saveItems(customModelManager.items, function(response){
callback(response);
@@ -444,9 +444,8 @@ angular.module('app.frontend')
this.loadLocalItemsAndUser = function() {
var user = {};
var items = JSON.parse(localStorage.getItem('items'));
items = this.mapResponseItemsToLocalModels(items);
items = modelManager.mapResponseItemsToLocalModels(items);
Item.sortItemsByDate(items);
modelManager.items = items;
user.items = items;
user.shouldMerge = true;
return user;
@@ -469,7 +468,7 @@ angular.module('app.frontend')
if(!draftString || draftString == 'undefined') {
return null;
}
return new Item(JSON.parse(draftString));
return new Note(JSON.parse(draftString));
}
@@ -527,8 +526,13 @@ angular.module('app.frontend')
item.content = content;
}
this.decryptItems = function(items, masterKey) {
items.forEach(function(item){
this.decryptItems = function(items) {
var masterKey = this.retrieveMk();
for (var item of items) {
if(item.deleted == true) {
continue;
}
if(item.content.substring(0, 3) == "001" && item.enc_item_key) {
// is encrypted
this.decryptSingleItem(item, masterKey);
@@ -536,11 +540,7 @@ angular.module('app.frontend')
// is base64 encoded
item.content = Neeto.crypto.base64Decode(item.content.substring(3, item.content.length))
}
}.bind(this));
}
this.decryptItemsWithLocalKey = function(items) {
this.decryptItems(items, this.retrieveMk());
}
}
this.reencryptAllItemsAndSave = function(user, newMasterKey, oldMasterKey, callback) {

View File

@@ -1,23 +1,26 @@
class ItemManager {
set items(items) {
this._items = items;
this.resolveReferences();
constructor() {
this._items = [];
}
get items() {
return this._items;
}
referencesForItemId(itemId) {
findItem(itemId) {
return _.find(this.items, {uuid: itemId});
}
addItems(items) {
this._items = _.uniq(this.items.concat(items));
}
resolveReferences() {
this.items.forEach(function(item){
// build out references, safely handle broken references
item.content.references = _.reduce(item.content.references, function(accumulator, reference){
var item = this.referencesForItemId(reference.uuid);
var item = this.findItem(reference.uuid);
if(item) {
accumulator.push(item);
}

View File

@@ -7,8 +7,45 @@ class ModelManager extends ItemManager {
this.dirtyItems = [];
}
set items(items) {
super.items = items;
// get items() {
// return super.items()
// }
mapResponseItemsToLocalModels(items) {
var models = []
for (var json_obj of items) {
var item = this.findItem(json_obj["uuid"]);
if(json_obj["deleted"] == true) {
if(item) {
this.deleteItem(item)
}
continue;
}
if(item) {
_.merge(item, json_obj);
} else {
item = this.createItem(json_obj);
}
models.push(item)
}
this.addItems(models)
return models;
}
createItem(json_obj) {
if(json_obj.content_type == "Note") {
return new Note(json_obj);
} else if(json_obj.content_type == "Tag") {
return new Tag(json_obj);
} else {
return new Item(json_obj);
}
}
addItems(items) {
super.addItems(items)
this.notes = this.itemsForContentType("Note");
this.notes.forEach(function(note){
note.updateReferencesLocalMapping();
@@ -20,10 +57,6 @@ class ModelManager extends ItemManager {
})
}
get items() {
return super.items;
}
addDirtyItems(items) {
if(!(items instanceof Array)) {
items = [items];