( data: DeleteWorkflowGroupData, requestId: string )
| 903 | * group's `executions[groupId]` entry from every row. |
| 904 | */ |
| 905 | export async function deleteWorkflowGroup( |
| 906 | data: DeleteWorkflowGroupData, |
| 907 | requestId: string |
| 908 | ): Promise<TableDefinition> { |
| 909 | return withLockedTable(data.tableId, async (table, trx) => { |
| 910 | const schema = table.schema |
| 911 | const groups = schema.workflowGroups ?? [] |
| 912 | const group = groups.find((g) => g.id === data.groupId) |
| 913 | if (!group) { |
| 914 | throw new Error(`Workflow group "${data.groupId}" not found`) |
| 915 | } |
| 916 | |
| 917 | const removedColumnIds = new Set(group.outputs.map((o) => o.columnName)) |
| 918 | // Removed group's output columns may be referenced as deps by sibling groups. |
| 919 | // Strip those refs so we don't leave dangling-column deps behind. |
| 920 | const nextGroups = groups |
| 921 | .filter((g) => g.id !== data.groupId) |
| 922 | .map((g) => stripGroupDeps(g, removedColumnIds)) |
| 923 | const updatedSchema: TableSchema = { |
| 924 | ...schema, |
| 925 | columns: schema.columns.filter((c) => !removedColumnIds.has(getColumnId(c))), |
| 926 | workflowGroups: nextGroups, |
| 927 | } |
| 928 | const updatedColumnOrder = table.metadata?.columnOrder?.filter( |
| 929 | (id) => !removedColumnIds.has(id) |
| 930 | ) |
| 931 | assertValidSchema(updatedSchema, updatedColumnOrder) |
| 932 | |
| 933 | const updatedMetadata: TableMetadata | null = |
| 934 | updatedColumnOrder && table.metadata |
| 935 | ? { ...table.metadata, columnOrder: updatedColumnOrder } |
| 936 | : table.metadata |
| 937 | ? { ...table.metadata } |
| 938 | : null |
| 939 | |
| 940 | const now = new Date() |
| 941 | await setTableTxTimeouts(trx, { statementMs: 60_000 }) |
| 942 | await trx |
| 943 | .update(userTableDefinitions) |
| 944 | .set({ schema: updatedSchema, metadata: updatedMetadata, updatedAt: now }) |
| 945 | .where(eq(userTableDefinitions.id, data.tableId)) |
| 946 | for (const id of removedColumnIds) { |
| 947 | await trx.execute( |
| 948 | sql`UPDATE user_table_rows SET data = data - ${id}::text WHERE table_id = ${data.tableId} AND data ? ${id}::text` |
| 949 | ) |
| 950 | } |
| 951 | await stripGroupExecutions(trx, data.tableId, [data.groupId]) |
| 952 | |
| 953 | logger.info( |
| 954 | `[${requestId}] Deleted workflow group "${data.groupId}" from table ${data.tableId}` |
| 955 | ) |
| 956 | |
| 957 | return { |
| 958 | ...table, |
| 959 | schema: updatedSchema, |
| 960 | metadata: updatedMetadata, |
| 961 | updatedAt: now, |
| 962 | } |
no test coverage detected