Skip to content
Snippets Groups Projects
  • CanisHelix's avatar
    8f1f787c
    [GITEA] add new gitea service (release/languages) (#9781) · 8f1f787c
    CanisHelix authored
    * add gitea service based on gitlab
    
    * update gitea to use mocks
    
    * add gitea release test
    
    * move tests to use public repo on codeberg and fixes
    
    * add pagination, update tests to live, set gitea_url as required
    
    * add auth test (wip)
    
    * fix base auth test
    
    * fix required optionalUrl, remove default, assume semver from firstpage
    
    * update example to use stable repository
    [GITEA] add new gitea service (release/languages) (#9781)
    CanisHelix authored
    * add gitea service based on gitlab
    
    * update gitea to use mocks
    
    * add gitea release test
    
    * move tests to use public repo on codeberg and fixes
    
    * add pagination, update tests to live, set gitea_url as required
    
    * add auth test (wip)
    
    * fix base auth test
    
    * fix required optionalUrl, remove default, assume semver from firstpage
    
    * update example to use stable repository
gitea-languages-count.service.js 1.97 KiB
import Joi from 'joi'
import { nonNegativeInteger, optionalUrl } from '../validators.js'
import { metric } from '../text-formatters.js'
import { pathParam, queryParam } from '../index.js'
import { documentation, httpErrorsFor } from './gitea-helper.js'
import GiteaBase from './gitea-base.js'

/*
We're expecting a response like { "Python": 39624, "Shell": 104 }
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.required(),
}).required()

export default class GiteaLanguageCount extends GiteaBase {
  static category = 'analysis'

  static route = {
    base: 'gitea/languages/count',
    pattern: ':user/:repo',
    queryParamSchema,
  }

  static openApi = {
    '/gitea/languages/count/{user}/{repo}': {
      get: {
        summary: 'Gitea language count',
        description: documentation,
        parameters: [
          pathParam({
            name: 'user',
            example: 'forgejo',
          }),
          pathParam({
            name: 'repo',
            example: 'forgejo',
          }),
          queryParam({
            name: 'gitea_url',
            example: 'https://codeberg.org',
            required: true,
          }),
        ],
      },
    },
  }

  static defaultBadgeData = { label: 'languages' }

  static render({ languagesCount }) {
    return {
      message: metric(languagesCount),
      color: 'blue',
    }
  }

  async fetch({ user, repo, baseUrl }) {
    // https://try.gitea.io/api/swagger#/repository/repoGetLanguages
    return super.fetch({
      schema,
      url: `${baseUrl}/api/v1/repos/${user}/${repo}/languages`,
      httpErrors: httpErrorsFor('user or repo not found'),
    })
  }

  async handle({ user, repo }, { gitea_url: baseUrl }) {
    const data = await this.fetch({
      user,
      repo,
      baseUrl,
    })
    return this.constructor.render({ languagesCount: Object.keys(data).length })
  }
}