This commit is contained in:
2026-01-12 03:16:35 +08:00
parent c2dcc53018
commit 5310ff28ae
48 changed files with 1349 additions and 254 deletions

190
src/mission/index.ts Normal file
View File

@@ -0,0 +1,190 @@
import { CNBCore, CNBCoreOptions, RequestOptions, Result } from "../cnb-core.ts";
export class Mission extends CNBCore {
constructor(options: CNBCoreOptions) {
super({ token: options.token, cookie: options.cookie });
}
/**
* 查询组织下用户有权限查看的任务集
* @param params 查询参数
* @returns 任务集列表
*/
getMissions(group: string, params?: GetMissionsParams): Promise<Result<Missions4User[]>> {
const url = `/${group}/-/missions`;
return this.get({
url,
params: {
page: 1,
page_size: 10,
...params,
},
});
}
/**
* 创建任务集
* @param data 创建任务集数据
* @returns 创建结果
*/
createMission(repo: string, data: CreateMissionData): Promise<Result<any>> {
const url = `/${repo}/-/missions`;
return this.post({ url, data });
}
/**
* 删除任务集
* @param mission 任务集路径
* @param identityTicket 微信身份验证票据
* @returns 删除结果
*/
deleteMission(mission: string, identityTicket?: string): Promise<Result<any>> {
const url = `/${mission}`;
return this.delete({
url,
headers: identityTicket ? { 'x-cnb-identity-ticket': identityTicket } : undefined,
});
}
/**
* 获取任务集视图配置
* @param mission 任务集 slug
* @param viewId 视图 ID
* @returns 视图配置
*/
getMissionViewConfig(mission: string, viewId: string): Promise<Result<MissionViewConfig>> {
const url = `/${mission}/-/mission/view`;
return this.get({
url,
params: { id: viewId },
});
}
/**
* 设置任务集视图配置
* @param mission 任务集 slug
* @param config 视图配置
* @returns 设置结果
*/
setMissionViewConfig(mission: string, config: MissionViewConfig): Promise<Result<any>> {
const url = `/${mission}/-/mission/view`;
return this.post({ url, data: config });
}
/**
* 获取任务集视图列表
* @param mission 任务集 slug
* @returns 视图列表
*/
getMissionViewList(mission: string): Promise<Result<MissionView[]>> {
const url = `/${mission}/-/mission/view-list`;
return this.get({
url,
headers: {
'Accept': 'application/vnd.cnb.api+json',
}
});
}
/**
* 添加或修改任务集视图
* @param mission 任务集 slug
* @param view 视图数据
* @returns 操作结果
*/
putMissionView(mission: string, view: MissionView): Promise<Result<any>> {
const url = `/${mission}/-/mission/view-list`;
return this.put({ url, data: view });
}
/**
* 排序任务集视图
* @param mission 任务集 slug
* @param data 排序数据
* @returns 操作结果
*/
sortMissionViews(mission: string, data: MissionPostViewReq): Promise<Result<any>> {
const url = `/${mission}/-/mission/view-list`;
return this.post({ url, data });
}
/**
* 改变任务集可见性
* @param mission 任务集路径
* @param visibility 可见性 (Private 或 Public)
* @returns 操作结果
*/
setVisibility(mission: string, visibility: 'Private' | 'Public'): Promise<Result<any>> {
const url = `/${mission}/-/settings/set_visibility`;
return this.post({
url,
params: { visibility },
});
}
}
// ==================== 类型定义 ====================
type GetMissionsParams = {
page?: number;
page_size?: number;
filter_type?: 'private' | 'public';
order_by?: 'created_at' | 'name';
desc?: boolean;
descendant?: 'all' | 'sub' | 'grand';
search?: string;
};
type CreateMissionData = {
name: string;
description?: string;
visibility?: 'Private' | 'Public';
};
type Missions4User = {
id: string;
name: string;
slug_path: string;
description: string;
visibility: 'Private' | 'Public';
created_at: string;
updated_at: string;
web_url: string;
};
type MissionView = {
id: string;
name: string;
description?: string;
config?: MissionViewConfig;
created_at?: string;
updated_at?: string;
};
type MissionViewConfig = {
id: string;
name: string;
description?: string;
columns?: MissionViewColumn[];
filters?: MissionViewFilter[];
sort_by?: string;
sort_order?: 'asc' | 'desc';
};
type MissionViewColumn = {
key: string;
label: string;
width?: number;
visible?: boolean;
sortable?: boolean;
};
type MissionViewFilter = {
key: string;
operator?: 'eq' | 'ne' | 'contains' | 'gt' | 'lt' | 'gte' | 'lte';
value?: any;
};
type MissionPostViewReq = {
view_ids: string[];
};