feat: 添加 Repo 和 User 模块,增强 CNBCore 功能
This commit is contained in:
161
src/repo/index.ts
Normal file
161
src/repo/index.ts
Normal 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;
|
||||
}
|
||||
Reference in New Issue
Block a user