Initialize governed Dataflow module
This commit is contained in:
@@ -0,0 +1,187 @@
|
||||
import { apiFetch, type ApiSettings } from "@govoplan/core-webui";
|
||||
|
||||
export type PipelineStatus = "draft" | "active" | "archived";
|
||||
export type EditorMode = "graph" | "sql";
|
||||
|
||||
export type GraphPosition = { x: number; y: number };
|
||||
export type PipelineGraphNode = {
|
||||
id: string;
|
||||
type: string;
|
||||
label: string;
|
||||
position: GraphPosition;
|
||||
config: Record<string, unknown>;
|
||||
};
|
||||
export type PipelineGraphEdge = {
|
||||
id: string;
|
||||
source: string;
|
||||
target: string;
|
||||
source_port?: string;
|
||||
target_port?: string;
|
||||
};
|
||||
export type PipelineGraph = {
|
||||
schema_version: 1;
|
||||
nodes: PipelineGraphNode[];
|
||||
edges: PipelineGraphEdge[];
|
||||
};
|
||||
|
||||
export type DataflowDiagnostic = {
|
||||
severity: "info" | "warning" | "error";
|
||||
code: string;
|
||||
message: string;
|
||||
node_id?: string | null;
|
||||
field?: string | null;
|
||||
};
|
||||
|
||||
export type PipelineRevision = {
|
||||
id: string;
|
||||
revision: number;
|
||||
schema_version: number;
|
||||
graph: PipelineGraph;
|
||||
sql_text?: string | null;
|
||||
editor_mode: EditorMode;
|
||||
content_hash: string;
|
||||
created_by?: string | null;
|
||||
created_at: string;
|
||||
};
|
||||
|
||||
export type Pipeline = {
|
||||
id: string;
|
||||
tenant_id: string;
|
||||
name: string;
|
||||
description?: string | null;
|
||||
status: PipelineStatus;
|
||||
current_revision: number;
|
||||
created_by?: string | null;
|
||||
updated_by?: string | null;
|
||||
created_at: string;
|
||||
updated_at: string;
|
||||
revision: PipelineRevision;
|
||||
};
|
||||
|
||||
export type PipelinePayload = {
|
||||
name: string;
|
||||
description?: string | null;
|
||||
status: PipelineStatus;
|
||||
graph: PipelineGraph;
|
||||
sql_text?: string | null;
|
||||
editor_mode: EditorMode;
|
||||
};
|
||||
|
||||
export type PipelineValidation = {
|
||||
valid: boolean;
|
||||
graph?: PipelineGraph | null;
|
||||
sql_text?: string | null;
|
||||
diagnostics: DataflowDiagnostic[];
|
||||
};
|
||||
|
||||
export type PreviewColumn = {
|
||||
name: string;
|
||||
type: string;
|
||||
nullable: boolean;
|
||||
};
|
||||
|
||||
export type NodePreviewDiagnostic = {
|
||||
node_id: string;
|
||||
status: "succeeded" | "failed" | "skipped";
|
||||
input_rows: number;
|
||||
output_rows: number;
|
||||
duration_ms: number;
|
||||
columns: PreviewColumn[];
|
||||
messages: string[];
|
||||
};
|
||||
|
||||
export type PipelinePreview = {
|
||||
run_id?: string | null;
|
||||
pipeline_id?: string | null;
|
||||
revision?: number | null;
|
||||
status: "succeeded" | "failed";
|
||||
columns: PreviewColumn[];
|
||||
rows: Record<string, unknown>[];
|
||||
total_rows: number;
|
||||
truncated: boolean;
|
||||
diagnostics: DataflowDiagnostic[];
|
||||
node_diagnostics: NodePreviewDiagnostic[];
|
||||
definition_hash: string;
|
||||
executor_version: string;
|
||||
};
|
||||
|
||||
export async function listDataflowPipelines(settings: ApiSettings): Promise<Pipeline[]> {
|
||||
const response = await apiFetch<{ pipelines: Pipeline[] }>(settings, "/api/v1/dataflow/pipelines");
|
||||
return response.pipelines;
|
||||
}
|
||||
|
||||
export function createDataflowPipeline(
|
||||
settings: ApiSettings,
|
||||
payload: PipelinePayload
|
||||
): Promise<Pipeline> {
|
||||
return apiFetch<Pipeline>(settings, "/api/v1/dataflow/pipelines", {
|
||||
method: "POST",
|
||||
body: JSON.stringify(payload)
|
||||
});
|
||||
}
|
||||
|
||||
export function updateDataflowPipeline(
|
||||
settings: ApiSettings,
|
||||
pipelineId: string,
|
||||
payload: PipelinePayload & { expected_revision: number }
|
||||
): Promise<Pipeline> {
|
||||
return apiFetch<Pipeline>(settings, `/api/v1/dataflow/pipelines/${encodeURIComponent(pipelineId)}`, {
|
||||
method: "PUT",
|
||||
body: JSON.stringify(payload)
|
||||
});
|
||||
}
|
||||
|
||||
export function deleteDataflowPipeline(settings: ApiSettings, pipelineId: string): Promise<{ deleted: boolean }> {
|
||||
return apiFetch<{ deleted: boolean }>(
|
||||
settings,
|
||||
`/api/v1/dataflow/pipelines/${encodeURIComponent(pipelineId)}`,
|
||||
{ method: "DELETE" }
|
||||
);
|
||||
}
|
||||
|
||||
export function validateDataflowPipeline(
|
||||
settings: ApiSettings,
|
||||
payload: { graph?: PipelineGraph; sql_text?: string; source_nodes?: PipelineGraphNode[] }
|
||||
): Promise<PipelineValidation> {
|
||||
return apiFetch<PipelineValidation>(settings, "/api/v1/dataflow/validate", {
|
||||
method: "POST",
|
||||
body: JSON.stringify(payload)
|
||||
});
|
||||
}
|
||||
|
||||
export function compileDataflowSql(
|
||||
settings: ApiSettings,
|
||||
payload: { graph?: PipelineGraph; sql_text: string; source_nodes?: PipelineGraphNode[] }
|
||||
): Promise<PipelineValidation> {
|
||||
return apiFetch<PipelineValidation>(settings, "/api/v1/dataflow/sql/compile", {
|
||||
method: "POST",
|
||||
body: JSON.stringify(payload)
|
||||
});
|
||||
}
|
||||
|
||||
export function renderDataflowSql(
|
||||
settings: ApiSettings,
|
||||
graph: PipelineGraph
|
||||
): Promise<PipelineValidation> {
|
||||
return apiFetch<PipelineValidation>(settings, "/api/v1/dataflow/sql/render", {
|
||||
method: "POST",
|
||||
body: JSON.stringify({ graph })
|
||||
});
|
||||
}
|
||||
|
||||
export function previewDataflowPipeline(
|
||||
settings: ApiSettings,
|
||||
payload: {
|
||||
pipeline_id?: string;
|
||||
revision?: number;
|
||||
graph?: PipelineGraph;
|
||||
sql_text?: string;
|
||||
source_nodes?: PipelineGraphNode[];
|
||||
row_limit?: number;
|
||||
}
|
||||
): Promise<PipelinePreview> {
|
||||
return apiFetch<PipelinePreview>(settings, "/api/v1/dataflow/preview", {
|
||||
method: "POST",
|
||||
body: JSON.stringify(payload)
|
||||
});
|
||||
}
|
||||
Reference in New Issue
Block a user