Skip to content

Commit

Permalink
feat(baget): Added version & download count badges
Browse files Browse the repository at this point in the history
  • Loading branch information
lluiscab committed Dec 15, 2023
1 parent 1f6de9b commit bb2682f
Show file tree
Hide file tree
Showing 2 changed files with 77 additions and 20 deletions.
41 changes: 41 additions & 0 deletions services/baget/baget.service.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
import { createServiceFamily } from '../nuget/nuget-v3-service-family.js'

const { NugetVersionService: Version, NugetDownloadService: Downloads } =
createServiceFamily({
defaultLabel: 'baget',
serviceBaseUrl: 'baget',
withTenant: false,
withFeed: false,
withQueryNamedParams: false,
packageDataIncludesVersion: true,
})

class BagetVersionService extends Version {
static examples = [
{
title: 'Baget',
pattern: 'v/:packageName',
namedParams: { packageName: 'Microsoft.AspNet.Mvc' },
staticPreview: this.render({ version: '5.2.4' }),
},
{
title: 'Baget (with prereleases)',
pattern: 'vpre/:packageName',
namedParams: { packageName: 'Microsoft.AspNet.Mvc' },
staticPreview: this.render({ version: '5.2.5-preview1' }),
},
]
}

class BagetDownloadService extends Downloads {
static examples = [
{
title: 'Baget',
pattern: 'dt/:packageName',
namedParams: { packageName: 'Microsoft.AspNet.Mvc' },
staticPreview: this.render({ downloads: 49e6 }),
},
]
}

export { BagetVersionService, BagetDownloadService }
56 changes: 36 additions & 20 deletions services/nuget/nuget-v3-service-family.js
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,7 @@ const schema = Joi.object({
.default([]),
totalDownloads: Joi.number().integer(),
totaldownloads: Joi.number().integer(),
version: Joi.string().optional(), // Available in BaGet server
}),
)
.max(1)
Expand All @@ -73,16 +74,18 @@ const schema = Joi.object({
*/
async function fetch(
serviceInstance,
{ baseUrl, packageName, includePrereleases = false },
{ baseUrl, packageName, includePrereleases = true, queryNamedParams },
) {
return serviceInstance._requestJson({
schema,
url: await searchServiceUrl(baseUrl, 'SearchQueryService'),
options: {
searchParams: {
q: `packageid:${encodeURIComponent(packageName.toLowerCase())}`,
q: queryNamedParams
? `packageid:${encodeURIComponent(packageName.toLowerCase())}`
: encodeURIComponent(packageName.toLowerCase()),
// Include prerelease versions.
prerelease: 'true',
prerelease: includePrereleases,
// Include packages with SemVer 2 version numbers.
semVerLevel: '2',
},
Expand Down Expand Up @@ -117,12 +120,15 @@ function createServiceFamily({
apiDomain,
apiBaseUrl,
withFeed = true,
withQueryNamedParams = true,
packageDataIncludesVersion = false,
}) {
/**
* Extract source parameters
*/

function unpackParams({ source = apiBaseUrl }) {
if (source.includes('v3')) return { source }
return { source: `${source}/v3` }
}

Expand Down Expand Up @@ -151,15 +157,17 @@ function createServiceFamily({
* Extract version information from the raw package info.
*/
transform({ json, includePrereleases }) {
if (json.data.length === 1 && json.data[0].versions.length > 0) {
const { versions: packageVersions } = json.data[0]
const versions = packageVersions.map(item =>
stripBuildMetadata(item.version),
)
return selectVersion(versions, includePrereleases)
} else {
if (json.data.length !== 1 || json.data[0].versions.length <= 0)
throw new NotFound({ prettyMessage: 'package not found' })
}

// Baget server includes latest package version in the data response
if (packageDataIncludesVersion) return json.data[0].version

const { versions: packageVersions } = json.data[0]
const versions = packageVersions.map(item =>
stripBuildMetadata(item.version),
)
return selectVersion(versions, includePrereleases)
}

async handle({ tenant, feed, which, packageName }, queryParams) {
Expand All @@ -175,7 +183,12 @@ function createServiceFamily({
withFeed,
feed,
})
const json = await fetch(this, { baseUrl, packageName })
const json = await fetch(this, {
baseUrl,
packageName,
includePrereleases,
queryNamedParams: withQueryNamedParams,
})
const version = this.transform({ json, includePrereleases })
return this.constructor.render({ version, feed })
}
Expand All @@ -202,14 +215,13 @@ function createServiceFamily({
* Extract download count from the raw package.
*/
transform({ json }) {
if (json.data.length === 1) {
const packageInfo = json.data[0]
// Official NuGet server uses "totalDownloads" whereas MyGet uses
// "totaldownloads" (lowercase D). Ugh.
return packageInfo.totalDownloads || packageInfo.totaldownloads || 0
} else {
if (json.data.length !== 1)
throw new NotFound({ prettyMessage: 'package not found' })
}

const packageInfo = json.data[0]
// Official NuGet server uses "totalDownloads" whereas MyGet uses
// "totaldownloads" (lowercase D). Ugh.
return packageInfo.totalDownloads || packageInfo.totaldownloads || 0
}

async handle({ tenant, feed, which, packageName }, queryParams) {
Expand All @@ -223,7 +235,11 @@ function createServiceFamily({
withFeed,
feed,
})
const json = await fetch(this, { baseUrl, packageName })
const json = await fetch(this, {
baseUrl,
packageName,
queryNamedParams: withQueryNamedParams,
})
const downloads = this.transform({ json })
return this.constructor.render({ downloads })
}
Expand Down

0 comments on commit bb2682f

Please sign in to comment.