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> { const url = `/${group}/-/missions`; return this.get({ url, params: { page: 1, page_size: 10, ...params, }, }); } /** * 创建任务集 * @param data 创建任务集数据 * @returns 创建结果 */ createMission(repo: string, data: CreateMissionData): Promise> { const url = `/${repo}/-/missions`; return this.post({ url, data }); } /** * 删除任务集 * @param mission 任务集路径 * @param identityTicket 微信身份验证票据 * @returns 删除结果 */ deleteMission(mission: string, identityTicket?: string): Promise> { 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> { const url = `/${mission}/-/mission/view`; return this.get({ url, params: { id: viewId }, }); } /** * 设置任务集视图配置 * @param mission 任务集 slug * @param config 视图配置 * @returns 设置结果 */ setMissionViewConfig(mission: string, config: MissionViewConfig): Promise> { const url = `/${mission}/-/mission/view`; return this.post({ url, data: config }); } /** * 获取任务集视图列表 * @param mission 任务集 slug * @returns 视图列表 */ getMissionViewList(mission: string): Promise> { 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> { const url = `/${mission}/-/mission/view-list`; return this.put({ url, data: view }); } /** * 排序任务集视图 * @param mission 任务集 slug * @param data 排序数据 * @returns 操作结果 */ sortMissionViews(mission: string, data: MissionPostViewReq): Promise> { 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> { 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[]; };