Files
cnb/src/workspace.ts

207 lines
6.2 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
* @title 工作空间管理模块
* @description 提供云原生构建工作空间的管理功能,包括列表查询、创建、更新和删除工作空间,支持多种过滤条件和分页选项
* @tags workspace, cloud-native, development-environment, cnb, api
* @createdAt 2025-12-04
*/
import { CNBCore } from "./cnb-core.ts";
/**
* 工作空间列表查询参数
*/
export interface ListParams {
/** Git 分支名称,例如 "main" */
branch?: string;
/** 查询结束时间,格式 YYYY-MM-DD HH:mm:ssZZ,例如 2024-12-01 00:00:00+0800 */
end?: string;
/** 分页页码,默认为 1 */
page?: number;
/** 分页大小,默认 20,最大 100 */
pageSize?: number;
/** 仓库路径,例如 "groupname/reponame" */
slug?: string;
/** 查询开始时间,格式 YYYY-MM-DD HH:mm:ssZZ,例如 2024-12-01 00:00:00+0800 */
start?: string;
/** 开发环境状态,running: 开发环境已启动,closed: 开发环境已关闭 */
status?: 'running' | 'closed';
}
/**
* 云原生开发环境管理模块
* https://api.cnb.cool/#/operations/GetWorkspaceDetail
*/
export class Workspace extends CNBCore {
constructor(token: string) {
super({ token });
}
/**
* 删除我的云原生开发环境
* @param params 删除参数pipelineId 和 sn 二选一,优先使用 pipelineId
*/
async deleteWorkspace(params: { pipelineId?: string; sn?: string }): Promise<{ code: number; message: string }> {
const data: { pipelineId?: string; sn?: string } = {};
if (params.pipelineId) {
data.pipelineId = params.pipelineId;
} else if (params.sn) {
data.sn = params.sn;
} else {
throw new Error('pipelineId 和 sn 必须提供其中一个');
}
return this.post({ url: '/workspace/delete', data });
}
/** 获取我的云原生开发环境列表 */
async list(params?: ListParams): Promise<WorkspaceResult> {
return this.get({ url: '/workspace/list', params });
}
/**
* 停止我的云原生开发环境
* @param params 停止参数pipelineId 和 sn 二选一,优先使用 pipelineId
*/
async stopWorkspace(params: { pipelineId?: string; sn?: string }): Promise<{ buildLogUrl: string; message: string; sn: string }> {
const data: { pipelineId?: string; sn?: string } = {};
if (params.pipelineId) {
data.pipelineId = params.pipelineId;
} else if (params.sn) {
data.sn = params.sn;
} else {
throw new Error('pipelineId 和 sn 必须提供其中一个');
}
return this.post({ url: '/workspace/stop', data });
}
/**
* 根据流水线 SN 查询云原生开发访问地址
* @param repo 仓库路径例如groupname/reponame
* @param sn 流水线构建号
*/
async getDetail(repo: string, sn: string): Promise<{
codebuddy: string;
codebuddycn: string;
cursor: string;
jetbrains: Record<string, string>;
jumpUrl: string;
remoteSsh: string;
ssh: string;
vscode: string;
'vscode-insiders': string;
webide: string;
}> {
return this.get({ url: `/${repo}/-/workspace/detail/${sn}` });
}
/**
* 启动云原生开发环境,已存在环境则直接打开,否则重新创建开发环境
* @param repo 仓库路径例如groupname/reponame
* @param params 启动参数
* @returns 返回启动结果,包含以下字段:
*/
async startWorkspace(repo: string, params: { branch?: string; ref?: string }): Promise<{
/** 仅新创建开发环境时返回,表示创建开发环境的流水线日志地址 */
buildLogUrl?: string;
/** 仅新创建开发环境时返回,表示创建开发环境的提示信息 */
message?: string;
/** 仅新创建开发环境时返回,表示创建开发环境的流水线 sn */
sn?: string;
/** 如果存在开发环境,则返回 WebIDE 访问 url如果不存在开发环境则返回启动云原生开发的 loading 页面 url 地址 */
url: string;
}> {
const data: { branch?: string; ref?: string } = {};
if (params.branch) {
data.branch = params.branch;
}
if (params.ref) {
data.ref = params.ref;
}
return this.post({ url: `/${repo}/-/workspace/start`, data });
}
}
export type ResultList<T> = {
hasMore: boolean;
list: T[];
pageInfo: {
page: number;
pageSize: number;
};
total: number;
}
/**
* 工作空间信息接口
*/
export interface WorkspaceInfo {
/** 分支名例如main */
branch: string;
/** 业务 ID */
business_id: string;
/** 备份的 commit 数 */
commit_count: number | null;
/** 开发环境创建时间例如2024-12-02T03:20:22.000Z */
create_time: string;
/** 开发环境持续时间单位ms非实时更新 */
duration: number;
/** 备份的文件数 */
file_count: number;
/** 备份的文件列表,仅前五个备份文件相对路径 */
file_list: string;
/** 是否为预览环境0: 否1: 是 */
is_preview: number;
/** JetBrains IDE 列表 */
jetbrainsList: any[];
/** 环境销毁时远程最新的 commit short hash */
latest_sha: string | null;
/** 创建环境的子流水线 id */
pipeline_id: string;
/** 备份的 stash 数 */
remote_stash_count: number | null;
/** 仓库 ID */
repo_id: string;
/** 仓库地址 */
repo_url: string;
/** 恢复备份代码的流水线 id如果有值表示备份代码已被恢复重建环境时会恢复备份代码 */
restore_id: string | null;
/** 单个 stash 标识1: 是0: 否 */
single_stash: number;
/** 仓库路径例如groupname/reponame */
slug: string;
/** 创建开发环境的流水线 sn */
sn: string;
/** 开发环境是否支持 ssh 链接 */
ssh: boolean;
/** 本地 stash 数 */
stash_count: number;
/** 工作区状态running: 开发环境已启动closed开发环境已关闭 */
status: string;
/** 用户名 */
user_name: string;
/** 开发环境默认工作区路径 */
workspace: string;
}
/**
* 工作空间列表响应结果
*/
export type WorkspaceResult = {
/** 是否有更多数据 */
hasMore: boolean;
/** 工作空间列表 */
list: WorkspaceInfo[];
/** 分页信息 */
pageInfo: {
/** 当前页码 */
page: number;
/** 每页大小 */
pageSize: number;
};
/** 总数量 */
total: number;
}