diff --git a/services/itunes/itunes.service.js b/services/itunes/itunes.service.js index 5fbf07e604..b922c9159f 100644 --- a/services/itunes/itunes.service.js +++ b/services/itunes/itunes.service.js @@ -1,17 +1,19 @@ 'use strict' -const LegacyService = require('../legacy-service') -const { makeBadgeData: getBadgeData } = require('../../lib/badge-data') -const { addv: versionText } = require('../../lib/text-formatters') -const { version: versionColor } = require('../../lib/color-formatters') +const Joi = require('joi') +const BaseJsonService = require('../base-json') +const { renderVersionBadge } = require('../../lib/version') +const { NotFound } = require('../errors') +const { nonNegativeInteger } = require('../validators') -// This legacy service should be rewritten to use e.g. BaseJsonService. -// -// Tips for rewriting: -// https://github.com/badges/shields/blob/master/doc/rewriting-services.md -// -// Do not base new services on this code. -module.exports = class Itunes extends LegacyService { +const schema = Joi.object({ + resultCount: nonNegativeInteger, + results: Joi.array() + .items(Joi.object({ version: Joi.string().required() })) + .min(0), +}).required() + +module.exports = class Itunes extends BaseJsonService { static get category() { return 'version' } @@ -19,61 +21,41 @@ module.exports = class Itunes extends LegacyService { static get route() { return { base: 'itunes/v', + pattern: ':bundleId', } } + static get defaultBadgeData() { + return { label: 'itunes app store' } + } + static get examples() { return [ { title: 'iTunes App Store', - pattern: ':bundleId', - namedParams: { - bundleId: '803453959', - }, - staticPreview: { - label: 'itunes app store', - message: 'v3.3.3', - color: 'blue', - }, + namedParams: { bundleId: '803453959' }, + staticPreview: renderVersionBadge({ version: 'v3.3.3' }), }, ] } - static registerLegacyRouteHandler({ camp, cache }) { - camp.route( - /^\/itunes\/v\/(.+)\.(svg|png|gif|jpg|json)$/, - cache((data, match, sendBadge, request) => { - const bundleId = match[1] // eg, `324684580` - const format = match[2] - const apiUrl = `https://itunes.apple.com/lookup?id=${bundleId}` - const badgeData = getBadgeData('itunes app store', data) - request(apiUrl, (err, res, buffer) => { - if (err !== null) { - badgeData.text[1] = 'inaccessible' - sendBadge(format, badgeData) - return - } - try { - const data = JSON.parse(buffer) - if (data.resultCount === 0) { - /* Note the 'not found' response from iTunes is: - status code = 200, - body = { "resultCount":0, "results": [] } - */ - badgeData.text[1] = 'not found' - sendBadge(format, badgeData) - return - } - const version = data.results[0].version - badgeData.text[1] = versionText(version) - badgeData.colorscheme = versionColor(version) - sendBadge(format, badgeData) - } catch (e) { - badgeData.text[1] = 'invalid' - sendBadge(format, badgeData) - } - }) - }) - ) + async fetch({ bundleId }) { + return this._requestJson({ + schema, + url: `https://itunes.apple.com/lookup?id=${bundleId}`, + }) + } + + async handle({ bundleId }) { + const data = await this.fetch({ bundleId }) + + if (data.resultCount === 0) { + // Note the 'not found' response from iTunes is: + // status code = 200, + // body = { "resultCount":0, "results": [] } + throw new NotFound() + } + + return renderVersionBadge({ version: data.results[0].version }) } } diff --git a/services/itunes/itunes.tester.js b/services/itunes/itunes.tester.js index e35a07f9a7..19696f0bc7 100644 --- a/services/itunes/itunes.tester.js +++ b/services/itunes/itunes.tester.js @@ -1,16 +1,12 @@ 'use strict' const Joi = require('joi') -const ServiceTester = require('../service-tester') - const { isVPlusDottedVersionAtLeastOne } = require('../test-validators') -const { invalidJSON } = require('../response-fixtures') -const t = new ServiceTester({ id: 'itunes', title: 'iTunes' }) -module.exports = t +const t = (module.exports = require('../create-service-tester')()) t.create('iTunes version (valid)') - .get('/v/324684580.json') + .get('/324684580.json') .expectJSONTypes( Joi.object().keys({ name: 'itunes app store', @@ -19,23 +15,9 @@ t.create('iTunes version (valid)') ) t.create('iTunes version (not found)') - .get('/v/9.json') + .get('/9.json') .expectJSON({ name: 'itunes app store', value: 'not found' }) t.create('iTunes version (invalid)') - .get('/v/x.json') - .expectJSON({ name: 'itunes app store', value: 'invalid' }) - -t.create('iTunes version (connection error)') - .get('/v/324684580.json') - .networkOff() - .expectJSON({ name: 'itunes app store', value: 'inaccessible' }) - -t.create('iTunes version (unexpected response)') - .get('/v/324684580.json') - .intercept(nock => - nock('https://itunes.apple.com') - .get('/lookup?id=324684580') - .reply(invalidJSON) - ) + .get('/x.json') .expectJSON({ name: 'itunes app store', value: 'invalid' })