feat: 添加 Repo 和 User 模块,增强 CNBCore 功能

This commit is contained in:
2025-12-15 17:08:39 +08:00
parent 5e43eb2db7
commit 52ccf115fb
9 changed files with 390 additions and 32 deletions

161
src/repo/index.ts Normal file
View File

@@ -0,0 +1,161 @@
import { CNBCore, CNBCoreOptions, RequestOptions, Result } from "../cnb-core";
type RepoOptions = CNBCoreOptions<{
group?: string;
}>
export class Repo extends CNBCore {
group: string;
constructor(options: RepoOptions) {
super({ token: options.token, cookie: options.cookie });
this.group = options.group || '';
}
/**
* 创建代码仓库
* @param group e.g. my-group
* @param data
* @returns
*/
createRepo(data: CreateRepoData): Promise<any> {
const group = this.group || '';
const url = `/${group}/-/repos`;
let postData: CreateRepoData = {
...data,
description: data.description || '',
name: data.name,
license: data.license || 'Unlicense',
visibility: data.visibility || 'private',
};
return this.post({ url, data: postData });
}
async createCommit(repo: string, data: CreateCommitData): Promise<any> {
const group = this.group || '';
const commitList = await this.getCommitList(repo, {
page: 1,
page_size: 1,
}, { useOrigin: true }).catch((err) => {
console.error("Error fetching commit list:", err);
return []
});
const preCommitSha = commitList.length > 0 ? commitList[0].sha : undefined;
if (!data.parent_commit_sha && preCommitSha) {
data.parent_commit_sha = preCommitSha;
}
const url = `https://cnb.cool/${group}/${repo}/-/git/commits`;
const postData: CreateCommitData = {
...data,
base_branch: data.base_branch || 'refs/heads/main',
message: data.message || 'commit from cnb sdk',
parent_commit_sha: data.parent_commit_sha,
files: data.files || [],
new_branch: data.new_branch || 'refs/heads/main',
};
if (!postData.parent_commit_sha) {
delete postData.parent_commit_sha;
delete postData.base_branch;
}
return this.post({ url, data: postData, useCookie: true, });
}
createBlobs(repo: string, data: { content: string, encoding?: 'utf-8' | 'base64' }): Promise<any> {
const group = this.group || '';
const url = `/${group}/${repo}/-/git/blobs`;
const postData = {
content: data.content,
encoding: data.encoding || 'utf-8',
};
return this.post({ url, data: postData });
}
uploadFiles(repo: string, data: { ext?: any, name?: string, path?: string, size?: number }): Promise<any> {
const group = this.group || '';
const url = `/${group}/${repo}/-/upload/files`
return this.post({ url, data });
}
getCommitList(repo: string, params: { author?: string, commiter?: string, page?: number, page_size?: number, sha?: string, since?: string, until?: string }, opts?: RequestOptions): Promise<any> {
const group = this.group || '';
const url = `/${group}/${repo}/-/git/commits`;
return this.get({ url, params, ...opts });
}
getRepoList(params: {
desc?: boolean;
filter_type?: 'private' | 'public' | 'secret';
flags?: 'KnowledgeBase';
order_by?: 'created_at' | 'last_updated_at' | 'stars' | 'slug_path' | 'forks';
page?: number;
page_size?: number;
role?: 'owner' | 'maintainer' | 'developer' | 'reporter' | 'guest';
search?: string;
status?: 'active' | 'archived';
}): Promise<Result<RepoItem[]>> {
const url = '/user/repos';
let _params = {
...params,
page: params.page || 1,
page_size: params.page_size || 999,
}
return this.get({ url, params: _params });
}
}
type CreateRepoData = {
description: string;
license?: 'MIT' | 'Apache-2.0' | 'GPL-3.0' | 'Unlicense';
name: string;
visibility: 'private' | 'public' | 'secret';
}
type CreateCommitData = {
base_branch?: string; // "refs/heads/main"
new_branch?: string; // "refs/heads/main"
message?: string;
parent_commit_sha?: string;
files?: Array<{
content: string;
path: string;
encoding?: 'raw' | 'utf-8' | 'base64';
is_delete?: boolean;
is_executable?: boolean;
}>;
}
type RepoItem = {
id: string;
name: string;
freeze: boolean;
status: number;
visibility_level: 'Public' | 'Private' | 'Secret';
flags: string;
created_at: string;
updated_at: string;
description: string;
site: string;
topics: string;
license: string;
display_module: {
activity: boolean;
contributors: boolean;
release: boolean;
};
star_count: number;
fork_count: number;
mark_count: number;
last_updated_at: string | null;
web_url: string;
path: string;
tags: string[] | null;
open_issue_count: number;
open_pull_request_count: number;
languages: {
language: string;
color: string;
};
second_languages: {
language: string;
color: string;
};
last_update_username: string;
last_update_nickname: string;
access: string;
stared: boolean;
star_time: string;
pinned: boolean;
pinned_time: string;
}