172 lines
5.5 KiB
TypeScript
172 lines
5.5 KiB
TypeScript
import type { GiteaClient } from './gitea.classes.giteaclient.js';
|
|
import type { IGiteaRepository, IGiteaSecret, IListOptions, IActionRunListOptions } from './gitea.interfaces.js';
|
|
import { GiteaBranch } from './gitea.classes.branch.js';
|
|
import { GiteaTag } from './gitea.classes.tag.js';
|
|
import { GiteaSecret } from './gitea.classes.secret.js';
|
|
import { GiteaActionRun } from './gitea.classes.actionrun.js';
|
|
import { autoPaginate } from './gitea.helpers.js';
|
|
|
|
export class GiteaRepository {
|
|
// Raw data
|
|
public readonly id: number;
|
|
public readonly name: string;
|
|
public readonly fullName: string;
|
|
public readonly description: string;
|
|
public readonly defaultBranch: string;
|
|
public readonly htmlUrl: string;
|
|
public readonly isPrivate: boolean;
|
|
public readonly topics: string[];
|
|
public readonly updatedAt: string;
|
|
public readonly ownerId: number;
|
|
public readonly ownerLogin: string;
|
|
public readonly ownerAvatarUrl: string;
|
|
|
|
/** @internal */
|
|
constructor(
|
|
private client: GiteaClient,
|
|
raw: IGiteaRepository,
|
|
) {
|
|
this.id = raw.id;
|
|
this.name = raw.name || '';
|
|
this.fullName = raw.full_name || '';
|
|
this.description = raw.description || '';
|
|
this.defaultBranch = raw.default_branch || 'main';
|
|
this.htmlUrl = raw.html_url || '';
|
|
this.isPrivate = raw.private ?? true;
|
|
this.topics = raw.topics || [];
|
|
this.updatedAt = raw.updated_at || '';
|
|
this.ownerId = raw.owner?.id || 0;
|
|
this.ownerLogin = raw.owner?.login || '';
|
|
this.ownerAvatarUrl = raw.owner?.avatar_url || '';
|
|
}
|
|
|
|
// ---------------------------------------------------------------------------
|
|
// Branches & Tags
|
|
// ---------------------------------------------------------------------------
|
|
|
|
async getBranches(opts?: IListOptions): Promise<GiteaBranch[]> {
|
|
return autoPaginate(
|
|
(page, perPage) => this.client.requestGetRepoBranches(this.fullName, { ...opts, page, perPage }),
|
|
opts,
|
|
).then(branches => branches.map(b => new GiteaBranch(b)));
|
|
}
|
|
|
|
async getTags(opts?: IListOptions): Promise<GiteaTag[]> {
|
|
return autoPaginate(
|
|
(page, perPage) => this.client.requestGetRepoTags(this.fullName, { ...opts, page, perPage }),
|
|
opts,
|
|
).then(tags => tags.map(t => new GiteaTag(t)));
|
|
}
|
|
|
|
// ---------------------------------------------------------------------------
|
|
// Secrets
|
|
// ---------------------------------------------------------------------------
|
|
|
|
async getSecrets(): Promise<GiteaSecret[]> {
|
|
const secrets = await this.client.requestGetRepoSecrets(this.fullName);
|
|
return secrets.map(s => new GiteaSecret(s));
|
|
}
|
|
|
|
async setSecret(key: string, value: string): Promise<void> {
|
|
await this.client.requestSetRepoSecret(this.fullName, key, value);
|
|
}
|
|
|
|
async deleteSecret(key: string): Promise<void> {
|
|
await this.client.requestDeleteRepoSecret(this.fullName, key);
|
|
}
|
|
|
|
// ---------------------------------------------------------------------------
|
|
// Action Runs
|
|
// ---------------------------------------------------------------------------
|
|
|
|
async getActionRuns(opts?: IActionRunListOptions): Promise<GiteaActionRun[]> {
|
|
return autoPaginate(
|
|
(page, perPage) => this.client.requestGetActionRuns(this.fullName, { ...opts, page, perPage }),
|
|
opts,
|
|
).then(runs => runs.map(r => new GiteaActionRun(this.client, this.fullName, r)));
|
|
}
|
|
|
|
// ---------------------------------------------------------------------------
|
|
// Mutation
|
|
// ---------------------------------------------------------------------------
|
|
|
|
/**
|
|
* Update repository properties.
|
|
*/
|
|
async update(data: {
|
|
name?: string;
|
|
description?: string;
|
|
defaultBranch?: string;
|
|
private?: boolean;
|
|
archived?: boolean;
|
|
}): Promise<void> {
|
|
await this.client.requestPatchRepo(this.fullName, {
|
|
name: data.name,
|
|
description: data.description,
|
|
default_branch: data.defaultBranch,
|
|
private: data.private,
|
|
archived: data.archived,
|
|
});
|
|
}
|
|
|
|
/**
|
|
* Set topics for this repository (replaces all existing topics).
|
|
*/
|
|
async setTopics(topics: string[]): Promise<void> {
|
|
await this.client.requestSetRepoTopics(this.fullName, topics);
|
|
}
|
|
|
|
/**
|
|
* Upload an avatar image for this repository.
|
|
* @param imageBase64 - Base64-encoded image data
|
|
*/
|
|
async setAvatar(imageBase64: string): Promise<void> {
|
|
await this.client.requestPostRepoAvatar(this.fullName, imageBase64);
|
|
}
|
|
|
|
/**
|
|
* Remove the repository's avatar.
|
|
*/
|
|
async deleteAvatar(): Promise<void> {
|
|
await this.client.requestDeleteRepoAvatar(this.fullName);
|
|
}
|
|
|
|
/**
|
|
* Transfer this repository to a different owner (org or user).
|
|
*/
|
|
async transfer(newOwner: string, teamIds?: number[]): Promise<void> {
|
|
await this.client.requestTransferRepo(this.fullName, newOwner, teamIds);
|
|
}
|
|
|
|
/**
|
|
* Delete this repository.
|
|
*/
|
|
async delete(): Promise<void> {
|
|
const [owner, repo] = this.fullName.split('/');
|
|
await this.client.requestDeleteRepo(owner, repo);
|
|
}
|
|
|
|
// ---------------------------------------------------------------------------
|
|
// Serialization
|
|
// ---------------------------------------------------------------------------
|
|
|
|
toJSON(): IGiteaRepository {
|
|
return {
|
|
id: this.id,
|
|
name: this.name,
|
|
full_name: this.fullName,
|
|
description: this.description,
|
|
default_branch: this.defaultBranch,
|
|
html_url: this.htmlUrl,
|
|
private: this.isPrivate,
|
|
topics: this.topics,
|
|
updated_at: this.updatedAt,
|
|
owner: {
|
|
id: this.ownerId,
|
|
login: this.ownerLogin,
|
|
avatar_url: this.ownerAvatarUrl,
|
|
},
|
|
};
|
|
}
|
|
}
|