Remove old and unused Connector Server endpoints (#5148)

This commit is contained in:
Adomas Venčkauskas 2025-03-21 12:29:54 +02:00 • committed by Dan Stillman
parent 2cd4ba205a
commit cc87ff3af6
2 changed files with 0 additions and 276 deletions

View file

@ -218,204 +218,6 @@ Zotero.Server.Connector.Detect.prototype = {
},
}
/**
* Performs translation of a given page
*
* Accepts:
* uri - The URI of the page to be saved
* html - document.innerHTML or equivalent
* cookie - document.cookie or equivalent
* translatorID [optional] - a translator ID as returned by /connector/detect
*
* Returns:
* If a single item, sends response code 201 with item in body.
* If multiple items, sends response code 300 with the following content:
* items - list of items in the format typically passed to the selectItems handler
* instanceID - an ID that must be maintained for the subsequent Zotero.Connector.Select call
* uri - the URI of the page for which multiple items are available
*/
Zotero.Server.Connector.SavePage = function() {};
Zotero.Server.Endpoints["/connector/savePage"] = Zotero.Server.Connector.SavePage;
Zotero.Server.Connector.SavePage.prototype = {
supportedMethods: ["POST"],
supportedDataTypes: ["application/json"],
permitBookmarklet: true,
/**
* Either loads HTML into a hidden browser and initiates translation, or saves items directly
* to the database
*/
init: function(requestData) {
return new Zotero.Promise(async function(resolve) {
function sendResponseCallback() {
if (arguments.length > 1) {
return resolve(arguments);
}
return resolve(arguments[0]);
}
var data = requestData.data;
var { library, collection, editable } = Zotero.Server.Connector.getSaveTarget();
var libraryID = library.libraryID;
var targetID = collection ? collection.treeViewID : library.treeViewID;
if (Zotero.Server.Connector.SessionManager.get(data.sessionID)) {
return sendResponseCallback(409, "application/json", JSON.stringify({ error: "SESSION_EXISTS" }));
}
// Shouldn't happen as long as My Library exists
if (!library.editable) {
Zotero.logError("Can't add item to read-only library " + library.name);
return sendResponseCallback(500, "application/json", JSON.stringify({ libraryEditable: false }));
}
var session = Zotero.Server.Connector.SessionManager.create(data.sessionID);
await session.update(targetID);
this.sendResponse = sendResponseCallback;
this._parsedPostData = data;
try {
var translators = await Zotero.Server.Connector.Detect.prototype.getTranslators.call(this, requestData);
} catch(e) {
Zotero.logError(e);
session.remove();
return sendResponseCallback(500);
}
if(!translators.length) {
Zotero.debug(`No translators available for /connector/savePage ${data.uri}`);
session.remove();
return this.sendResponse(500);
}
// set handlers for translation
var me = this;
var translate = this._translate;
translate.setHandler("select", function(obj, item, callback) { return me._selectItems(obj, item, callback) });
let attachmentTitleData = {};
translate.setHandler("itemsDone", function(obj, items) {
if(items.length || me.selectedItems === false) {
items = items.map((item) => {
let o = {
id: item.id,
title: item.title,
itemType: item.itemType,
contentType: item.mimeType,
mimeType: item.mimeType, // TODO: Remove
};
if (item.attachments) {
let id = 0;
for (let attachment of item.attachments) {
attachment.parent = item.id;
attachment.id = id++;
}
o.attachments = item.attachments.map((attachment) => {
// Retaining id and parent info for session progress management
attachmentTitleData[attachment.title] = {id: attachment.id, parent: item.id};
return {
id: session.id + '_' + attachment.id, // TODO: Remove prefix
title: attachment.title,
contentType: attachment.contentType,
mimeType: attachment.mimeType, // TODO: Remove
};
});
};
session.onProgress(item, 100);
return o;
});
me.sendResponse(201, "application/json", JSON.stringify({items}));
} else {
me.sendResponse(500);
session.remove();
}
});
translate.setHandler("attachmentProgress", function(obj, attachment, progress, error) {
if (attachmentTitleData[attachment.title]) {
session.onProgress(Object.assign(
{},
attachment,
attachmentTitleData[attachment.title],
), progress, error);
}
});
translate.setHandler("error", function(obj, err) {
Zotero.logError(err);
sendResponseCallback(500);
session.remove();
});
if (this._parsedPostData.translatorID) {
translate.setTranslator(this._parsedPostData.translatorID);
} else {
translate.setTranslator(translators[0]);
}
let items = await translate.translate({libraryID, collections: collection ? [collection.id] : false});
items.forEach((item, index) => {
session.addItem(data.items[index].id, item);
});
}.bind(this));
},
/**
* Callback to be executed when items must be selected
* @param {Zotero.Translate} translate
* @param {Object} itemList ID=>text pairs representing available items
*/
_selectItems: function(translate, itemList, callback) {
var instanceID = Zotero.randomString();
Zotero.Server.Connector._waitingForSelection[instanceID] = this;
// Fix for translators that don't create item lists as objects
if(itemList.push && typeof itemList.push === "function") {
var newItemList = {};
for(var item in itemList) {
newItemList[item] = itemList[item];
}
itemList = newItemList;
}
// Send "Multiple Choices" HTTP response
this.sendResponse(300, "application/json", JSON.stringify({selectItems: itemList, instanceID: instanceID, uri: this._parsedPostData.uri}));
this.selectedItemsCallback = callback;
}
}
/**
* Handle item selection
*
* Accepts:
* selectedItems - a list of items to translate in ID => text format as returned by a selectItems handler
* instanceID - as returned by savePage call
* Returns:
* 201 response code with empty body
*/
Zotero.Server.Connector.SelectItems = function() {};
Zotero.Server.Endpoints["/connector/selectItems"] = Zotero.Server.Connector.SelectItems;
Zotero.Server.Connector.SelectItems.prototype = {
supportedMethods: ["POST"],
supportedDataTypes: ["application/json"],
permitBookmarklet: true,
/**
* Finishes up translation when item selection is complete
* @param {String} data POST data or GET query string
* @param {Function} sendResponseCallback function to send HTTP response
*/
init: function(data, sendResponseCallback) {
var saveInstance = Zotero.Server.Connector._waitingForSelection[data.instanceID];
saveInstance.sendResponse = sendResponseCallback;
var selectedItems = false;
for(var i in data.selectedItems) {
selectedItems = data.selectedItems;
break;
}
saveInstance.selectedItemsCallback(selectedItems);
}
}
/**
* Saves items to DB
*
@ -1338,34 +1140,6 @@ Zotero.Server.Connector.Ping.prototype = {
}
}
/**
* IE messaging hack
*
* Accepts:
* Nothing
* Returns:
* Static Response
*/
Zotero.Server.Connector.IEHack = function() {};
Zotero.Server.Endpoints["/connector/ieHack"] = Zotero.Server.Connector.IEHack;
Zotero.Server.Connector.IEHack.prototype = {
supportedMethods: ["GET"],
permitBookmarklet: true,
/**
* Sends a fixed webpage
* @param {String} data POST data or GET query string
* @param {Function} sendResponseCallback function to send HTTP response
*/
init: function(postData, sendResponseCallback) {
sendResponseCallback(200, "text/html",
'<!DOCTYPE html><html><head>'+
'<script src="'+ZOTERO_CONFIG.BOOKMARKLET_URL+'common_ie.js"></script>'+
'<script src="'+ZOTERO_CONFIG.BOOKMARKLET_URL+'ie_hack.js"></script>'+
'</head><body></body></html>');
}
}
/**
* Make an HTTP request from the client. Accepts {@link Zotero.HTTP.request} options and returns a minimal response
* object with the same form as the one returned from {@link Zotero.Utilities.Translate#request}.

View file

@ -494,56 +494,6 @@ describe("Connector Server", function () {
});
});
describe("/connector/savePage", function() {
before(async function () {
await selectLibrary(win);
});
it("should return 500 if no translator available for page", function* () {
var xmlhttp = yield Zotero.HTTP.request(
'POST',
connectorServerPath + "/connector/savePage",
{
headers: {
"Content-Type": "application/json"
},
body: JSON.stringify({
uri: "http://example.com",
html: "<html><head><title>Title</title><body>Body</body></html>"
}),
successCodes: false
}
);
assert.equal(xmlhttp.status, 500);
});
it("should translate a page if translators are available", function* () {
var html = Zotero.File.getContentsFromURL(getTestDataUrl('coins.html'));
var promise = waitForItemEvent('add');
var xmlhttp = yield httpRequest(
'POST',
connectorServerPath + "/connector/savePage",
{
headers: {
"Content-Type": "application/json"
},
body: JSON.stringify({
uri: "https://example.com/test",
html
}),
successCodes: false
}
);
let ids = yield promise;
var item = Zotero.Items.get(ids[0]);
var title = "Test Page";
assert.equal(JSON.parse(xmlhttp.responseText).items[0].title, title);
assert.equal(item.getField('title'), title);
assert.equal(xmlhttp.status, 201);
});
});
describe("/connector/saveAttachment", function () {
const pdfPath = OS.Path.join(getTestDataDirectory().path, 'test.pdf');
let pdfSample, pdfArrayBuffer;