Skip to content

Commit 320e76d

Browse files
committed
Lazy db
1 parent a31d6a0 commit 320e76d

1 file changed

Lines changed: 55 additions & 47 deletions

File tree

playground/react/src/server/test-tools/oidc-db.ts

Lines changed: 55 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -3,39 +3,47 @@ import path from 'node:path';
33
import { DatabaseSync } from 'node:sqlite';
44
import type { MockOidcBehavior, MockOidcUser } from '../../tools/types';
55

6-
const dbDir = path.join(process.cwd(), '.data');
7-
mkdirSync(dbDir, { recursive: true });
8-
const dbPath = path.join(dbDir, 'tooling.sqlite');
9-
10-
const db = new DatabaseSync(dbPath);
11-
12-
db.exec(`
13-
CREATE TABLE IF NOT EXISTS mock_oidc_users (
14-
id TEXT PRIMARY KEY,
15-
dev_session_id TEXT NOT NULL,
16-
email TEXT NOT NULL,
17-
behavior TEXT NOT NULL DEFAULT 'success',
18-
created_at INTEGER NOT NULL
19-
);
20-
`);
21-
22-
db.exec(`
23-
CREATE TABLE IF NOT EXISTS mock_oidc_auth_codes (
24-
code TEXT PRIMARY KEY,
25-
user_id TEXT NOT NULL,
26-
dev_session_id TEXT NOT NULL,
27-
created_at INTEGER NOT NULL
28-
);
29-
`);
30-
31-
db.exec(`
32-
CREATE TABLE IF NOT EXISTS session_users (
33-
dev_session_id TEXT NOT NULL,
34-
user_id TEXT NOT NULL,
35-
created_at INTEGER NOT NULL,
36-
PRIMARY KEY (dev_session_id, user_id)
37-
);
38-
`);
6+
let _db: DatabaseSync | null = null;
7+
8+
function getDb(): DatabaseSync {
9+
if (_db) return _db;
10+
11+
const dbDir = path.join(process.cwd(), '.data');
12+
mkdirSync(dbDir, { recursive: true });
13+
const dbPath = path.join(dbDir, 'tooling.sqlite');
14+
15+
_db = new DatabaseSync(dbPath);
16+
17+
_db.exec(`
18+
CREATE TABLE IF NOT EXISTS mock_oidc_users (
19+
id TEXT PRIMARY KEY,
20+
dev_session_id TEXT NOT NULL,
21+
email TEXT NOT NULL,
22+
behavior TEXT NOT NULL DEFAULT 'success',
23+
created_at INTEGER NOT NULL
24+
);
25+
`);
26+
27+
_db.exec(`
28+
CREATE TABLE IF NOT EXISTS mock_oidc_auth_codes (
29+
code TEXT PRIMARY KEY,
30+
user_id TEXT NOT NULL,
31+
dev_session_id TEXT NOT NULL,
32+
created_at INTEGER NOT NULL
33+
);
34+
`);
35+
36+
_db.exec(`
37+
CREATE TABLE IF NOT EXISTS session_users (
38+
dev_session_id TEXT NOT NULL,
39+
user_id TEXT NOT NULL,
40+
created_at INTEGER NOT NULL,
41+
PRIMARY KEY (dev_session_id, user_id)
42+
);
43+
`);
44+
45+
return _db;
46+
}
3947

4048
function toUser(row: Record<string, unknown>): MockOidcUser {
4149
return {
@@ -48,7 +56,7 @@ function toUser(row: Record<string, unknown>): MockOidcUser {
4856

4957
export const OidcDb = {
5058
listUsers(devSessionId: string): MockOidcUser[] {
51-
const stmt = db.prepare(
59+
const stmt = getDb().prepare(
5260
`SELECT id, dev_session_id, email, behavior
5361
FROM mock_oidc_users
5462
WHERE dev_session_id = ?
@@ -58,27 +66,27 @@ export const OidcDb = {
5866
},
5967

6068
setSingleUser(devSessionId: string, email: string): MockOidcUser {
61-
db.prepare(`DELETE FROM mock_oidc_users WHERE dev_session_id = ?`).run(devSessionId);
69+
getDb().prepare(`DELETE FROM mock_oidc_users WHERE dev_session_id = ?`).run(devSessionId);
6270
const user: MockOidcUser = {
6371
id: crypto.randomUUID(),
6472
devSessionId,
6573
email,
6674
behavior: 'success',
6775
};
68-
db.prepare(
76+
getDb().prepare(
6977
`INSERT INTO mock_oidc_users (id, dev_session_id, email, behavior, created_at)
7078
VALUES (?, ?, ?, ?, ?)`,
7179
).run(user.id, devSessionId, email, user.behavior, Date.now());
7280
return user;
7381
},
7482

7583
updateBehavior(id: string, behavior: MockOidcBehavior): MockOidcUser | null {
76-
db.prepare(`UPDATE mock_oidc_users SET behavior = ? WHERE id = ?`).run(behavior, id);
84+
getDb().prepare(`UPDATE mock_oidc_users SET behavior = ? WHERE id = ?`).run(behavior, id);
7785
return this.getUserById(id);
7886
},
7987

8088
getUserById(id: string): MockOidcUser | null {
81-
const row = db
89+
const row = getDb()
8290
.prepare(
8391
`SELECT id, dev_session_id, email, behavior
8492
FROM mock_oidc_users
@@ -90,19 +98,19 @@ export const OidcDb = {
9098
},
9199

92100
clearUsers(devSessionId: string) {
93-
db.prepare(`DELETE FROM mock_oidc_users WHERE dev_session_id = ?`).run(devSessionId);
94-
db.prepare(`DELETE FROM mock_oidc_auth_codes WHERE dev_session_id = ?`).run(devSessionId);
101+
getDb().prepare(`DELETE FROM mock_oidc_users WHERE dev_session_id = ?`).run(devSessionId);
102+
getDb().prepare(`DELETE FROM mock_oidc_auth_codes WHERE dev_session_id = ?`).run(devSessionId);
95103
},
96104

97105
storeAuthCode(code: string, userId: string, devSessionId: string) {
98-
db.prepare(
106+
getDb().prepare(
99107
`INSERT INTO mock_oidc_auth_codes (code, user_id, dev_session_id, created_at)
100108
VALUES (?, ?, ?, ?)`,
101109
).run(code, userId, devSessionId, Date.now());
102110
},
103111

104112
getAuthCode(code: string): { code: string; userId: string; sessionId: string } | null {
105-
const row = db
113+
const row = getDb()
106114
.prepare(
107115
`SELECT code, user_id, dev_session_id
108116
FROM mock_oidc_auth_codes
@@ -121,18 +129,18 @@ export const OidcDb = {
121129
},
122130

123131
deleteAuthCode(code: string) {
124-
db.prepare(`DELETE FROM mock_oidc_auth_codes WHERE code = ?`).run(code);
132+
getDb().prepare(`DELETE FROM mock_oidc_auth_codes WHERE code = ?`).run(code);
125133
},
126134

127135
addSessionUser(devSessionId: string, userId: string) {
128-
db.prepare(
136+
getDb().prepare(
129137
`INSERT OR IGNORE INTO session_users (dev_session_id, user_id, created_at)
130138
VALUES (?, ?, ?)`,
131139
).run(devSessionId, userId, Date.now());
132140
},
133141

134142
listSessionUsers(devSessionId: string): string[] {
135-
const rows = db
143+
const rows = getDb()
136144
.prepare(
137145
`SELECT user_id
138146
FROM session_users
@@ -144,10 +152,10 @@ export const OidcDb = {
144152
},
145153

146154
removeSessionUser(devSessionId: string, userId: string) {
147-
db.prepare(`DELETE FROM session_users WHERE dev_session_id = ? AND user_id = ?`).run(devSessionId, userId);
155+
getDb().prepare(`DELETE FROM session_users WHERE dev_session_id = ? AND user_id = ?`).run(devSessionId, userId);
148156
},
149157

150158
clearSessionUsers(devSessionId: string) {
151-
db.prepare(`DELETE FROM session_users WHERE dev_session_id = ?`).run(devSessionId);
159+
getDb().prepare(`DELETE FROM session_users WHERE dev_session_id = ?`).run(devSessionId);
152160
},
153161
};

0 commit comments

Comments
 (0)