item sync, deletion
This commit is contained in:
@@ -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 {
|
||||
|
||||
@@ -9,6 +9,9 @@ class Note extends Item {
|
||||
|
||||
if(!this.content.title) {
|
||||
this.content.title = "";
|
||||
}
|
||||
|
||||
if(!this.content.text) {
|
||||
this.content.text = "";
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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];
|
||||
|
||||
Reference in New Issue
Block a user