190 lines
4.5 KiB
TypeScript
190 lines
4.5 KiB
TypeScript
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[];
|
|
}; |