update:添加分页、成员添加优化

This commit is contained in:
xiaozhu
2026-09-02 10:10:41 +08:00
committed by tao.chen
parent 5a90f7db36
commit b7b8e28b52
20 changed files with 1729 additions and 920 deletions
+77 -7
View File
@@ -230,6 +230,25 @@ type ApiEnvelope<T> = {
meta: Record<string, unknown>;
};
export type CursorPageMeta = {
limit: number;
page_count: number;
total_count: number;
has_more: boolean;
next_cursor: string | null;
};
export type CursorPage<T> = {
items: T[];
meta: CursorPageMeta;
};
export type CursorListParams = {
limit?: number;
cursor?: string | null;
q?: string;
};
type ApiErrorEnvelope = {
detail?: string | {
code?: string;
@@ -269,6 +288,15 @@ async function apiRequest<T>(
init: RequestInit = {},
workspaceId?: string,
): Promise<T> {
const result = await apiRequestWithMeta<T>(path, init, workspaceId);
return result.data;
}
async function apiRequestWithMeta<T>(
path: string,
init: RequestInit = {},
workspaceId?: string,
): Promise<{ data: T; meta: Record<string, unknown> }> {
const finalPath = workspaceId ? appendWorkspaceId(path, workspaceId) : path;
const response = await fetch(finalPath, {
...init,
@@ -311,7 +339,33 @@ async function apiRequest<T>(
: error.error?.code,
);
}
return (payload as ApiEnvelope<T>).data;
const envelope = payload as ApiEnvelope<T>;
return { data: envelope.data, meta: envelope.meta ?? {} };
}
function parseCursorPageMeta(meta: Record<string, unknown>): CursorPageMeta {
const totalFromMeta =
typeof meta.total_count === "number"
? meta.total_count
: typeof meta.count === "number"
? meta.count
: 0;
return {
limit: typeof meta.limit === "number" ? meta.limit : 10,
page_count: typeof meta.page_count === "number" ? meta.page_count : 0,
total_count: totalFromMeta,
has_more: Boolean(meta.has_more),
next_cursor: typeof meta.next_cursor === "string" ? meta.next_cursor : null,
};
}
function buildCursorQuery(input: CursorListParams = {}): string {
const parameters = new URLSearchParams();
parameters.set("limit", String(input.limit ?? 10));
if (input.cursor) parameters.set("cursor", input.cursor);
const keyword = input.q?.trim();
if (keyword) parameters.set("q", keyword);
return parameters.toString();
}
export async function listScripts(
@@ -1153,8 +1207,14 @@ export async function hideScheduleArtifact(
}
// 系统管理级别接口 - 不区分 workspace
export async function listPlatformEmployees(): Promise<Employee[]> {
return apiRequest<Employee[]>("/api/v1/platform/employees");
export async function listPlatformEmployees(
input: CursorListParams = {},
): Promise<CursorPage<Employee>> {
const query = buildCursorQuery(input);
const { data, meta } = await apiRequestWithMeta<Employee[]>(
`/api/v1/platform/employees?${query}`,
);
return { items: data, meta: parseCursorPageMeta(meta) };
}
export async function createPlatformEmployee(
@@ -1302,8 +1362,14 @@ export async function deleteEmployee(
// Workspace (Project) Management APIs - 对应 API.md 第七部分系统管理接口
// ----------------------------------------------------------------------------
export async function listWorkspaces(): Promise<Workspace[]> {
return apiRequest<Workspace[]>("/api/v1/platform/workspaces");
export async function listWorkspaces(
input: CursorListParams = {},
): Promise<CursorPage<Workspace>> {
const query = buildCursorQuery(input);
const { data, meta } = await apiRequestWithMeta<Workspace[]>(
`/api/v1/platform/workspaces?${query}`,
);
return { items: data, meta: parseCursorPageMeta(meta) };
}
export async function createWorkspace(
@@ -1670,7 +1736,9 @@ export type WorkspaceBoundApi = {
artifact_preserved: boolean;
}>;
listEmployees: () => Promise<Employee[]>;
listPlatformEmployees: () => Promise<Employee[]>;
listPlatformEmployees: (
input?: CursorListParams,
) => Promise<CursorPage<Employee>>;
createEmployee: (
input: Parameters<typeof createEmployee>[1],
) => Promise<Employee>;
@@ -1757,7 +1825,9 @@ export type WorkspaceBoundApi = {
nodeRunId: string,
) => Promise<ScheduleNodeRunArtifacts>;
// Workspace (Project) Management - 系统管理接口
listWorkspaces: () => Promise<Workspace[]>;
listWorkspaces: (
input?: CursorListParams,
) => Promise<CursorPage<Workspace>>;
createWorkspace: (input: WorkspaceCreatePayload) => Promise<Workspace>;
updateWorkspace: (
workspaceId: string,