1import * as Effect from "effect/Effect";
2import * as SqlClient from "effect/sql/SqlClient";
3
4// Schema setup composed by migration 055.
5export default Effect.gen(function* () {
6 const sql = yield* SqlClient.SqlClient;
7
8 yield* sql`
9 CREATE TABLE orchestration_v2_effect_outbox_next (
10 effect_id TEXT PRIMARY KEY,
11 command_id TEXT NOT NULL,
12 thread_id TEXT NOT NULL,
13 effect_type TEXT NOT NULL,
14 payload_json TEXT NOT NULL,
15 status TEXT NOT NULL CHECK (
16 status IN ('pending', 'running', 'succeeded', 'failed', 'cancelled')
17 ),
18 attempt_count INTEGER NOT NULL DEFAULT 0,
19 available_at TEXT NOT NULL,
20 lease_owner TEXT,
21 lease_expires_at TEXT,
22 created_at TEXT NOT NULL,
23 updated_at TEXT NOT NULL,
24 completed_at TEXT,
25 last_error TEXT
26 )
27 `;
28 yield* sql`
29 INSERT INTO orchestration_v2_effect_outbox_next (
30 effect_id,
31 command_id,
32 thread_id,
33 effect_type,
34 payload_json,
35 status,
36 attempt_count,
37 available_at,
38 lease_owner,
39 lease_expires_at,
40 created_at,
41 updated_at,
42 completed_at,
43 last_error
44 )
45 SELECT
46 effect_id,
47 command_id,
48 thread_id,
49 effect_type,
50 payload_json,
51 status,
52 attempt_count,
53 available_at,
54 lease_owner,
55 lease_expires_at,
56 created_at,
57 updated_at,
58 completed_at,
59 last_error
60 FROM orchestration_v2_effect_outbox
61 `;
62 yield* sql`DROP TABLE orchestration_v2_effect_outbox`;
63 yield* sql`
64 ALTER TABLE orchestration_v2_effect_outbox_next
65 RENAME TO orchestration_v2_effect_outbox
66 `;
67 yield* sql`
68 CREATE INDEX orchestration_v2_effect_outbox_claim_idx
69 ON orchestration_v2_effect_outbox(status, available_at, lease_expires_at, created_at)
70 `;
71 yield* sql`
72 CREATE INDEX orchestration_v2_effect_outbox_command_idx
73 ON orchestration_v2_effect_outbox(command_id, effect_id)
74 `;
75 yield* sql`
76 CREATE INDEX orchestration_v2_effect_outbox_thread_status_idx
77 ON orchestration_v2_effect_outbox(thread_id, status, effect_type)
78 `;
79});