1import * as Effect from "effect/Effect";
2import * as SqlClient from "effect/sql/SqlClient";
3
4export default Effect.gen(function* () {
5 const sql = yield* SqlClient.SqlClient;
6
7 const pairingLinkColumns = yield* sql<{ readonly name: string }>`
8 PRAGMA table_info(auth_pairing_links)
9 `;
10 if (!pairingLinkColumns.some((column) => column.name === "label")) {
11 yield* sql`
12 ALTER TABLE auth_pairing_links
13 ADD COLUMN label TEXT
14 `;
15 }
16
17 const sessionColumns = yield* sql<{ readonly name: string }>`
18 PRAGMA table_info(auth_sessions)
19 `;
20
21 if (!sessionColumns.some((column) => column.name === "client_label")) {
22 yield* sql`
23 ALTER TABLE auth_sessions
24 ADD COLUMN client_label TEXT
25 `;
26 }
27
28 if (!sessionColumns.some((column) => column.name === "client_ip_address")) {
29 yield* sql`
30 ALTER TABLE auth_sessions
31 ADD COLUMN client_ip_address TEXT
32 `;
33 }
34
35 if (!sessionColumns.some((column) => column.name === "client_user_agent")) {
36 yield* sql`
37 ALTER TABLE auth_sessions
38 ADD COLUMN client_user_agent TEXT
39 `;
40 }
41
42 if (!sessionColumns.some((column) => column.name === "client_device_type")) {
43 yield* sql`
44 ALTER TABLE auth_sessions
45 ADD COLUMN client_device_type TEXT NOT NULL DEFAULT 'unknown'
46 `;
47 }
48
49 if (!sessionColumns.some((column) => column.name === "client_os")) {
50 yield* sql`
51 ALTER TABLE auth_sessions
52 ADD COLUMN client_os TEXT
53 `;
54 }
55
56 if (!sessionColumns.some((column) => column.name === "client_browser")) {
57 yield* sql`
58 ALTER TABLE auth_sessions
59 ADD COLUMN client_browser TEXT
60 `;
61 }
62});