Files
gerrit/polygerrit-ui/app/elements/shared/gr-js-api-interface/gr-rest-api-hooks.js
Thomas Shafer 92daa33342 Add mechanism for plugins to modify rest api calls
A plugin can registers a rest api hook to add plugin params to core rest api
calls. The addParameterFunction only needs to return plugin specific params,
not the entire params object.

This will slow down the initial call to get changes and the change detail as
the xhr now waits for the plugins to finish loading. However once plugins are
loaded, the xhr will fire as quickly as before.

This is currently only supported in the changes query and change detail.

Change-Id: I894628663c6616152030d05e41a0008d1601af3f
2019-04-03 09:54:32 -07:00

93 lines
3.2 KiB
JavaScript

/**
* @license
* Copyright (C) 2019 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
(function() {
'use strict';
// Prevent redefinition.
if (window.GrRestApiHooks) { return; }
// Stores a map of endpointNames and api instances to add parameters to
// REST API calls.
const _apiInstances = {};
function GrRestApiHooks(plugin) {
this.plugin = plugin;
// Stores a map of endpointNames and functions to add parameters to REST API
// calls.
this._addParameterFunctions = {};
}
/**
* Registers an api hook for a particular api endpoint.
* This is called by a plugin.
*
* @param {string} endpointName the name of the endpoint.
* @param {Function} addParameterFunction the function that returns params
* for the plugin. Takes in current params.
*/
GrRestApiHooks.prototype.registerRestApiParams = function(endpointName,
addParameterFunction) {
if (this._addParameterFunctions[endpointName]) {
console.warn(`Rewriting rest api parameter function for
${this.plugin.getPluginName()}`);
}
this._addParameterFunctions[endpointName] = addParameterFunction;
if (!_apiInstances[endpointName]) {
_apiInstances[endpointName] = [];
}
_apiInstances[endpointName].push(this);
};
/**
* Returns params for a registered api hook for a particular api endpoint or
* null.
* This is called by the application, not the plugin.
* It will either return params or null if there are no params.
* @param {string} endpointName the name of the endpoint.
* @param {!Object} initialParams the params of the rest api call.
*/
GrRestApiHooks.prototype._getRestApiParams = function(endpointName,
initialParams) {
const addParameterFunction = this._addParameterFunctions[endpointName];
if (!addParameterFunction) return null;
return addParameterFunction(initialParams);
};
/**
* Gets the params for a particular mutation endpoint.
*
* This is called by the application and should not be called by plugins.
*
* @param {string} endpointName the name of the endpoint.
* @param {!Object} initialParams the params of the rest api call.
* @return new parameters to add to a REST API call.
*/
GrRestApiHooks.pluginParams = function(endpointName, initialParams) {
return (_apiInstances[endpointName] || []).reduce((accum, apiInstance) => {
const pluginParams = apiInstance._getRestApiParams(
endpointName, initialParams);
if (pluginParams) {
accum[apiInstance.plugin.getPluginName()] =
JSON.stringify(pluginParams);
}
return accum;
}, {});
};
window.GrRestApiHooks = GrRestApiHooks;
})(window);