Update Zotero.Relations.updateUser() for new relations schema

Also adds Zotero.DataObjects::getLoaded(), which returns an array of all
loaded objects of the given type. This is useful for selective
reloading, for example with item.reload(['relations'], true).
This commit is contained in:
Dan Stillman 2015-06-04 19:25:45 -04:00
parent 195a737049
commit aa2e0a8582
3 changed files with 70 additions and 23 deletions

View file

@ -190,6 +190,16 @@ Zotero.DataObjects.prototype.getAsync = Zotero.Promise.coroutine(function* (ids,
});
/**
* Get all loaded objects
*
* @return {Zotero.DataObject[]}
*/
Zotero.DataObjects.prototype.getLoaded = function () {
return Object.keys(this._objectCache).map(id => this._objectCache[id]);
}
/**
* @deprecated - use .libraryKey
*/

View file

@ -83,32 +83,27 @@ Zotero.Relations = new function () {
});
this.updateUser = Zotero.Promise.coroutine(function* (fromUserID, fromLibraryID, toUserID, toLibraryID) {
this.updateUser = Zotero.Promise.coroutine(function* (toUserID) {
var fromUserID = Zotero.Users.getCurrentUserID();
if (!fromUserID) {
throw ("Invalid source userID " + fromUserID + " in Zotero.Relations.updateUserID");
}
if (!fromLibraryID) {
throw ("Invalid source libraryID " + fromLibraryID + " in Zotero.Relations.updateUserID");
fromUserID = "local/" + Zotero.Users.getLocalUserKey();
}
if (!toUserID) {
throw ("Invalid target userID " + toUserID + " in Zotero.Relations.updateUserID");
throw new Error("Invalid target userID " + toUserID);
}
if (!toLibraryID) {
throw ("Invalid target libraryID " + toLibraryID + " in Zotero.Relations.updateUserID");
}
yield Zotero.DB.executeTransaction(function* () {
var sql = "UPDATE relations SET libraryID=? WHERE libraryID=?";
yield Zotero.DB.queryAsync(sql, [toLibraryID, fromLibraryID]);
sql = "UPDATE relations SET "
+ "subject=REPLACE(subject, 'zotero.org/users/" + fromUserID + "', "
+ "'zotero.org/users/" + toUserID + "'), "
Zotero.DB.requireTransaction();
for (let type of _types) {
var sql = "UPDATE " + type + "Relations SET "
+ "object=REPLACE(object, 'zotero.org/users/" + fromUserID + "', "
+ "'zotero.org/users/" + toUserID + "') "
+ "WHERE predicate IN (?, ?)";
yield Zotero.DB.queryAsync(sql, [this.linkedObjectPredicate, this.replacedItemPredicate]);
}.bind(this));
+ "'zotero.org/users/" + toUserID + "')";
yield Zotero.DB.queryAsync(sql);
var objectsClass = Zotero.DataObjectUtilities.getObjectsClassForObjectType(type);
var objects = objectsClass.getLoaded();
for (let object of objects) {
yield object.reload(['relations'], true);
}
}
});
@ -118,8 +113,7 @@ Zotero.Relations = new function () {
Zotero.DB.requireTransaction();
var t = new Date;
let prefix = Zotero.URI.defaultPrefix;
var types = ['collection', 'item'];
for (let type of types) {
for (let type of _types) {
let objectsClass = Zotero.DataObjectUtilities.getObjectsClassForObjectType(type);
let getFunc = "getURI" + Zotero.Utilities.capitalize(type);
let objects = {};

View file

@ -21,4 +21,47 @@ describe("Zotero.Relations", function () {
assert.equal(objects[0], item);
})
})
describe("#updateUser", function () {
beforeEach(function* () {
yield Zotero.DB.queryAsync("DELETE FROM settings WHERE setting='account'");
yield Zotero.Users.init();
})
it("should update relations using local user key to use userID", function* () {
var item1 = yield createDataObject('item');
var item2 = createUnsavedDataObject('item');
item2.addRelatedItem(item1);
yield item2.save();
var rels = item2.getRelationsByPredicate(Zotero.Relations.relatedItemPredicate);
assert.include(rels[0], "/users/local");
yield Zotero.DB.executeTransaction(function* () {
yield Zotero.Relations.updateUser(1);
})
var rels = item2.getRelationsByPredicate(Zotero.Relations.relatedItemPredicate);
assert.include(rels[0], "/users/1");
})
it("should update relations from one userID to another", function* () {
yield Zotero.Users.setCurrentUserID(1);
var item1 = yield createDataObject('item');
var item2 = createUnsavedDataObject('item');
item2.addRelatedItem(item1);
yield item2.save();
var rels = item2.getRelationsByPredicate(Zotero.Relations.relatedItemPredicate);
assert.include(rels[0], "/users/1");
yield Zotero.DB.executeTransaction(function* () {
yield Zotero.Relations.updateUser(2);
});
var rels = item2.getRelationsByPredicate(Zotero.Relations.relatedItemPredicate);
assert.include(rels[0], "/users/2");
})
})
})