@cat-factory/node-server 0.95.1 → 0.96.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/container.d.ts.map +1 -1
- package/dist/container.js +16 -5
- package/dist/container.js.map +1 -1
- package/dist/repositories/drizzle/_shared.d.ts +2 -0
- package/dist/repositories/drizzle/_shared.d.ts.map +1 -0
- package/dist/repositories/drizzle/_shared.js +11 -0
- package/dist/repositories/drizzle/_shared.js.map +1 -0
- package/dist/repositories/drizzle/accounts.d.ts +62 -0
- package/dist/repositories/drizzle/accounts.d.ts.map +1 -0
- package/dist/repositories/drizzle/accounts.js +438 -0
- package/dist/repositories/drizzle/accounts.js.map +1 -0
- package/dist/repositories/drizzle/board.d.ts +74 -0
- package/dist/repositories/drizzle/board.d.ts.map +1 -0
- package/dist/repositories/drizzle/board.js +489 -0
- package/dist/repositories/drizzle/board.js.map +1 -0
- package/dist/repositories/drizzle/connections.d.ts +84 -0
- package/dist/repositories/drizzle/connections.d.ts.map +1 -0
- package/dist/repositories/drizzle/connections.js +391 -0
- package/dist/repositories/drizzle/connections.js.map +1 -0
- package/dist/repositories/drizzle/execution.d.ts +58 -0
- package/dist/repositories/drizzle/execution.d.ts.map +1 -0
- package/dist/repositories/drizzle/execution.js +585 -0
- package/dist/repositories/drizzle/execution.js.map +1 -0
- package/dist/repositories/drizzle/initiatives.d.ts +54 -0
- package/dist/repositories/drizzle/initiatives.d.ts.map +1 -0
- package/dist/repositories/drizzle/initiatives.js +343 -0
- package/dist/repositories/drizzle/initiatives.js.map +1 -0
- package/dist/repositories/drizzle/kaizen.d.ts +34 -0
- package/dist/repositories/drizzle/kaizen.d.ts.map +1 -0
- package/dist/repositories/drizzle/kaizen.js +192 -0
- package/dist/repositories/drizzle/kaizen.js.map +1 -0
- package/dist/repositories/drizzle/reviews.d.ts +75 -0
- package/dist/repositories/drizzle/reviews.d.ts.map +1 -0
- package/dist/repositories/drizzle/reviews.js +449 -0
- package/dist/repositories/drizzle/reviews.js.map +1 -0
- package/dist/repositories/drizzle/sandbox.d.ts +61 -0
- package/dist/repositories/drizzle/sandbox.d.ts.map +1 -0
- package/dist/repositories/drizzle/sandbox.js +370 -0
- package/dist/repositories/drizzle/sandbox.js.map +1 -0
- package/dist/repositories/drizzle/settings.d.ts +76 -0
- package/dist/repositories/drizzle/settings.d.ts.map +1 -0
- package/dist/repositories/drizzle/settings.js +377 -0
- package/dist/repositories/drizzle/settings.js.map +1 -0
- package/dist/repositories/drizzle/telemetry.d.ts +60 -0
- package/dist/repositories/drizzle/telemetry.d.ts.map +1 -0
- package/dist/repositories/drizzle/telemetry.js +559 -0
- package/dist/repositories/drizzle/telemetry.js.map +1 -0
- package/dist/repositories/drizzle.d.ts +6 -113
- package/dist/repositories/drizzle.d.ts.map +1 -1
- package/dist/repositories/drizzle.js +20 -4118
- package/dist/repositories/drizzle.js.map +1 -1
- package/package.json +20 -20
|
@@ -0,0 +1,489 @@
|
|
|
1
|
+
// Drizzle/Postgres implementations of the core kernel repository ports, split by
|
|
2
|
+
// domain (mirrors the Cloudflare D1 per-repository layout). The row<->domain mapping
|
|
3
|
+
// is the SAME shared mapping the D1 repos use (@cat-factory/server), so behaviour
|
|
4
|
+
// matches across stores; this layer only owns the Drizzle queries. Assembled into the
|
|
5
|
+
// CoreRepositories set by ./drizzle.ts (the barrel).
|
|
6
|
+
import { WORKSPACE_SCOPED_TABLES } from '@cat-factory/kernel';
|
|
7
|
+
import { blockInsertValues, blockPatchToColumns, rowToBlock, rowToWorkspace, tryDecodeRows, } from '@cat-factory/server';
|
|
8
|
+
import { and, count, desc, eq, inArray, isNull, or, sql } from 'drizzle-orm';
|
|
9
|
+
import { agentRuns, blocks, services, workspaceFragmentDefaults, workspaceServices, workspaces, } from '../../db/schema.js';
|
|
10
|
+
export class DrizzleWorkspaceRepository {
|
|
11
|
+
db;
|
|
12
|
+
constructor(db) {
|
|
13
|
+
this.db = db;
|
|
14
|
+
}
|
|
15
|
+
async listVisible(scope) {
|
|
16
|
+
if (scope === null) {
|
|
17
|
+
const rows = await this.db.select().from(workspaces).orderBy(desc(workspaces.created_at));
|
|
18
|
+
return rows.map(rowToWorkspace);
|
|
19
|
+
}
|
|
20
|
+
const legacy = and(isNull(workspaces.account_id), eq(workspaces.owner_user_id, scope.ownerUserId));
|
|
21
|
+
const where = scope.accountIds.length > 0
|
|
22
|
+
? or(inArray(workspaces.account_id, scope.accountIds), legacy)
|
|
23
|
+
: legacy;
|
|
24
|
+
const rows = await this.db
|
|
25
|
+
.select()
|
|
26
|
+
.from(workspaces)
|
|
27
|
+
.where(where)
|
|
28
|
+
.orderBy(desc(workspaces.created_at));
|
|
29
|
+
return rows.map(rowToWorkspace);
|
|
30
|
+
}
|
|
31
|
+
async get(id) {
|
|
32
|
+
const [row] = await this.db.select().from(workspaces).where(eq(workspaces.id, id));
|
|
33
|
+
return row ? rowToWorkspace(row) : null;
|
|
34
|
+
}
|
|
35
|
+
async ownerOf(id) {
|
|
36
|
+
const [row] = await this.db
|
|
37
|
+
.select({ owner: workspaces.owner_user_id })
|
|
38
|
+
.from(workspaces)
|
|
39
|
+
.where(eq(workspaces.id, id));
|
|
40
|
+
return row ? row.owner : undefined;
|
|
41
|
+
}
|
|
42
|
+
async accountOf(id) {
|
|
43
|
+
const [row] = await this.db
|
|
44
|
+
.select({ account: workspaces.account_id })
|
|
45
|
+
.from(workspaces)
|
|
46
|
+
.where(eq(workspaces.id, id));
|
|
47
|
+
return row ? row.account : undefined;
|
|
48
|
+
}
|
|
49
|
+
async create(workspace, ownerUserId, accountId) {
|
|
50
|
+
await this.db.insert(workspaces).values({
|
|
51
|
+
id: workspace.id,
|
|
52
|
+
name: workspace.name,
|
|
53
|
+
description: workspace.description,
|
|
54
|
+
created_at: workspace.createdAt,
|
|
55
|
+
owner_user_id: ownerUserId,
|
|
56
|
+
account_id: accountId,
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
async rename(id, name) {
|
|
60
|
+
await this.db.update(workspaces).set({ name }).where(eq(workspaces.id, id));
|
|
61
|
+
}
|
|
62
|
+
async setDescription(id, description) {
|
|
63
|
+
await this.db.update(workspaces).set({ description }).where(eq(workspaces.id, id));
|
|
64
|
+
}
|
|
65
|
+
async delete(id, rehome = []) {
|
|
66
|
+
await this.db.transaction(async (tx) => {
|
|
67
|
+
// Re-home shared services FIRST: move each service's blocks + run history to a surviving
|
|
68
|
+
// mounting board by re-stamping their `workspace_id`. Blocks are keyed by `service_id`, so
|
|
69
|
+
// after the move the service's frame no longer lives in THIS workspace — the reclaim below
|
|
70
|
+
// then skips it, leaving the service, its subtree and every OTHER board's mount intact. A
|
|
71
|
+
// shared service therefore outlives its home board's deletion. Mirror any change in the
|
|
72
|
+
// Cloudflare facade's D1WorkspaceRepository.delete.
|
|
73
|
+
for (const { serviceId, toWorkspaceId } of rehome) {
|
|
74
|
+
await tx
|
|
75
|
+
.update(agentRuns)
|
|
76
|
+
.set({ workspace_id: toWorkspaceId })
|
|
77
|
+
.where(inArray(agentRuns.block_id, tx.select({ id: blocks.id }).from(blocks).where(eq(blocks.service_id, serviceId))));
|
|
78
|
+
await tx
|
|
79
|
+
.update(blocks)
|
|
80
|
+
.set({ workspace_id: toWorkspaceId })
|
|
81
|
+
.where(eq(blocks.service_id, serviceId));
|
|
82
|
+
}
|
|
83
|
+
// Reclaim the account-owned services this workspace HOMES (+ every board's mount of them)
|
|
84
|
+
// BEFORE the blocks they reference are dropped. A deleted board that leaves its services
|
|
85
|
+
// behind is not a cosmetic leak: `services` is account-scoped and looked up by
|
|
86
|
+
// (installation_id, repo_github_id), so a dangling service (its frame block gone) keeps the
|
|
87
|
+
// SAME repo from being re-added on any other board in the account. Mirror any change in the
|
|
88
|
+
// Cloudflare facade's D1WorkspaceRepository.delete.
|
|
89
|
+
const homed = await tx
|
|
90
|
+
.select({ id: services.id })
|
|
91
|
+
.from(services)
|
|
92
|
+
.innerJoin(blocks, eq(services.frame_block_id, blocks.id))
|
|
93
|
+
.where(eq(blocks.workspace_id, id));
|
|
94
|
+
const serviceIds = homed.map((r) => r.id);
|
|
95
|
+
if (serviceIds.length) {
|
|
96
|
+
await tx.delete(workspaceServices).where(inArray(workspaceServices.service_id, serviceIds));
|
|
97
|
+
await tx.delete(services).where(inArray(services.id, serviceIds));
|
|
98
|
+
}
|
|
99
|
+
// This workspace's OWN mounts of services homed elsewhere (shared services it mounted).
|
|
100
|
+
await tx.delete(workspaceServices).where(eq(workspaceServices.workspace_id, id));
|
|
101
|
+
// Bulk reclaim of every plain workspace-scoped table (incl. blocks/agent_runs/pipelines/
|
|
102
|
+
// environments) from the shared kernel list — keeps this cascade in lockstep with the
|
|
103
|
+
// Cloudflare facade and stops a new workspace-scoped table silently orphaning. The schema
|
|
104
|
+
// declares no FKs between these tables, so order is free; they only need to run AFTER the
|
|
105
|
+
// `services` reclaim above (which reads `blocks`) and BEFORE the root `workspaces` row.
|
|
106
|
+
for (const table of WORKSPACE_SCOPED_TABLES) {
|
|
107
|
+
await tx.execute(sql `DELETE FROM ${sql.identifier(table)} WHERE workspace_id = ${id}`);
|
|
108
|
+
}
|
|
109
|
+
await tx.delete(workspaces).where(eq(workspaces.id, id));
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
export class DrizzleBlockRepository {
|
|
114
|
+
db;
|
|
115
|
+
constructor(db) {
|
|
116
|
+
this.db = db;
|
|
117
|
+
}
|
|
118
|
+
// List reads order by `seq` (insertion order) for parity with the Cloudflare facade's
|
|
119
|
+
// `ORDER BY rowid` — Postgres heap order is otherwise non-deterministic.
|
|
120
|
+
async listByWorkspace(workspaceId) {
|
|
121
|
+
const rows = await this.db
|
|
122
|
+
.select()
|
|
123
|
+
.from(blocks)
|
|
124
|
+
.where(eq(blocks.workspace_id, workspaceId))
|
|
125
|
+
.orderBy(blocks.seq);
|
|
126
|
+
// Snapshot-facing list read: drop a corrupt block rather than failing the whole board load.
|
|
127
|
+
return tryDecodeRows(rows, rowToBlock, (r) => ({ table: 'blocks', id: r.id }));
|
|
128
|
+
}
|
|
129
|
+
async listByService(serviceId) {
|
|
130
|
+
const rows = await this.db
|
|
131
|
+
.select()
|
|
132
|
+
.from(blocks)
|
|
133
|
+
.where(eq(blocks.service_id, serviceId))
|
|
134
|
+
.orderBy(blocks.seq);
|
|
135
|
+
return tryDecodeRows(rows, rowToBlock, (r) => ({ table: 'blocks', id: r.id }));
|
|
136
|
+
}
|
|
137
|
+
async listByServices(serviceIds) {
|
|
138
|
+
if (serviceIds.length === 0)
|
|
139
|
+
return [];
|
|
140
|
+
const out = [];
|
|
141
|
+
// Chunk the IN list to stay well under the bind-parameter limit. Ordering is
|
|
142
|
+
// per-chunk, matching the D1 twin's per-chunk `ORDER BY rowid`.
|
|
143
|
+
for (let i = 0; i < serviceIds.length; i += 500) {
|
|
144
|
+
const rows = await this.db
|
|
145
|
+
.select()
|
|
146
|
+
.from(blocks)
|
|
147
|
+
.where(inArray(blocks.service_id, serviceIds.slice(i, i + 500)))
|
|
148
|
+
.orderBy(blocks.seq);
|
|
149
|
+
out.push(...tryDecodeRows(rows, rowToBlock, (r) => ({ table: 'blocks', id: r.id })));
|
|
150
|
+
}
|
|
151
|
+
return out;
|
|
152
|
+
}
|
|
153
|
+
async get(workspaceId, id) {
|
|
154
|
+
const [row] = await this.db
|
|
155
|
+
.select()
|
|
156
|
+
.from(blocks)
|
|
157
|
+
.where(and(eq(blocks.workspace_id, workspaceId), eq(blocks.id, id)));
|
|
158
|
+
return row ? rowToBlock(row) : null;
|
|
159
|
+
}
|
|
160
|
+
async findById(blockId) {
|
|
161
|
+
const [row] = await this.db.select().from(blocks).where(eq(blocks.id, blockId)).limit(1);
|
|
162
|
+
if (!row)
|
|
163
|
+
return null;
|
|
164
|
+
return {
|
|
165
|
+
workspaceId: row.workspace_id,
|
|
166
|
+
serviceId: row.service_id ?? null,
|
|
167
|
+
block: rowToBlock(row),
|
|
168
|
+
};
|
|
169
|
+
}
|
|
170
|
+
async findByIds(blockIds) {
|
|
171
|
+
if (blockIds.length === 0)
|
|
172
|
+
return [];
|
|
173
|
+
const out = [];
|
|
174
|
+
// Chunk the IN list to stay well under the bind-parameter limit.
|
|
175
|
+
for (let i = 0; i < blockIds.length; i += 500) {
|
|
176
|
+
const rows = await this.db
|
|
177
|
+
.select()
|
|
178
|
+
.from(blocks)
|
|
179
|
+
.where(inArray(blocks.id, blockIds.slice(i, i + 500)));
|
|
180
|
+
out.push(...rows.map((row) => ({
|
|
181
|
+
workspaceId: row.workspace_id,
|
|
182
|
+
serviceId: row.service_id ?? null,
|
|
183
|
+
block: rowToBlock(row),
|
|
184
|
+
})));
|
|
185
|
+
}
|
|
186
|
+
return out;
|
|
187
|
+
}
|
|
188
|
+
async insert(workspaceId, block, serviceId) {
|
|
189
|
+
await this.db.insert(blocks).values({
|
|
190
|
+
workspace_id: workspaceId,
|
|
191
|
+
service_id: serviceId ?? null,
|
|
192
|
+
...blockInsertValues(block),
|
|
193
|
+
});
|
|
194
|
+
}
|
|
195
|
+
async update(workspaceId, id, patch) {
|
|
196
|
+
const set = blockPatchToColumns(patch);
|
|
197
|
+
if (Object.keys(set).length === 0)
|
|
198
|
+
return;
|
|
199
|
+
await this.db
|
|
200
|
+
.update(blocks)
|
|
201
|
+
.set(set)
|
|
202
|
+
.where(and(eq(blocks.workspace_id, workspaceId), eq(blocks.id, id)));
|
|
203
|
+
}
|
|
204
|
+
async setService(workspaceId, ids, serviceId) {
|
|
205
|
+
if (ids.length === 0)
|
|
206
|
+
return;
|
|
207
|
+
await this.db
|
|
208
|
+
.update(blocks)
|
|
209
|
+
.set({ service_id: serviceId })
|
|
210
|
+
.where(and(eq(blocks.workspace_id, workspaceId), inArray(blocks.id, ids)));
|
|
211
|
+
}
|
|
212
|
+
async deleteMany(workspaceId, ids) {
|
|
213
|
+
if (ids.length === 0)
|
|
214
|
+
return;
|
|
215
|
+
await this.db
|
|
216
|
+
.delete(blocks)
|
|
217
|
+
.where(and(eq(blocks.workspace_id, workspaceId), inArray(blocks.id, ids)));
|
|
218
|
+
}
|
|
219
|
+
async countActiveInternal(workspaceId) {
|
|
220
|
+
const [row] = await this.db
|
|
221
|
+
.select({ n: count() })
|
|
222
|
+
.from(blocks)
|
|
223
|
+
.where(and(eq(blocks.workspace_id, workspaceId), eq(blocks.internal, 1), eq(blocks.status, 'in_progress')));
|
|
224
|
+
return row?.n ?? 0;
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
export class DrizzleServiceFragmentDefaultsRepository {
|
|
228
|
+
db;
|
|
229
|
+
constructor(db) {
|
|
230
|
+
this.db = db;
|
|
231
|
+
}
|
|
232
|
+
async get(workspaceId) {
|
|
233
|
+
const [row] = await this.db
|
|
234
|
+
.select({ fragmentIds: workspaceFragmentDefaults.fragment_ids })
|
|
235
|
+
.from(workspaceFragmentDefaults)
|
|
236
|
+
.where(eq(workspaceFragmentDefaults.workspace_id, workspaceId));
|
|
237
|
+
return row ? JSON.parse(row.fragmentIds) : [];
|
|
238
|
+
}
|
|
239
|
+
async set(workspaceId, fragmentIds) {
|
|
240
|
+
await this.db
|
|
241
|
+
.insert(workspaceFragmentDefaults)
|
|
242
|
+
.values({
|
|
243
|
+
workspace_id: workspaceId,
|
|
244
|
+
fragment_ids: JSON.stringify(fragmentIds),
|
|
245
|
+
updated_at: Date.now(),
|
|
246
|
+
})
|
|
247
|
+
.onConflictDoUpdate({
|
|
248
|
+
target: workspaceFragmentDefaults.workspace_id,
|
|
249
|
+
set: { fragment_ids: JSON.stringify(fragmentIds), updated_at: Date.now() },
|
|
250
|
+
});
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
function rowToService(row) {
|
|
254
|
+
return {
|
|
255
|
+
id: row.id,
|
|
256
|
+
accountId: row.account_id,
|
|
257
|
+
frameBlockId: row.frame_block_id,
|
|
258
|
+
installationId: row.installation_id,
|
|
259
|
+
repoGithubId: row.repo_github_id,
|
|
260
|
+
directory: row.directory,
|
|
261
|
+
createdAt: row.created_at,
|
|
262
|
+
};
|
|
263
|
+
}
|
|
264
|
+
/** Account-owned services (migration 0030). The canonical, shareable board unit. */
|
|
265
|
+
export class DrizzleServiceRepository {
|
|
266
|
+
db;
|
|
267
|
+
constructor(db) {
|
|
268
|
+
this.db = db;
|
|
269
|
+
}
|
|
270
|
+
async get(id) {
|
|
271
|
+
const [row] = await this.db.select().from(services).where(eq(services.id, id));
|
|
272
|
+
return row ? rowToService(row) : null;
|
|
273
|
+
}
|
|
274
|
+
async getByFrameBlock(frameBlockId) {
|
|
275
|
+
const [row] = await this.db
|
|
276
|
+
.select()
|
|
277
|
+
.from(services)
|
|
278
|
+
.where(eq(services.frame_block_id, frameBlockId));
|
|
279
|
+
return row ? rowToService(row) : null;
|
|
280
|
+
}
|
|
281
|
+
async listByFrameBlocks(frameBlockIds) {
|
|
282
|
+
if (frameBlockIds.length === 0)
|
|
283
|
+
return [];
|
|
284
|
+
const out = [];
|
|
285
|
+
// Chunk the IN list to stay well under the bind-parameter limit.
|
|
286
|
+
for (let i = 0; i < frameBlockIds.length; i += 500) {
|
|
287
|
+
const rows = await this.db
|
|
288
|
+
.select()
|
|
289
|
+
.from(services)
|
|
290
|
+
.where(inArray(services.frame_block_id, frameBlockIds.slice(i, i + 500)));
|
|
291
|
+
for (const row of rows)
|
|
292
|
+
out.push(rowToService(row));
|
|
293
|
+
}
|
|
294
|
+
return out;
|
|
295
|
+
}
|
|
296
|
+
async listByAccount(accountId) {
|
|
297
|
+
// NULL-safe match so the legacy/unscoped org (accountId null) lists cleanly.
|
|
298
|
+
const rows = await this.db
|
|
299
|
+
.select()
|
|
300
|
+
.from(services)
|
|
301
|
+
.where(sql `${services.account_id} IS NOT DISTINCT FROM ${accountId}`)
|
|
302
|
+
.orderBy(services.created_at);
|
|
303
|
+
return rows.map(rowToService);
|
|
304
|
+
}
|
|
305
|
+
async listByIds(ids) {
|
|
306
|
+
if (ids.length === 0)
|
|
307
|
+
return [];
|
|
308
|
+
const out = [];
|
|
309
|
+
// Chunk the IN list to stay well under the bind-parameter limit.
|
|
310
|
+
for (let i = 0; i < ids.length; i += 500) {
|
|
311
|
+
const rows = await this.db
|
|
312
|
+
.select()
|
|
313
|
+
.from(services)
|
|
314
|
+
.where(inArray(services.id, ids.slice(i, i + 500)));
|
|
315
|
+
for (const row of rows)
|
|
316
|
+
out.push(rowToService(row));
|
|
317
|
+
}
|
|
318
|
+
return out;
|
|
319
|
+
}
|
|
320
|
+
async getByRepo(installationId, repoGithubId) {
|
|
321
|
+
const [row] = await this.db
|
|
322
|
+
.select()
|
|
323
|
+
.from(services)
|
|
324
|
+
.where(and(eq(services.installation_id, installationId), eq(services.repo_github_id, repoGithubId)));
|
|
325
|
+
return row ? rowToService(row) : null;
|
|
326
|
+
}
|
|
327
|
+
async insert(service) {
|
|
328
|
+
await this.db.insert(services).values({
|
|
329
|
+
id: service.id,
|
|
330
|
+
account_id: service.accountId,
|
|
331
|
+
frame_block_id: service.frameBlockId,
|
|
332
|
+
installation_id: service.installationId,
|
|
333
|
+
repo_github_id: service.repoGithubId,
|
|
334
|
+
directory: service.directory ?? null,
|
|
335
|
+
created_at: service.createdAt,
|
|
336
|
+
});
|
|
337
|
+
}
|
|
338
|
+
async update(id, patch) {
|
|
339
|
+
const set = {};
|
|
340
|
+
if ('accountId' in patch)
|
|
341
|
+
set.account_id = patch.accountId ?? null;
|
|
342
|
+
if ('installationId' in patch)
|
|
343
|
+
set.installation_id = patch.installationId ?? null;
|
|
344
|
+
if ('repoGithubId' in patch)
|
|
345
|
+
set.repo_github_id = patch.repoGithubId ?? null;
|
|
346
|
+
if ('directory' in patch)
|
|
347
|
+
set.directory = patch.directory ?? null;
|
|
348
|
+
if (Object.keys(set).length === 0)
|
|
349
|
+
return;
|
|
350
|
+
await this.db.update(services).set(set).where(eq(services.id, id));
|
|
351
|
+
}
|
|
352
|
+
async delete(id) {
|
|
353
|
+
await this.db.delete(services).where(eq(services.id, id));
|
|
354
|
+
}
|
|
355
|
+
async deleteMany(ids) {
|
|
356
|
+
if (ids.length === 0)
|
|
357
|
+
return;
|
|
358
|
+
// Chunk the IN list to stay well under the bind-parameter limit.
|
|
359
|
+
for (let i = 0; i < ids.length; i += 500) {
|
|
360
|
+
await this.db.delete(services).where(inArray(services.id, ids.slice(i, i + 500)));
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
function rowToMount(row) {
|
|
365
|
+
return {
|
|
366
|
+
workspaceId: row.workspace_id,
|
|
367
|
+
serviceId: row.service_id,
|
|
368
|
+
position: { x: row.pos_x, y: row.pos_y },
|
|
369
|
+
size: row.width !== null && row.height !== null ? { w: row.width, h: row.height } : null,
|
|
370
|
+
createdAt: row.created_at,
|
|
371
|
+
};
|
|
372
|
+
}
|
|
373
|
+
/** A service mounted onto a workspace board + its per-workspace layout (migration 0030). */
|
|
374
|
+
export class DrizzleWorkspaceMountRepository {
|
|
375
|
+
db;
|
|
376
|
+
constructor(db) {
|
|
377
|
+
this.db = db;
|
|
378
|
+
}
|
|
379
|
+
async listByWorkspace(workspaceId) {
|
|
380
|
+
const rows = await this.db
|
|
381
|
+
.select()
|
|
382
|
+
.from(workspaceServices)
|
|
383
|
+
.where(eq(workspaceServices.workspace_id, workspaceId))
|
|
384
|
+
.orderBy(workspaceServices.created_at);
|
|
385
|
+
return rows.map(rowToMount);
|
|
386
|
+
}
|
|
387
|
+
async listByService(serviceId) {
|
|
388
|
+
const rows = await this.db
|
|
389
|
+
.select()
|
|
390
|
+
.from(workspaceServices)
|
|
391
|
+
.where(eq(workspaceServices.service_id, serviceId))
|
|
392
|
+
.orderBy(workspaceServices.created_at);
|
|
393
|
+
return rows.map(rowToMount);
|
|
394
|
+
}
|
|
395
|
+
async listByServiceIds(serviceIds) {
|
|
396
|
+
if (serviceIds.length === 0)
|
|
397
|
+
return [];
|
|
398
|
+
const rows = await this.db
|
|
399
|
+
.select()
|
|
400
|
+
.from(workspaceServices)
|
|
401
|
+
.where(inArray(workspaceServices.service_id, serviceIds))
|
|
402
|
+
.orderBy(workspaceServices.created_at);
|
|
403
|
+
return rows.map(rowToMount);
|
|
404
|
+
}
|
|
405
|
+
async listWorkspaceIdsMountingBlock(originWorkspaceId, blockId) {
|
|
406
|
+
// One join: the service owning the block → the workspaces that mount it. A block with no
|
|
407
|
+
// service makes the subquery NULL, which matches no rows (`service_id = NULL`) → empty.
|
|
408
|
+
const rows = await this.db
|
|
409
|
+
.select({ workspaceId: workspaceServices.workspace_id })
|
|
410
|
+
.from(workspaceServices)
|
|
411
|
+
.where(sql `${workspaceServices.service_id} = (SELECT ${blocks.service_id} FROM ${blocks} WHERE ${blocks.workspace_id} = ${originWorkspaceId} AND ${blocks.id} = ${blockId})`);
|
|
412
|
+
return rows.map((r) => r.workspaceId);
|
|
413
|
+
}
|
|
414
|
+
async countByServiceIds(serviceIds) {
|
|
415
|
+
if (serviceIds.length === 0)
|
|
416
|
+
return {};
|
|
417
|
+
const rows = await this.db
|
|
418
|
+
.select({ serviceId: workspaceServices.service_id, n: sql `count(*)` })
|
|
419
|
+
.from(workspaceServices)
|
|
420
|
+
.where(inArray(workspaceServices.service_id, serviceIds))
|
|
421
|
+
.groupBy(workspaceServices.service_id);
|
|
422
|
+
const counts = {};
|
|
423
|
+
for (const row of rows)
|
|
424
|
+
counts[row.serviceId] = Number(row.n);
|
|
425
|
+
return counts;
|
|
426
|
+
}
|
|
427
|
+
async get(workspaceId, serviceId) {
|
|
428
|
+
const [row] = await this.db
|
|
429
|
+
.select()
|
|
430
|
+
.from(workspaceServices)
|
|
431
|
+
.where(and(eq(workspaceServices.workspace_id, workspaceId), eq(workspaceServices.service_id, serviceId)));
|
|
432
|
+
return row ? rowToMount(row) : null;
|
|
433
|
+
}
|
|
434
|
+
async upsert(mount) {
|
|
435
|
+
await this.db
|
|
436
|
+
.insert(workspaceServices)
|
|
437
|
+
.values({
|
|
438
|
+
workspace_id: mount.workspaceId,
|
|
439
|
+
service_id: mount.serviceId,
|
|
440
|
+
pos_x: mount.position.x,
|
|
441
|
+
pos_y: mount.position.y,
|
|
442
|
+
width: mount.size?.w ?? null,
|
|
443
|
+
height: mount.size?.h ?? null,
|
|
444
|
+
created_at: mount.createdAt,
|
|
445
|
+
})
|
|
446
|
+
.onConflictDoUpdate({
|
|
447
|
+
target: [workspaceServices.workspace_id, workspaceServices.service_id],
|
|
448
|
+
set: {
|
|
449
|
+
pos_x: mount.position.x,
|
|
450
|
+
pos_y: mount.position.y,
|
|
451
|
+
width: mount.size?.w ?? null,
|
|
452
|
+
height: mount.size?.h ?? null,
|
|
453
|
+
},
|
|
454
|
+
});
|
|
455
|
+
}
|
|
456
|
+
async update(workspaceId, serviceId, patch) {
|
|
457
|
+
const set = {};
|
|
458
|
+
if (patch.position) {
|
|
459
|
+
set.pos_x = patch.position.x;
|
|
460
|
+
set.pos_y = patch.position.y;
|
|
461
|
+
}
|
|
462
|
+
if ('size' in patch) {
|
|
463
|
+
set.width = patch.size?.w ?? null;
|
|
464
|
+
set.height = patch.size?.h ?? null;
|
|
465
|
+
}
|
|
466
|
+
if (Object.keys(set).length === 0)
|
|
467
|
+
return;
|
|
468
|
+
await this.db
|
|
469
|
+
.update(workspaceServices)
|
|
470
|
+
.set(set)
|
|
471
|
+
.where(and(eq(workspaceServices.workspace_id, workspaceId), eq(workspaceServices.service_id, serviceId)));
|
|
472
|
+
}
|
|
473
|
+
async remove(workspaceId, serviceId) {
|
|
474
|
+
await this.db
|
|
475
|
+
.delete(workspaceServices)
|
|
476
|
+
.where(and(eq(workspaceServices.workspace_id, workspaceId), eq(workspaceServices.service_id, serviceId)));
|
|
477
|
+
}
|
|
478
|
+
async removeByServices(serviceIds) {
|
|
479
|
+
if (serviceIds.length === 0)
|
|
480
|
+
return;
|
|
481
|
+
// Chunk the IN list to stay well under the bind-parameter limit.
|
|
482
|
+
for (let i = 0; i < serviceIds.length; i += 500) {
|
|
483
|
+
await this.db
|
|
484
|
+
.delete(workspaceServices)
|
|
485
|
+
.where(inArray(workspaceServices.service_id, serviceIds.slice(i, i + 500)));
|
|
486
|
+
}
|
|
487
|
+
}
|
|
488
|
+
}
|
|
489
|
+
//# sourceMappingURL=board.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"board.js","sourceRoot":"","sources":["../../../src/repositories/drizzle/board.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import type { IncidentEnrichmentConnectionRecord, IncidentEnrichmentConnectionRepository, ObservabilityConnectionRecord, ObservabilityConnectionRepository, PackageRegistryConnectionRecord, PackageRegistryConnectionRepository, ReleaseHealthConfigRecord, ReleaseHealthConfigRepository, SubscriptionQuotaCycleRecord, SubscriptionQuotaCycleRepository, SubscriptionQuotaScope, SubscriptionQuotaWindowKind, TestSecretRecord, TestSecretsRepository } from '@cat-factory/kernel';
|
|
2
|
+
import type { SubscriptionVendor } from '@cat-factory/contracts';
|
|
3
|
+
import type { DrizzleDb } from '../../db/client.js';
|
|
4
|
+
export declare class DrizzleObservabilityConnectionRepository implements ObservabilityConnectionRepository {
|
|
5
|
+
private readonly db;
|
|
6
|
+
constructor(db: DrizzleDb);
|
|
7
|
+
get(workspaceId: string): Promise<ObservabilityConnectionRecord | null>;
|
|
8
|
+
upsert(record: ObservabilityConnectionRecord): Promise<void>;
|
|
9
|
+
delete(workspaceId: string): Promise<void>;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Postgres-backed modeled subscription quota-cycle counters (the Drizzle mirror of the
|
|
13
|
+
* Worker's `D1SubscriptionQuotaCycleRepository`, migration 0047), column-for-column so
|
|
14
|
+
* behaviour matches across stores.
|
|
15
|
+
*/
|
|
16
|
+
export declare class DrizzleSubscriptionQuotaCycleRepository implements SubscriptionQuotaCycleRepository {
|
|
17
|
+
private readonly db;
|
|
18
|
+
constructor(db: DrizzleDb);
|
|
19
|
+
recordUsage(key: {
|
|
20
|
+
id: string;
|
|
21
|
+
scope: SubscriptionQuotaScope;
|
|
22
|
+
scopeId: string;
|
|
23
|
+
vendor: SubscriptionVendor;
|
|
24
|
+
windowKind: SubscriptionQuotaWindowKind;
|
|
25
|
+
}, usage: {
|
|
26
|
+
inputTokens: number;
|
|
27
|
+
outputTokens: number;
|
|
28
|
+
}, at: number, windowMs: number): Promise<void>;
|
|
29
|
+
listByScopeVendor(scope: SubscriptionQuotaScope, scopeId: string, vendor: SubscriptionVendor): Promise<SubscriptionQuotaCycleRecord[]>;
|
|
30
|
+
deleteOlderThan(epochMs: number): Promise<number>;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* A workspace's private package-registry connection over Postgres (the Drizzle mirror
|
|
34
|
+
* of the Worker's `D1PackageRegistryConnectionRepository`, migration 0034). One row per
|
|
35
|
+
* workspace; the registry entries are stored as ONE sealed JSON array (encrypted by the
|
|
36
|
+
* caller), with a non-secret `summary` blob for display.
|
|
37
|
+
*/
|
|
38
|
+
export declare class DrizzlePackageRegistryConnectionRepository implements PackageRegistryConnectionRepository {
|
|
39
|
+
private readonly db;
|
|
40
|
+
constructor(db: DrizzleDb);
|
|
41
|
+
get(workspaceId: string): Promise<PackageRegistryConnectionRecord | null>;
|
|
42
|
+
upsert(record: PackageRegistryConnectionRecord): Promise<void>;
|
|
43
|
+
delete(workspaceId: string): Promise<void>;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* A workspace's incident-enrichment connection over Postgres (the Drizzle mirror of the
|
|
47
|
+
* Worker's `D1IncidentEnrichmentConnectionRepository`, migration 0013). One row per
|
|
48
|
+
* workspace; both PagerDuty + incident.io credentials live in ONE sealed JSON blob
|
|
49
|
+
* (encrypted by the caller), with a non-secret `summary` presence blob.
|
|
50
|
+
*/
|
|
51
|
+
export declare class DrizzleIncidentEnrichmentConnectionRepository implements IncidentEnrichmentConnectionRepository {
|
|
52
|
+
private readonly db;
|
|
53
|
+
constructor(db: DrizzleDb);
|
|
54
|
+
get(workspaceId: string): Promise<IncidentEnrichmentConnectionRecord | null>;
|
|
55
|
+
upsert(record: IncidentEnrichmentConnectionRecord): Promise<void>;
|
|
56
|
+
delete(workspaceId: string): Promise<void>;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Per-block monitor/SLO mapping for the post-release-health gate over Postgres (the
|
|
60
|
+
* Drizzle mirror of the Worker's `D1ReleaseHealthConfigRepository`, migration 0003).
|
|
61
|
+
*/
|
|
62
|
+
export declare class DrizzleReleaseHealthConfigRepository implements ReleaseHealthConfigRepository {
|
|
63
|
+
private readonly db;
|
|
64
|
+
constructor(db: DrizzleDb);
|
|
65
|
+
getByBlock(workspaceId: string, blockId: string): Promise<ReleaseHealthConfigRecord | null>;
|
|
66
|
+
listByWorkspace(workspaceId: string): Promise<ReleaseHealthConfigRecord[]>;
|
|
67
|
+
upsert(record: ReleaseHealthConfigRecord): Promise<void>;
|
|
68
|
+
delete(workspaceId: string, blockId: string): Promise<void>;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* A service frame's sensitive test credentials over Postgres (the Drizzle mirror of the
|
|
72
|
+
* Worker's `D1TestSecretsRepository`, migration 0044). At most one row per (workspace, block);
|
|
73
|
+
* `credentials` is a sealed envelope of the `TestSecretEntry[]` JSON, `summary` a non-secret
|
|
74
|
+
* `TestSecretRef[]` display blob.
|
|
75
|
+
*/
|
|
76
|
+
export declare class DrizzleTestSecretsRepository implements TestSecretsRepository {
|
|
77
|
+
private readonly db;
|
|
78
|
+
constructor(db: DrizzleDb);
|
|
79
|
+
getByBlock(workspaceId: string, blockId: string): Promise<TestSecretRecord | null>;
|
|
80
|
+
listByWorkspace(workspaceId: string): Promise<TestSecretRecord[]>;
|
|
81
|
+
upsert(record: TestSecretRecord): Promise<void>;
|
|
82
|
+
deleteByBlock(workspaceId: string, blockId: string): Promise<void>;
|
|
83
|
+
}
|
|
84
|
+
//# sourceMappingURL=connections.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"connections.d.ts","sourceRoot":"","sources":["../../../src/repositories/drizzle/connections.ts"],"names":[],"mappings":"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"}
|