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

View file

@ -21,4 +21,47 @@ describe("Zotero.Relations", function () {
assert.equal(objects[0], item); 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");
})
})
}) })