From 2c4e2c47d22be2f40c8701c2699b8c79fe3ba649 Mon Sep 17 00:00:00 2001 From: jNullj <15849761+jNullj@users.noreply.github.com> Date: Sat, 2 Mar 2024 16:55:50 +0200 Subject: [PATCH] Add architecture query parameter to SnapcraftVersion Added architecture query parameter: The snapcraft-version.service.js file now accepts an optional arch query parameter to specify the desired architecture for the Snap package. This defaults to amd64 if not provided. If an unsupported architecture is specified in the query parameter, a NotFound error is thrown with a specific message indicating that the requested architecture is not found. The snapcraft-version.tester.js file is updated to include a new test case that verifies the behavior when using the arch query parameter and also includes a test case for handling an invalid architecture. --- .../snapcraft/snapcraft-version.service.js | 34 +++++++++++++++---- .../snapcraft/snapcraft-version.tester.js | 14 ++++++++ 2 files changed, 41 insertions(+), 7 deletions(-) diff --git a/services/snapcraft/snapcraft-version.service.js b/services/snapcraft/snapcraft-version.service.js index 67d87b6d8b85b..6d287f0d1a157 100644 --- a/services/snapcraft/snapcraft-version.service.js +++ b/services/snapcraft/snapcraft-version.service.js @@ -1,12 +1,17 @@ import Joi from 'joi' -import { BaseJsonService, NotFound, pathParams } from '../index.js' +import { BaseJsonService, NotFound, pathParams, queryParam } from '../index.js' import { renderVersionBadge } from '../version.js' +const queryParamSchema = Joi.object({ + arch: Joi.string(), +}) + const versionSchema = Joi.object({ 'channel-map': Joi.array() .items( Joi.object({ channel: Joi.object({ + architecture: Joi.string().required(), risk: Joi.string().required(), track: Joi.string().required(), }), @@ -23,6 +28,7 @@ export default class SnapcraftVersion extends BaseJsonService { static route = { base: 'snapcraft/v', pattern: ':package/:track/:risk', + queryParamSchema, } static defaultBadgeData = { label: 'snapcraft' } @@ -31,16 +37,24 @@ export default class SnapcraftVersion extends BaseJsonService { '/snapcraft/v/{package}/{track}/{risk}': { get: { summary: 'Snapcraft version', - parameters: pathParams( - { name: 'package', example: 'chromium' }, - { name: 'track', example: 'latest' }, - { name: 'risk', example: 'stable' }, - ), + parameters: [ + ...pathParams( + { name: 'package', example: 'chromium' }, + { name: 'track', example: 'latest' }, + { name: 'risk', example: 'stable' }, + ), + queryParam({ + name: 'arch', + example: 'amd64', + description: + 'Architecture, When not specified, this will default to `amd64`.', + }), + ], }, }, } - async handle({ package: packageName, track, risk }) { + async handle({ package: packageName, track, risk }, { arch = 'amd64' }) { const parsedData = await this._requestJson({ schema: versionSchema, options: { @@ -54,6 +68,12 @@ export default class SnapcraftVersion extends BaseJsonService { const channelMap = parsedData['channel-map'] let filteredChannelMap = channelMap.filter( + ({ channel }) => channel.architecture === arch, + ) + if (filteredChannelMap.length === 0) { + throw new NotFound({ prettyMessage: 'arch not found' }) + } + filteredChannelMap = channelMap.filter( ({ channel }) => channel.track === track, ) if (filteredChannelMap.length === 0) { diff --git a/services/snapcraft/snapcraft-version.tester.js b/services/snapcraft/snapcraft-version.tester.js index 42ae9d6159819..dc4a5001b66e4 100644 --- a/services/snapcraft/snapcraft-version.tester.js +++ b/services/snapcraft/snapcraft-version.tester.js @@ -9,6 +9,13 @@ t.create('Snapcraft Version for redis') message: isSemver, }) +t.create('Snapcraft Version for redis (query param arch=arm64)') + .get('/redis/latest/stable.json?arch=arm64') + .expectBadge({ + label: 'snapcraft', + message: isSemver, + }) + t.create('Snapcraft Version for redis (invalid package)') .get('/this_package_doesnt_exist/fake/fake.json') .expectBadge({ @@ -29,3 +36,10 @@ t.create('Snapcraft Version for redis (invalid risk)') label: 'snapcraft', message: 'risk not found', }) + +t.create('Snapcraft Version for redis (invalid arch)') + .get('/redis/latest/stable.json?arch=fake') + .expectBadge({ + label: 'snapcraft', + message: 'arch not found', + })