import { Knex } from 'knex'; export type WorkflowDefinitionVersionRecord = { version_id: string; workflow_id: string; // uuid Citus distribution column (backfilled from the parent definition). tenant?: string | null; version: number; definition_json: Record; payload_schema_json?: Record | null; validation_status?: string | null; validation_errors?: Record[] | null; validation_warnings?: Record[] | null; validated_at?: string | null; published_by?: string | null; published_at?: string | null; created_at: string; updated_at: string; }; const serializeJsonArrayForPgJsonColumn = (value: unknown): unknown => { // node-postgres treats JS arrays as Postgres arrays, not JSON, which breaks inserts into `json/jsonb` columns. // Serialize explicitly so Postgres receives valid JSON text (e.g. `[{"...": "..."}]`). return Array.isArray(value) ? JSON.stringify(value) : value; }; const normalizeWorkflowDefinitionVersionWrite = ( data: Partial ): Partial => { const out: Partial = { ...data }; if ('validation_errors' in out) { out.validation_errors = serializeJsonArrayForPgJsonColumn(out.validation_errors) as any; } if ('validation_warnings' in out) { out.validation_warnings = serializeJsonArrayForPgJsonColumn(out.validation_warnings) as any; } return out; }; const WorkflowDefinitionVersionModelV2 = { create: async (knex: Knex, data: Partial): Promise => { const normalized = normalizeWorkflowDefinitionVersionWrite(data); const [record] = await knex('workflow_definition_versions') .insert({ ...normalized, created_at: new Date().toISOString(), updated_at: new Date().toISOString() }) .returning('*'); return record; }, update: async ( knex: Knex, workflowId: string, version: number, data: Partial ): Promise => { const normalized = normalizeWorkflowDefinitionVersionWrite(data); const [record] = await knex('workflow_definition_versions') .where({ workflow_id: workflowId, version }) .update({ ...normalized, updated_at: new Date().toISOString() }) .returning('*'); return record; }, getByWorkflowAndVersion: async (knex: Knex, workflowId: string, version: number): Promise => { const record = await knex('workflow_definition_versions') .where({ workflow_id: workflowId, version }) .first(); return record || null; }, listByWorkflow: async (knex: Knex, workflowId: string): Promise => { return knex('workflow_definition_versions') .where({ workflow_id: workflowId }) .orderBy('version', 'desc'); } }; export default WorkflowDefinitionVersionModelV2;