From dc113e0a999b26566bfd62f2eeee3f8a079ce461 Mon Sep 17 00:00:00 2001 From: Nigel George Date: Mon, 18 Dec 2023 13:23:08 +0900 Subject: [PATCH] fix required optionalUrl, remove default, assume semver from firstpage --- services/gitea/gitea-base.js | 71 ------------------- services/gitea/gitea-helper.js | 3 +- .../gitea/gitea-languages-count.service.js | 9 +-- services/gitea/gitea-release.service.js | 11 ++- services/gitea/gitea-release.tester.js | 2 +- 5 files changed, 10 insertions(+), 86 deletions(-) diff --git a/services/gitea/gitea-base.js b/services/gitea/gitea-base.js index 517efc0afe245..2a14ba846ef01 100644 --- a/services/gitea/gitea-base.js +++ b/services/gitea/gitea-base.js @@ -16,75 +16,4 @@ export default class GiteaBase extends BaseJsonService { }), ) } - - async fetchPage({ page, requestParams, schema }) { - const { - options: { searchParams: existingQuery, ...restOptions } = {}, - ...rest - } = requestParams - - requestParams = { - options: { - searchParams: { - ...existingQuery, - ...{ page }, - }, - ...restOptions, - }, - ...rest, - } - - const { res, buffer } = await this._request( - this.authHelper.withBearerAuthHeader({ - ...requestParams, - }), - ) - - const json = this._parseJson(buffer) - const data = this.constructor._validate(json, schema) - - return { res, data } - } - - async fetchPaginatedArrayData({ - url, - options, - schema, - httpErrors, - firstPageOnly = false, - }) { - const requestLimit = 100 - const requestParams = { - url, - options: { - headers: { Accept: 'application/json' }, - searchParams: { limit: requestLimit }, - ...options, - }, - httpErrors, - } - - const { - res: { headers }, - data, - } = await this.fetchPage({ page: 1, requestParams, schema }) - const numberOfItems = headers['x-total-count'] - - let numberOfPages = 1 - if (numberOfItems > 0) { - numberOfPages = Math.ceil(numberOfItems / requestLimit) - } - - if (numberOfPages === 1 || firstPageOnly) { - return data - } - - const pageData = await Promise.all( - [...Array(numberOfPages - 1).keys()].map((_, i) => - this.fetchPage({ page: ++i + 1, requestParams, schema }), - ), - ) - - return [...data].concat(...pageData.map(p => p.data)) - } } diff --git a/services/gitea/gitea-helper.js b/services/gitea/gitea-helper.js index fc03e6b651959..51242d819d508 100644 --- a/services/gitea/gitea-helper.js +++ b/services/gitea/gitea-helper.js @@ -1,6 +1,5 @@ const documentation = ` -Note that only internet-accessible Gitea compatible instances are supported, for example -[https://codeberg.org](https://codeberg.org). +Note that the gitea_url parameter is required because there is canonical hosted gitea service provided by Gitea. ` function httpErrorsFor() { diff --git a/services/gitea/gitea-languages-count.service.js b/services/gitea/gitea-languages-count.service.js index 8458a020bcd3f..1e8df38c25df1 100644 --- a/services/gitea/gitea-languages-count.service.js +++ b/services/gitea/gitea-languages-count.service.js @@ -12,7 +12,7 @@ The keys could be anything and {} is a valid response (e.g: for an empty repo) const schema = Joi.object().pattern(/./, nonNegativeInteger) const queryParamSchema = Joi.object({ - gitea_url: optionalUrl, + gitea_url: optionalUrl.required(), }).required() export default class GiteaLanguageCount extends GiteaBase { @@ -58,7 +58,7 @@ export default class GiteaLanguageCount extends GiteaBase { } async fetch({ user, repo, baseUrl }) { - // https://codeberg.org/api/swagger#/repository/repoGetLanguages + // https://try.gitea.io/api/swagger#/repository/repoGetLanguages return super.fetch({ schema, url: `${baseUrl}/api/v1/repos/${user}/${repo}/languages`, @@ -66,10 +66,7 @@ export default class GiteaLanguageCount extends GiteaBase { }) } - async handle( - { user, repo }, - { gitea_url: baseUrl = 'https://codeberg.org' }, - ) { + async handle({ user, repo }, { gitea_url: baseUrl }) { const data = await this.fetch({ user, repo, diff --git a/services/gitea/gitea-release.service.js b/services/gitea/gitea-release.service.js index 72372f887d687..2d364ccca4a21 100644 --- a/services/gitea/gitea-release.service.js +++ b/services/gitea/gitea-release.service.js @@ -18,7 +18,7 @@ const displayNameEnum = ['tag', 'release'] const dateOrderByEnum = ['created_at', 'published_at'] const queryParamSchema = Joi.object({ - gitea_url: optionalUrl, + gitea_url: optionalUrl.required(), include_prereleases: Joi.equal(''), sort: Joi.string() .valid(...sortEnum) @@ -86,13 +86,12 @@ export default class GiteaRelease extends GiteaBase { static defaultBadgeData = { label: 'release' } - async fetch({ user, repo, baseUrl, isSemver }) { - // https://codeberg.org/api/swagger#/repository/repoGetRelease - return this.fetchPaginatedArrayData({ + async fetch({ user, repo, baseUrl }) { + // https://try.gitea.io/api/swagger#/repository/repoGetRelease + return super.fetch({ schema, url: `${baseUrl}/api/v1/repos/${user}/${repo}/releases`, httpErrors: httpErrorsFor(), - firstPageOnly: !isSemver, }) } @@ -123,7 +122,7 @@ export default class GiteaRelease extends GiteaBase { async handle( { user, repo }, { - gitea_url: baseUrl = 'https://codeberg.org', + gitea_url: baseUrl, include_prereleases: pre, sort, display_name: displayName, diff --git a/services/gitea/gitea-release.tester.js b/services/gitea/gitea-release.tester.js index ba3eab0d7fc4f..1f6894e6215cf 100644 --- a/services/gitea/gitea-release.tester.js +++ b/services/gitea/gitea-release.tester.js @@ -30,7 +30,7 @@ t.create('Release (latest by semver pre-release)') .expectBadge({ label: 'release', message: 'v5.0.0-rc1', color: 'orange' }) t.create('Release (project not found)') - .get('/CanisHelix/does-not-exist.json') + .get('/CanisHelix/does-not-exist.json?gitea_url=https://codeberg.org') .expectBadge({ label: 'release', message: 'user or repo not found' }) t.create('Release (no tags)')