mediawiki-extensions-Relate.../resources/ext.relatedArticles.readMore.gateway/RelatedPagesGateway.js
Sam Smith 8b8db66dd1 Cache "morelike" requests for all users
In order to minimize loading time of RA for as many users as possible,
we need to maximize the number of users that can be served by our edge
caches.

Currently, if you're logged in, then the API uses your language by
default and so responses are always private, i.e. they shouldn't be
cached by a shared cache and can be cached by the browser.

By requesting that the response be in the language of the content, the
API ignores your language and responses become public, i.e. they can be
cached in a shared cache and can be cached by the browser.

Changes:
* Add the `uselang=content` parameter to the morelike request
* Add the `maxage=86400` parameter to the morelike request, allowing the
  browser to cache the response for 24 hours, which'll save the device
  even making the request

Bug: T126455
Change-Id: I6216a088d865f27f7cc3725fc311191da42a27ba
2016-09-05 11:33:12 +01:00

113 lines
3.6 KiB
JavaScript

( function ( $, mw ) {
// FIXME: Move into separate file as this module becomes larger.
mw.relatedPages = {};
/**
* @class RelatedPagesGateway
* @param {mw.Api} api
* @param {string} currentPage the page that the editorCuratedPages relate to
* @param {Array} editorCuratedPages a list of pages curated by editors for the current page
* @param {boolean} useCirrusSearch whether to hit the API when no editor-curated pages are available
* @param {boolean} [onlyUseCirrusSearch=false] whether to ignore the list of editor-curated pages
*/
function RelatedPagesGateway(
api,
currentPage,
editorCuratedPages,
useCirrusSearch,
onlyUseCirrusSearch
) {
this.api = api;
this.currentPage = currentPage;
this.useCirrusSearch = useCirrusSearch;
if ( onlyUseCirrusSearch ) {
editorCuratedPages = [];
}
this.editorCuratedPages = editorCuratedPages || [];
}
OO.initClass( RelatedPagesGateway );
/**
* Gets the related pages for the current page.
*
* If there are related pages assigned to this page using the `related`
* parser function, then they are returned.
*
* If there aren't any related pages assigned to the page, then the
* CirrusSearch extension's {@link https://www.mediawiki.org/wiki/Help:CirrusSearch#morelike: "morelike:" feature}
* is used. If the CirrusSearch extension isn't installed, then the API
* call will fail gracefully and no related pages will be returned.
* Thus the dependency on the CirrusSearch extension is soft.
*
* Related pages will have the following information:
*
* * The ID of the page corresponding to the title
* * The thumbnail, if any
* * The Wikidata description, if any
*
* @method
* @param {number} limit of pages to get
* @return {jQuery.Promise}
*/
RelatedPagesGateway.prototype.getForCurrentPage = function ( limit ) {
var parameters = {
action: 'query',
formatversion: 2,
prop: 'pageimages|pageterms',
piprop: 'thumbnail',
pithumbsize: 160, // FIXME: Revert to 80 once pithumbmode is implemented
wbptterms: 'description'
},
relatedPages = ( this.editorCuratedPages ).slice( 0, limit );
if ( relatedPages.length ) {
parameters.pilimit = relatedPages.length;
parameters[ 'continue' ] = ''; // jscs:ignore requireDotNotation
parameters.titles = relatedPages;
} else if ( this.useCirrusSearch ) {
parameters.pilimit = limit;
parameters.generator = 'search';
parameters.gsrsearch = 'morelike:' + this.currentPage;
parameters.gsrnamespace = '0';
parameters.gsrlimit = limit;
parameters.gsrqiprofile = 'classic_noboostlinks';
// Currently, if you're logged in, then the API uses your language by default ard so responses
// are always private i.e. they shouldn't be cached in a shared cache and can be cached by the
// browser.
//
// By make the API use the language of the content rather than that of the user, the API
// reponse is made public, i.e. they can be cached in a shared cache.
//
// See T97096 for more detail and discussion.
parameters.uselang = 'content';
// Instruct shared caches that the response will become stale in 24 hours.
parameters.smaxage = 86400;
// Instruct the browser that the response will become stale in 24 hours.
parameters.maxage = 86400;
} else {
return $.Deferred().resolve( [] );
}
return this.api.get( parameters )
.then( getPages );
};
/**
* @ignore
*/
function getPages( result ) {
return result && result.query && result.query.pages ? result.query.pages : [];
}
mw.relatedPages.RelatedPagesGateway = RelatedPagesGateway;
}( jQuery, mediaWiki ) );