mediawiki-extensions-Echo/modules/model/mw.echo.dm.SourcePagesModel.js
Moriel Schottlender fcd2f41151 Store local source as 'local' rather than dbName
When we fetch the pages per wiki, the API returns an object that
defines the local wiki we are in as its dbName; this then gets
stored into the model as the source, which forces us to check against
the dbName whenever we want to perform an operation so we can tell
the API layer to fetch and perform the actions locally, rather than
use a foreign API.

The term 'local' makes no sense for naming the model (and upcoming
tech debt work will fix this) but it makes sense in the context of
the API layer -- and hence, the source name should follow suit.

This fix makes sure that the local wiki objects always have their
sources defined to be 'local', and thus making us use the test for
dbName in very specific points (when we get the data) rather than
throughout the codebase, randonly.

This is also the first step to allow proper updating of things like
seenTime accross wikis, especially in cases where we view a remote
wiki as if it is local (in the Special:Notifications page)

Change-Id: I94633a1cd074580cbc5029d7c75d179e908e5c52
2016-07-07 12:20:39 -07:00

155 lines
3.7 KiB
JavaScript

( function ( mw ) {
/**
* Source pages model for notification filtering
*
* @class
* @mixins OO.EventEmitter
*
* @constructor
* @param {Object} config Configuration object
* @cfg {string} [currentSource] The selected source for the model.
* Defaults to the current wiki.
*/
mw.echo.dm.SourcePagesModel = function MwEchoDmSourcePagesModel( config ) {
config = config || {};
// Mixin constructor
OO.EventEmitter.call( this );
this.sources = {};
this.currentSource = config.currentSource || 'local';
this.currentPage = null;
};
/* Initialization */
OO.initClass( mw.echo.dm.SourcePagesModel );
OO.mixinClass( mw.echo.dm.SourcePagesModel, OO.EventEmitter );
/* Events */
/**
* @event update
*
* The state of the source page model has changed
*/
/* Methds */
/**
* Set the current source and page.
*
* @param {string} source New source
* @param {string} page New page
* @fires update
*/
mw.echo.dm.SourcePagesModel.prototype.setCurrentSourcePage = function ( source, page ) {
if (
this.currentSource !== source ||
this.currentPage !== page
) {
this.currentSource = source;
this.currentPage = page;
this.emit( 'update' );
}
};
/**
* Get the current source
*
* @return {string} Current source
*/
mw.echo.dm.SourcePagesModel.prototype.getCurrentSource = function () {
return this.currentSource;
};
/**
* Get the title of the currently selected page
*
* @return {string} Page title
*/
mw.echo.dm.SourcePagesModel.prototype.getCurrentPage = function () {
return this.currentPage;
};
/**
* Set all sources and pages. This will also reset and override any
* previously set information.
*
* @param {Object} sourceData A detailed object about sources and pages
*/
mw.echo.dm.SourcePagesModel.prototype.setAllSources = function ( sourceData ) {
var source;
this.reset();
for ( source in sourceData ) {
if ( sourceData.hasOwnProperty( source ) ) {
this.setSourcePagesDetails( source, sourceData[ source ] );
}
}
this.emit( 'update' );
};
/**
* Get an array of all source names
*
* @return {string[]} Array of source names
*/
mw.echo.dm.SourcePagesModel.prototype.getSourcesArray = function () {
return Object.keys( this.sources );
};
/**
* Get the title of a source
*
* @param {string} source Symbolic name of the source
* @return {string} Source title
*/
mw.echo.dm.SourcePagesModel.prototype.getSourceTitle = function ( source ) {
return this.sources[ source ] && this.sources[ source ].title;
};
/**
* Get the total count of a source
*
* @param {string} source Symbolic name of the source
* @return {number} Total count
*/
mw.echo.dm.SourcePagesModel.prototype.getSourceTotalCount = function ( source ) {
return ( this.sources[ source ] && this.sources[ source ].totalCount ) || 0;
};
/**
* Get all pages in a source
*
* @param {string} source Symbolic name of the source
* @return {Object[]} Page definitions in this source
*/
mw.echo.dm.SourcePagesModel.prototype.getSourcePages = function ( source ) {
return this.sources[ source ] && this.sources[ source ].pages;
};
/**
* Reset the data
*/
mw.echo.dm.SourcePagesModel.prototype.reset = function () {
this.sources = {};
};
/**
* Set the details of a source and its page definitions
*
* @private
* @param {string} source Source symbolic name
* @param {Object} details Details object
*/
mw.echo.dm.SourcePagesModel.prototype.setSourcePagesDetails = function ( source, details ) {
this.sources[ source ] = {
title: details.source.title,
base: details.source.base,
totalCount: details.totalCount,
pages: details.pages
};
};
} )( mediaWiki );