Skip to content

Commit

Permalink
Add architecture query parameter to SnapcraftVersion
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
jNullj committed Mar 2, 2024
1 parent 9ddcf16 commit 2c4e2c4
Show file tree
Hide file tree
Showing 2 changed files with 41 additions and 7 deletions.
34 changes: 27 additions & 7 deletions services/snapcraft/snapcraft-version.service.js
Original file line number Diff line number Diff line change
@@ -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(),
}),
Expand All @@ -23,6 +28,7 @@ export default class SnapcraftVersion extends BaseJsonService {
static route = {
base: 'snapcraft/v',
pattern: ':package/:track/:risk',
queryParamSchema,
}

static defaultBadgeData = { label: 'snapcraft' }
Expand All @@ -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: {
Expand All @@ -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) {
Expand Down
14 changes: 14 additions & 0 deletions services/snapcraft/snapcraft-version.tester.js
Original file line number Diff line number Diff line change
Expand Up @@ -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({
Expand All @@ -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',
})

0 comments on commit 2c4e2c4

Please sign in to comment.