BearND has uploaded a new change for review. https://gerrit.wikimedia.org/r/316501
Change subject: WIP: add Swedish featured article ...................................................................... WIP: add Swedish featured article Does not work yet! :(( Not sure why this returns a different response than from the API request. When I run the following API request https://sv.wikipedia.org/w/api.php?action=parse&format=json&prop=text&contentmodel=wikitext&text=%7B%7BUtvald+artikel%7C2016-10-11%7D%7D I get {"parse":{"title":"API","pageid":5657,"text":{"*":"<p>Wikipedia:Utvald artikel/\u00c9dith Piaf</p>\n\n"}}} So far, so good. But from the service, Example request: http://localhost:6927/sv.wikipedia.org/v1/page/featured/2016/10/11 I get: ... {"parse": {"title": "API","pageid": 5657,"text": {"*": "<p><a href=\"/w/index.php?title=Mall:Utvald_artikel/2016-10-11&action=edit&redlink=1\" class=\"new\" title=\"Mall:Utvald artikel/2016-10-11 [inte skriven än]\">Mall:Utvald artikel/2016-10-11</a></p>\n\n"}}} Looks like the page doesn't exist. Change-Id: Ia6e46f0bef879df06114cbb0a5ec2b6f93d56a40 --- M lib/feed/featured.js M lib/mwapi.js 2 files changed, 143 insertions(+), 30 deletions(-) git pull ssh://gerrit.wikimedia.org:29418/mediawiki/services/mobileapps refs/changes/01/316501/1 diff --git a/lib/feed/featured.js b/lib/feed/featured.js index 11c05c4..982a9ac 100644 --- a/lib/feed/featured.js +++ b/lib/feed/featured.js @@ -6,8 +6,9 @@ var preq = require('preq'); var api = require('../api-util'); -var mwapi = require('../mwapi'); +var domino = require('domino'); var dateUtil = require('../dateUtil'); +var mwapi = require('../mwapi'); var sUtil = require('../util'); var BBPromise = require('bluebird'); var HTTPError = sUtil.HTTPError; @@ -21,7 +22,7 @@ * @param {Date} date for which day the featured article is requested * @return {Promise} a promise resolving as an JSON object containing the response */ -function requestFeaturedArticleTitle(app, domain, date) { +function requestEnglishFeaturedArticleTitle(app, domain, date) { var formattedDateString = dateUtil.formatDateEnglish(date); return api.mwApiGet(app, domain, { action: 'query', @@ -29,9 +30,28 @@ formatversion: 2, exchars: 255, explaintext: '', - titles: `Template:TFA_title/${formattedDateString}`, - prop: 'extracts' + prop: 'extracts', + titles: `Template:TFA_title/${formattedDateString}` }); +} + +/** + * Builds the request to get the Featured article of a given date. + * + * @param {Object} app the application object + * @param {Object} req the request object + * @return {Promise} a promise resolving as an JSON object containing the response + */ +function requestSwedishFeaturedArticleTitle(app, req) { + var formattedDateString = dateUtil.hyphenDelimitedDateString(req); + var text = `{{Utvald artikel/${formattedDateString}}}`; + return api.mwApiGet(app, req.params.domain, { + action: 'parse', + format: 'json', + prop: 'text', + contentmodel: 'wikitext', + text: text + }, true); } // -- functions dealing with responses: @@ -60,6 +80,30 @@ } } +function getParseObject(response, dontThrow) { + if (response.body.parse) { + var parse = response.body.parse; + if (!parse.text) { + throw new HTTPError({ + status: 404, + type: 'not_found', + title: 'No featured article for this date', + detail: 'There is no featured article for this date.' + }); + } + return parse; + } else { + if (!dontThrow) { + throw new HTTPError({ + status: 500, + type: 'unknown_backend_response', + title: 'Unexpected backend response', + detail: 'The backend responded with gibberish.' + }); + } + } +} + /** * HAX: TextExtracts extension will (sometimes) add "..." to the extract. In this particular case, we don't * want it, so we remove it if present. @@ -69,6 +113,78 @@ return extract.slice(0, -3); } return extract; +} + +/** + * Removes extra HTML tags and trim whitespace from a string. + */ +function flattenHtml(text) { + var doc = domino.createDocument(); + var node = doc.createElement('div'); + node.innerHTML = text; + return node.textContent.trim(); +} + +/** + * Gets the TITLE from "<p>Wikipedia:Utvald artikel/TITLE</p>\n\n" + */ +function removeSwedishTemplateName(text) { + console.log('removeSwedishTemplateName ' + text); + return flattenHtml(text).replace('Wikipedia:Utvald artikel/', ''); +} + +function unsupported(aggregated) { + if (aggregated) { + return BBPromise.resolve({}); + } else { + throw new HTTPError({ + status: 501, + type: 'unsupported_language', + title: 'Language not supported', + detail: 'The language you have requested is not yet supported.' + }); + } +} + +function englishTFA(app, req, aggregated) { + var tfaPageObj, pageTitle; + + return requestEnglishFeaturedArticleTitle(app, req.params.domain, dateUtil.getRequestedDate(req)) + .then(function (response) { + mwapi.checkForQueryPagesInResponse(req, response); + tfaPageObj = getPageObject(response); + pageTitle = removeEllipsis(tfaPageObj.extract); + return BBPromise.props({ + dbTitle: mwapi.getDbTitle(app, req, pageTitle) + }); + }).then(function (res) { + return { + payload: { title: res.dbTitle }, + meta: { etag: tfaPageObj.pageid } + }; + }); +} + +function swedishTFA(app, req, aggregated) { + var tfaParseObj, pageTitle; + + return requestSwedishFeaturedArticleTitle(app, req) + .then(function (response) { + console.log("response = " + JSON.stringify(response, null, 2)); + mwapi.checkForParseObjectInResponse(req, response); + tfaParseObj = getParseObject(response); + console.log("tfaParseObj = " + JSON.stringify(tfaParseObj, null, 2)); + pageTitle = removeSwedishTemplateName(tfaParseObj.text['*']); + console.log('pageTitle ' + pageTitle); + return BBPromise.props({ + dbTitle: mwapi.getDbTitle(app, req, pageTitle) + }); + }).then(function (res) { + return { + payload: { title: res.dbTitle }, + meta: { etag: tfaParseObj.pageid } + }; + }); } function promise(app, req) { @@ -81,35 +197,19 @@ dateUtil.throwDateError(); } - if (req.params.domain.indexOf('en') !== 0 || req.params.domain.indexOf('beta.wmflabs.org') > 0) { - if (aggregated) { - return BBPromise.resolve({}); - } else { - throw new HTTPError({ - status: 501, - type: 'unsupported_language', - title: 'Language not supported', - detail: 'The language you have requested is not yet supported.' - }); - } + if (req.params.domain.indexOf('beta.wmflabs.org/') > 0) { + return unsupported(aggregated); } - var tfaPageObj, pageTitle; + if (req.params.domain.indexOf('en.') === 0) { + return englishTFA(app, req, aggregated); + } - return requestFeaturedArticleTitle(app, req.params.domain, dateUtil.getRequestedDate(req)) - .then(function (response) { - mwapi.checkForQueryPagesInResponse(req, response); - tfaPageObj = getPageObject(response); - pageTitle = removeEllipsis(tfaPageObj.extract); - return BBPromise.props({ - dbTitle: mwapi.getDbTitle(app, req, pageTitle) - }); - }).then(function (res) { - return { - payload: { title: res.dbTitle }, - meta: { etag: tfaPageObj.pageid } - }; - }); + if (req.params.domain.indexOf('sv.') === 0) { + return swedishTFA(app, req, aggregated); + } + + return unsupported(aggregated); } module.exports = { diff --git a/lib/mwapi.js b/lib/mwapi.js index 842f41a..bfcdacb 100644 --- a/lib/mwapi.js +++ b/lib/mwapi.js @@ -66,6 +66,19 @@ } }; +mwapi.checkForParseObjectInResponse = function(req, response) { + if (!(response && response.body && response.body.parse)) { + // we did not get our expected parse from the MW API, propagate that + req.logger.log('error/mwapi', 'no parse object in response'); + throw new HTTPError({ + status: 504, + type: 'api_error', + title: 'no parse object in response', + detail: response.body + }); + } +}; + // copied from restbase/lib/mwUtil.js mwapi.findSharedRepoDomain = function(siteInfoRes) { var sharedRepo = (siteInfoRes.body.query.repos || []).find(function(repo) { -- To view, visit https://gerrit.wikimedia.org/r/316501 To unsubscribe, visit https://gerrit.wikimedia.org/r/settings Gerrit-MessageType: newchange Gerrit-Change-Id: Ia6e46f0bef879df06114cbb0a5ec2b6f93d56a40 Gerrit-PatchSet: 1 Gerrit-Project: mediawiki/services/mobileapps Gerrit-Branch: master Gerrit-Owner: BearND <bsitzm...@wikimedia.org> _______________________________________________ MediaWiki-commits mailing list MediaWiki-commits@lists.wikimedia.org https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits