UNPKG

gitea-repository-provider

Version:
133 lines (111 loc) 3.08 kB
import fetch from "node-fetch"; import { Provider } from "repository-provider"; import { GiteaRepository } from "./gitea-repository.mjs"; import { GiteaPullRequest } from "./gitea-pull-request.mjs"; import { GiteaOrganization } from "./gitea-organization.mjs"; import { GiteaUser } from "./gitea-user.mjs"; import { join } from "./util.mjs"; /** * Gitea provider * */ export class GiteaProvider extends Provider { /** * known environment variables * @return {Object} * @return {string} GITEA_TOKEN api token * @return {string} GITEA_API api url */ static get environmentOptions() { return { GITEA_TOKEN: "token", GITEA_API: "api" }; } static get defaultOptions() { return { api: undefined, token: undefined, ...super.defaultOptions }; } /** * @param {Object} options * @return {boolean} true if token an api are present */ static areOptionsSufficciant(options) { return options.token !== undefined && options.api !== undefined; } /** * fetch headers * @return {Object} suitable as fetch headers */ get headers() { return { authorization: "token " + this.token }; } async _initialize() { await this.fetchAllRepositories(); } async fetchAllRepositories() { let page = 1; while (true) { const result = await fetch( join(this.api, `repos/search?limit=50&page=${page}`), { headers: this.headers, accept: "application/json" } ); const json = await result.json(); if (json.data.length === 0) { break; } const mapAttributesNames = { archived: 'isArchived' }; for (const r of json.data) { const [gn, rn] = r.full_name.split(/\//); const group = await this.createRepositoryGroup(gn, r.owner); await group.createRepository(rn, Object.fromEntries(Object.entries(r).map(([name,value]) => [mapAttributesNames[name] ? mapAttributesNames[name] : name, value]))); } page++; } } async _createRepositoryGroup(name, options) { const fetchOptions = { headers: this.headers, accept: "application/json" }; let clazz; let result = await fetch(join(this.api, "orgs", name), fetchOptions); if (result.ok) { clazz = GiteaOrganization; } else { clazz = GiteaUser; result = await fetch(join(this.api, "users", name), fetchOptions); } const data = await result.json(); const repositoryGroup = new clazz(this, name, data); await repositoryGroup.initialize(); this._repositoryGroups.set(repositoryGroup.name, repositoryGroup); return repositoryGroup; } /** * All possible base urls * @return {string[]} common base urls of all repositories */ get repositoryBases() { return [this.api.replace(/api\/v.+$/, "")]; } get repositoryClass() { return GiteaRepository; } get pullRequestClass() { return GiteaPullRequest; } get repositoryGroupClass() { return GiteaOrganization; } }