Initialize governed Dataflow module

This commit is contained in:
2026-07-28 01:28:17 +02:00
commit 223c008ff3
44 changed files with 6204 additions and 0 deletions
+187
View File
@@ -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)
});
}