diff --git a/services/wordpress/wordpress-base.js b/services/wordpress/wordpress-base.js index 199f46597ac37..36a04628e4bfd 100644 --- a/services/wordpress/wordpress-base.js +++ b/services/wordpress/wordpress-base.js @@ -13,6 +13,7 @@ const themeSchema = Joi.object() num_ratings: nonNegativeInteger, downloaded: nonNegativeInteger, active_installs: nonNegativeInteger, + last_updated: Joi.string().required(), requires_php: stringOrFalse.required(), requires: stringOrFalse.required(), }) @@ -27,6 +28,7 @@ const pluginSchema = Joi.object() active_installs: nonNegativeInteger, requires: stringOrFalse.required(), tested: Joi.string().required(), + last_updated: Joi.string().required(), requires_php: stringOrFalse.required(), }) .required() @@ -64,6 +66,7 @@ module.exports = class BaseWordpress extends BaseJsonService { tags: 0, screenshot_url: 0, downloaded: 1, + last_updated: 1, requires_php: 1, }, }, diff --git a/services/wordpress/wordpress-last-update.service.js b/services/wordpress/wordpress-last-update.service.js new file mode 100644 index 0000000000000..d704b516bbc29 --- /dev/null +++ b/services/wordpress/wordpress-last-update.service.js @@ -0,0 +1,79 @@ +'use strict' + +const moment = require('moment') +const { InvalidResponse } = require('..') +const { formatDate } = require('../text-formatters') +const { age: ageColor } = require('../color-formatters') +const BaseWordpress = require('./wordpress-base') + +const extensionData = { + plugin: { + capt: 'Plugin', + exampleSlug: 'bbpress', + lastUpdateFormat: 'YYYY-MM-DD hh:mma GMT', + }, + theme: { + capt: 'Theme', + exampleSlug: 'twentyseventeen', + lastUpdateFormat: 'YYYY-MM-DD', + }, +} + +function LastUpdateForType(extensionType) { + const { capt, exampleSlug, lastUpdateFormat } = extensionData[extensionType] + + return class WordpressLastUpdate extends BaseWordpress { + static name = `Wordpress${capt}LastUpdated` + + static category = 'activity' + + static route = { + base: `wordpress/${extensionType}/last-updated`, + pattern: ':slug', + } + + static examples = [ + { + title: `WordPress ${capt} Last Updated`, + namedParams: { slug: exampleSlug }, + staticPreview: this.render({ last_updated: '2020-08-11' }), + }, + ] + + static defaultBadgeData = { label: 'last updated' } + + static render({ last_updated }) { + return { + label: 'last updated', + message: formatDate(last_updated), + color: ageColor(last_updated), + } + } + + transform(lastUpdate) { + const date = moment(lastUpdate, lastUpdateFormat) + + if (date.isValid()) { + return date.format('YYYY-MM-DD') + } else { + throw new InvalidResponse({ prettyMessage: 'invalid date' }) + } + } + + async handle({ slug }) { + const { last_updated } = await this.fetch({ + extensionType, + slug, + }) + + const newDate = await this.transform(last_updated) + + return this.constructor.render({ + last_updated: newDate, + }) + } + } +} + +const lastupdate = ['plugin', 'theme'].map(LastUpdateForType) +module.exports = [...lastupdate] diff --git a/services/wordpress/wordpress-last-update.tester.js b/services/wordpress/wordpress-last-update.tester.js new file mode 100644 index 0000000000000..9301a0d6267b1 --- /dev/null +++ b/services/wordpress/wordpress-last-update.tester.js @@ -0,0 +1,38 @@ +'use strict' + +const { ServiceTester } = require('../tester') +const { isFormattedDate } = require('../test-validators') + +const t = new ServiceTester({ + id: 'wordpress', + title: 'WordPress Last Update', +}) +module.exports = t + +t.create('Plugin Last Update') + .get('/plugin/last-updated/akismet.json') + .expectBadge({ + label: 'last updated', + message: isFormattedDate, + }) + +t.create('Plugin (Not Found)') + .get('/plugin/last-updated/pleasenevermakethisplugin.json') + .expectBadge({ + label: 'last updated', + message: 'not found', + }) + +t.create('Theme Last Update') + .get('/theme/last-updated/twentytwenty.json') + .expectBadge({ + label: 'last updated', + message: isFormattedDate, + }) + +t.create('Theme (Not Found)') + .get('/theme/last-updated/pleasenevermakethistheme.json') + .expectBadge({ + label: 'last updated', + message: 'not found', + }) diff --git a/services/wordpress/wordpress-platform.tester.js b/services/wordpress/wordpress-platform.tester.js index f76d1a7aa424d..d32ab1e82a64f 100644 --- a/services/wordpress/wordpress-platform.tester.js +++ b/services/wordpress/wordpress-platform.tester.js @@ -42,6 +42,7 @@ const mockedQueryFields = { screenshot_url: '0', downloaded: 1, requires_php: 1, + last_updated: 1, } const mockedQuerySelector = { @@ -70,6 +71,7 @@ t.create('Plugin Tested WP Version - current') active_installs: 100, requires: '4.9', tested: '4.9.8', + last_updated: '2020-01-01 7:21am GMT', requires_php: '5.5', }) .get('/core/version-check/1.7/') @@ -95,6 +97,7 @@ t.create('Plugin Tested WP Version - old') active_installs: 100, requires: '4.9', tested: '4.9.6', + last_updated: '2020-01-01 7:21am GMT', requires_php: '5.5', }) .get('/core/version-check/1.7/') @@ -120,6 +123,7 @@ t.create('Plugin Tested WP Version - non-exsistant or unsupported') active_installs: 100, requires: '4.0', tested: '4.0.0', + last_updated: '2020-01-01 7:21am GMT', requires_php: '5.5', }) .get('/core/version-check/1.7/') @@ -198,6 +202,7 @@ t.create('Theme Required PHP Version (Not Set)') requires: '4.0', tested: '4.0.0', requires_php: false, + last_updated: '2020-01-01', }) ) .expectBadge({