@beignet/provider-db-drizzle 0.0.22 → 0.0.24
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/CHANGELOG.md +8 -0
- package/README.md +89 -13
- package/dist/mysql/index.d.ts +31 -1
- package/dist/mysql/index.d.ts.map +1 -1
- package/dist/mysql/index.js +59 -0
- package/dist/mysql/index.js.map +1 -1
- package/dist/postgres/index.d.ts +27 -1
- package/dist/postgres/index.d.ts.map +1 -1
- package/dist/postgres/index.js +55 -0
- package/dist/postgres/index.js.map +1 -1
- package/dist/shared/audit-core.d.ts +33 -0
- package/dist/shared/audit-core.d.ts.map +1 -0
- package/dist/shared/audit-core.js +85 -0
- package/dist/shared/audit-core.js.map +1 -0
- package/dist/sqlite/index.d.ts +27 -1
- package/dist/sqlite/index.d.ts.map +1 -1
- package/dist/sqlite/index.js +55 -0
- package/dist/sqlite/index.js.map +1 -1
- package/package.json +2 -2
- package/src/mysql/index.ts +95 -0
- package/src/postgres/index.ts +91 -0
- package/src/shared/audit-core.ts +134 -0
- package/src/sqlite/index.ts +91 -0
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import { normalizeAuditLogEntry, redactAuditLogEntry, } from "@beignet/core/ports";
|
|
2
|
+
import { sql } from "drizzle-orm";
|
|
3
|
+
function defaultCreateAuditLogId() {
|
|
4
|
+
if (typeof globalThis.crypto?.randomUUID !== "function") {
|
|
5
|
+
throw new Error("Drizzle audit log adapters require globalThis.crypto.randomUUID(). Pass createId when this runtime does not provide it.");
|
|
6
|
+
}
|
|
7
|
+
return globalThis.crypto.randomUUID();
|
|
8
|
+
}
|
|
9
|
+
function serialize(value) {
|
|
10
|
+
return value === undefined ? null : JSON.stringify(value);
|
|
11
|
+
}
|
|
12
|
+
export function createAuditLogSqlRow(input, options = {}) {
|
|
13
|
+
const normalized = normalizeAuditLogEntry(input);
|
|
14
|
+
const entry = options.redact
|
|
15
|
+
? options.redact(redactAuditLogEntry(normalized))
|
|
16
|
+
: redactAuditLogEntry(normalized);
|
|
17
|
+
const createId = options.createId ?? defaultCreateAuditLogId;
|
|
18
|
+
return {
|
|
19
|
+
id: createId(),
|
|
20
|
+
action: entry.action,
|
|
21
|
+
actorType: entry.actor.type,
|
|
22
|
+
actorId: entry.actor.id ?? null,
|
|
23
|
+
actorDisplayName: entry.actor.displayName ?? null,
|
|
24
|
+
tenantId: entry.tenant?.id ?? null,
|
|
25
|
+
tenantSlug: entry.tenant?.slug ?? null,
|
|
26
|
+
resourceType: entry.resource?.type ?? null,
|
|
27
|
+
resourceId: entry.resource?.id ?? null,
|
|
28
|
+
resourceName: entry.resource?.name ?? null,
|
|
29
|
+
outcome: entry.outcome,
|
|
30
|
+
requestId: entry.requestId ?? null,
|
|
31
|
+
traceId: entry.traceId ?? null,
|
|
32
|
+
message: entry.message ?? null,
|
|
33
|
+
metadata: serialize(entry.metadata),
|
|
34
|
+
actorMetadata: serialize(entry.actor.metadata),
|
|
35
|
+
tenantMetadata: serialize(entry.tenant?.metadata),
|
|
36
|
+
resourceMetadata: serialize(entry.resource?.metadata),
|
|
37
|
+
occurredAt: entry.occurredAt.toISOString(),
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
export function createAuditLogInsertQuery(table, row) {
|
|
41
|
+
return sql `
|
|
42
|
+
insert into ${table} (
|
|
43
|
+
id,
|
|
44
|
+
action,
|
|
45
|
+
actor_type,
|
|
46
|
+
actor_id,
|
|
47
|
+
actor_display_name,
|
|
48
|
+
tenant_id,
|
|
49
|
+
tenant_slug,
|
|
50
|
+
resource_type,
|
|
51
|
+
resource_id,
|
|
52
|
+
resource_name,
|
|
53
|
+
outcome,
|
|
54
|
+
request_id,
|
|
55
|
+
trace_id,
|
|
56
|
+
message,
|
|
57
|
+
metadata,
|
|
58
|
+
actor_metadata,
|
|
59
|
+
tenant_metadata,
|
|
60
|
+
resource_metadata,
|
|
61
|
+
occurred_at
|
|
62
|
+
) values (
|
|
63
|
+
${row.id},
|
|
64
|
+
${row.action},
|
|
65
|
+
${row.actorType},
|
|
66
|
+
${row.actorId},
|
|
67
|
+
${row.actorDisplayName},
|
|
68
|
+
${row.tenantId},
|
|
69
|
+
${row.tenantSlug},
|
|
70
|
+
${row.resourceType},
|
|
71
|
+
${row.resourceId},
|
|
72
|
+
${row.resourceName},
|
|
73
|
+
${row.outcome},
|
|
74
|
+
${row.requestId},
|
|
75
|
+
${row.traceId},
|
|
76
|
+
${row.message},
|
|
77
|
+
${row.metadata},
|
|
78
|
+
${row.actorMetadata},
|
|
79
|
+
${row.tenantMetadata},
|
|
80
|
+
${row.resourceMetadata},
|
|
81
|
+
${row.occurredAt}
|
|
82
|
+
)
|
|
83
|
+
`;
|
|
84
|
+
}
|
|
85
|
+
//# sourceMappingURL=audit-core.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audit-core.js","sourceRoot":"","sources":["../../src/shared/audit-core.ts"],"names":[],"mappings":"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"}
|
package/dist/sqlite/index.d.ts
CHANGED
|
@@ -30,13 +30,14 @@
|
|
|
30
30
|
*/
|
|
31
31
|
import type { IdempotencyPort } from "@beignet/core/idempotency";
|
|
32
32
|
import type { OutboxPort } from "@beignet/core/outbox";
|
|
33
|
-
import { type BufferedDomainEventRecorder, type EventBusPort, type UnitOfWorkPort } from "@beignet/core/ports";
|
|
33
|
+
import { type AuditLogPort, type BufferedDomainEventRecorder, type EventBusPort, type UnitOfWorkPort } from "@beignet/core/ports";
|
|
34
34
|
import { type Client } from "@libsql/client";
|
|
35
35
|
import { type ExtractTablesWithRelations } from "drizzle-orm";
|
|
36
36
|
import { type LibSQLDatabase } from "drizzle-orm/libsql";
|
|
37
37
|
import type { LibSQLTransaction } from "drizzle-orm/libsql/session";
|
|
38
38
|
import type { SQLiteTransactionConfig } from "drizzle-orm/sqlite-core";
|
|
39
39
|
import { z } from "zod";
|
|
40
|
+
import { type DrizzleAuditLogCoreOptions } from "../shared/audit-core.js";
|
|
40
41
|
import { type DbHealth } from "../shared/health.js";
|
|
41
42
|
/**
|
|
42
43
|
* Typed database port interface.
|
|
@@ -110,6 +111,31 @@ export interface DrizzleSqliteUnitOfWorkOptions<TSchema extends Record<string, u
|
|
|
110
111
|
* decides which transaction-scoped ports to create.
|
|
111
112
|
*/
|
|
112
113
|
export declare function createDrizzleSqliteUnitOfWork<TSchema extends Record<string, unknown>, TxPorts>(options: DrizzleSqliteUnitOfWorkOptions<TSchema, TxPorts>): UnitOfWorkPort<TxPorts>;
|
|
114
|
+
/**
|
|
115
|
+
* Options for a Drizzle SQLite-backed audit log port.
|
|
116
|
+
*/
|
|
117
|
+
export interface DrizzleSqliteAuditLogOptions extends DrizzleAuditLogCoreOptions {
|
|
118
|
+
/**
|
|
119
|
+
* Table that stores audit log entries.
|
|
120
|
+
*
|
|
121
|
+
* Default: "audit_log".
|
|
122
|
+
*/
|
|
123
|
+
tableName?: string;
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Create idempotent SQL statements for the Drizzle SQLite audit log table.
|
|
127
|
+
*
|
|
128
|
+
* Run these during migrations or local setup before using
|
|
129
|
+
* `createDrizzleSqliteAuditLogPort(...)`.
|
|
130
|
+
*/
|
|
131
|
+
export declare function createDrizzleSqliteAuditLogSetupStatements(options?: DrizzleSqliteAuditLogOptions): readonly string[];
|
|
132
|
+
/**
|
|
133
|
+
* Create a Beignet audit log port backed by a Drizzle SQLite database.
|
|
134
|
+
*
|
|
135
|
+
* The port accepts both the root Drizzle database and transaction clients, so
|
|
136
|
+
* applications can rebuild audit logging inside Unit of Work transaction ports.
|
|
137
|
+
*/
|
|
138
|
+
export declare function createDrizzleSqliteAuditLogPort<TSchema extends Record<string, unknown>>(db: DrizzleSqliteDatabase<TSchema>, adapterOptions?: DrizzleSqliteAuditLogOptions): AuditLogPort;
|
|
113
139
|
/**
|
|
114
140
|
* Options for a Drizzle SQLite-backed outbox port.
|
|
115
141
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/sqlite/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/sqlite/index.ts"],"names":[],"mappings":"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"}
|
package/dist/sqlite/index.js
CHANGED
|
@@ -34,6 +34,7 @@ import { createClient } from "@libsql/client";
|
|
|
34
34
|
import { sql } from "drizzle-orm";
|
|
35
35
|
import { drizzle } from "drizzle-orm/libsql";
|
|
36
36
|
import { z } from "zod";
|
|
37
|
+
import { createAuditLogInsertQuery, createAuditLogSqlRow, } from "../shared/audit-core.js";
|
|
37
38
|
import { dbHealthError, dbHealthOk } from "../shared/health.js";
|
|
38
39
|
import { createIdempotencyPortCore, formatIdempotencyMutationErrorMessage, } from "../shared/idempotency-core.js";
|
|
39
40
|
import { quoteIdentifier } from "../shared/identifiers.js";
|
|
@@ -70,6 +71,60 @@ export function createDrizzleSqliteUnitOfWork(options) {
|
|
|
70
71
|
},
|
|
71
72
|
};
|
|
72
73
|
}
|
|
74
|
+
/**
|
|
75
|
+
* Create idempotent SQL statements for the Drizzle SQLite audit log table.
|
|
76
|
+
*
|
|
77
|
+
* Run these during migrations or local setup before using
|
|
78
|
+
* `createDrizzleSqliteAuditLogPort(...)`.
|
|
79
|
+
*/
|
|
80
|
+
export function createDrizzleSqliteAuditLogSetupStatements(options = {}) {
|
|
81
|
+
const tableName = options.tableName ?? "audit_log";
|
|
82
|
+
const table = quoteIdentifier(tableName, '"');
|
|
83
|
+
const indexPrefix = tableName.replaceAll(/[^A-Za-z0-9_]/g, "_");
|
|
84
|
+
return [
|
|
85
|
+
`CREATE TABLE IF NOT EXISTS ${table} (
|
|
86
|
+
id text PRIMARY KEY NOT NULL,
|
|
87
|
+
action text NOT NULL,
|
|
88
|
+
actor_type text NOT NULL,
|
|
89
|
+
actor_id text,
|
|
90
|
+
actor_display_name text,
|
|
91
|
+
tenant_id text,
|
|
92
|
+
tenant_slug text,
|
|
93
|
+
resource_type text,
|
|
94
|
+
resource_id text,
|
|
95
|
+
resource_name text,
|
|
96
|
+
outcome text DEFAULT 'success' NOT NULL,
|
|
97
|
+
request_id text,
|
|
98
|
+
trace_id text,
|
|
99
|
+
message text,
|
|
100
|
+
metadata text,
|
|
101
|
+
actor_metadata text,
|
|
102
|
+
tenant_metadata text,
|
|
103
|
+
resource_metadata text,
|
|
104
|
+
occurred_at text NOT NULL
|
|
105
|
+
)`,
|
|
106
|
+
`CREATE INDEX IF NOT EXISTS ${quoteIdentifier(`${indexPrefix}_action_idx`, '"')} ON ${table} (action)`,
|
|
107
|
+
`CREATE INDEX IF NOT EXISTS ${quoteIdentifier(`${indexPrefix}_actor_idx`, '"')} ON ${table} (actor_type, actor_id)`,
|
|
108
|
+
`CREATE INDEX IF NOT EXISTS ${quoteIdentifier(`${indexPrefix}_occurred_at_idx`, '"')} ON ${table} (occurred_at)`,
|
|
109
|
+
`CREATE INDEX IF NOT EXISTS ${quoteIdentifier(`${indexPrefix}_request_idx`, '"')} ON ${table} (request_id)`,
|
|
110
|
+
`CREATE INDEX IF NOT EXISTS ${quoteIdentifier(`${indexPrefix}_resource_idx`, '"')} ON ${table} (resource_type, resource_id)`,
|
|
111
|
+
`CREATE INDEX IF NOT EXISTS ${quoteIdentifier(`${indexPrefix}_tenant_idx`, '"')} ON ${table} (tenant_id)`,
|
|
112
|
+
];
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Create a Beignet audit log port backed by a Drizzle SQLite database.
|
|
116
|
+
*
|
|
117
|
+
* The port accepts both the root Drizzle database and transaction clients, so
|
|
118
|
+
* applications can rebuild audit logging inside Unit of Work transaction ports.
|
|
119
|
+
*/
|
|
120
|
+
export function createDrizzleSqliteAuditLogPort(db, adapterOptions = {}) {
|
|
121
|
+
const table = sql.raw(quoteIdentifier(adapterOptions.tableName ?? "audit_log", '"'));
|
|
122
|
+
return {
|
|
123
|
+
async record(input) {
|
|
124
|
+
await db.run(createAuditLogInsertQuery(table, createAuditLogSqlRow(input, adapterOptions)));
|
|
125
|
+
},
|
|
126
|
+
};
|
|
127
|
+
}
|
|
73
128
|
function readRowsAffected(result) {
|
|
74
129
|
const rowsAffected = result.rowsAffected;
|
|
75
130
|
return typeof rowsAffected === "number" ? rowsAffected : undefined;
|
package/dist/sqlite/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/sqlite/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AAIH,OAAO,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/sqlite/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@beignet/provider-db-drizzle",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.24",
|
|
4
4
|
"type": "module",
|
|
5
|
-
"description": "Drizzle ORM database providers for Beignet — typed DbPort, unit of work, outbox, and idempotency for SQLite (libSQL/Turso), Postgres, and MySQL.",
|
|
5
|
+
"description": "Drizzle ORM database providers for Beignet — typed DbPort, unit of work, audit logs, outbox, and idempotency for SQLite (libSQL/Turso), Postgres, and MySQL.",
|
|
6
6
|
"exports": {
|
|
7
7
|
"./sqlite": {
|
|
8
8
|
"types": "./dist/sqlite/index.d.ts",
|
package/src/mysql/index.ts
CHANGED
|
@@ -30,6 +30,7 @@
|
|
|
30
30
|
import type { IdempotencyPort } from "@beignet/core/idempotency";
|
|
31
31
|
import type { OutboxPort } from "@beignet/core/outbox";
|
|
32
32
|
import {
|
|
33
|
+
type AuditLogPort,
|
|
33
34
|
type BufferedDomainEventRecorder,
|
|
34
35
|
createDomainEventRecorder,
|
|
35
36
|
type EventBusPort,
|
|
@@ -52,6 +53,11 @@ import { drizzle, type MySql2Database } from "drizzle-orm/mysql2";
|
|
|
52
53
|
import type { Pool, PoolOptions } from "mysql2/promise";
|
|
53
54
|
import * as mysql from "mysql2/promise";
|
|
54
55
|
import { z } from "zod";
|
|
56
|
+
import {
|
|
57
|
+
createAuditLogInsertQuery,
|
|
58
|
+
createAuditLogSqlRow,
|
|
59
|
+
type DrizzleAuditLogCoreOptions,
|
|
60
|
+
} from "../shared/audit-core.js";
|
|
55
61
|
import { type DbHealth, dbHealthError, dbHealthOk } from "../shared/health.js";
|
|
56
62
|
import {
|
|
57
63
|
createIdempotencyPortCore,
|
|
@@ -206,6 +212,19 @@ export function createDrizzleMysqlUnitOfWork<
|
|
|
206
212
|
};
|
|
207
213
|
}
|
|
208
214
|
|
|
215
|
+
/**
|
|
216
|
+
* Options for a Drizzle MySQL-backed audit log port.
|
|
217
|
+
*/
|
|
218
|
+
export interface DrizzleMysqlAuditLogOptions
|
|
219
|
+
extends DrizzleAuditLogCoreOptions {
|
|
220
|
+
/**
|
|
221
|
+
* Table that stores audit log entries.
|
|
222
|
+
*
|
|
223
|
+
* Default: "audit_log".
|
|
224
|
+
*/
|
|
225
|
+
tableName?: string;
|
|
226
|
+
}
|
|
227
|
+
|
|
209
228
|
/**
|
|
210
229
|
* Options for a Drizzle MySQL-backed outbox port.
|
|
211
230
|
*/
|
|
@@ -339,6 +358,82 @@ function createMysqlExecutor<TSchema extends Record<string, unknown>>(
|
|
|
339
358
|
};
|
|
340
359
|
}
|
|
341
360
|
|
|
361
|
+
/**
|
|
362
|
+
* Create idempotent SQL statements for the Drizzle MySQL audit log table.
|
|
363
|
+
*
|
|
364
|
+
* Run these during migrations or local setup before using
|
|
365
|
+
* `createDrizzleMysqlAuditLogPort(...)`.
|
|
366
|
+
*
|
|
367
|
+
* Indexes are declared inline because MySQL has no
|
|
368
|
+
* `CREATE INDEX IF NOT EXISTS`; the whole shape stays idempotent under
|
|
369
|
+
* `CREATE TABLE IF NOT EXISTS`.
|
|
370
|
+
*/
|
|
371
|
+
export function createDrizzleMysqlAuditLogSetupStatements(
|
|
372
|
+
options: DrizzleMysqlAuditLogOptions = {},
|
|
373
|
+
): readonly string[] {
|
|
374
|
+
const tableName = options.tableName ?? "audit_log";
|
|
375
|
+
const table = quoteIdentifier(tableName, "`");
|
|
376
|
+
const indexPrefix = tableName.replaceAll(/[^A-Za-z0-9_]/g, "_");
|
|
377
|
+
|
|
378
|
+
return [
|
|
379
|
+
`CREATE TABLE IF NOT EXISTS ${table} (
|
|
380
|
+
id varchar(255) NOT NULL PRIMARY KEY,
|
|
381
|
+
action varchar(255) NOT NULL,
|
|
382
|
+
actor_type varchar(32) NOT NULL,
|
|
383
|
+
actor_id varchar(255),
|
|
384
|
+
actor_display_name varchar(255),
|
|
385
|
+
tenant_id varchar(255),
|
|
386
|
+
tenant_slug varchar(255),
|
|
387
|
+
resource_type varchar(255),
|
|
388
|
+
resource_id varchar(255),
|
|
389
|
+
resource_name varchar(255),
|
|
390
|
+
outcome varchar(16) NOT NULL DEFAULT 'success',
|
|
391
|
+
request_id varchar(255),
|
|
392
|
+
trace_id varchar(255),
|
|
393
|
+
message longtext,
|
|
394
|
+
metadata longtext,
|
|
395
|
+
actor_metadata longtext,
|
|
396
|
+
tenant_metadata longtext,
|
|
397
|
+
resource_metadata longtext,
|
|
398
|
+
occurred_at varchar(32) NOT NULL,
|
|
399
|
+
INDEX ${quoteIdentifier(`${indexPrefix}_action_idx`, "`")} (action),
|
|
400
|
+
INDEX ${quoteIdentifier(`${indexPrefix}_actor_idx`, "`")} (actor_type, actor_id),
|
|
401
|
+
INDEX ${quoteIdentifier(`${indexPrefix}_occurred_at_idx`, "`")} (occurred_at),
|
|
402
|
+
INDEX ${quoteIdentifier(`${indexPrefix}_request_idx`, "`")} (request_id),
|
|
403
|
+
INDEX ${quoteIdentifier(`${indexPrefix}_resource_idx`, "`")} (resource_type, resource_id),
|
|
404
|
+
INDEX ${quoteIdentifier(`${indexPrefix}_tenant_idx`, "`")} (tenant_id)
|
|
405
|
+
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_bin`,
|
|
406
|
+
];
|
|
407
|
+
}
|
|
408
|
+
|
|
409
|
+
/**
|
|
410
|
+
* Create a Beignet audit log port backed by a Drizzle MySQL database.
|
|
411
|
+
*
|
|
412
|
+
* The port accepts both the root Drizzle database and transaction clients, so
|
|
413
|
+
* applications can rebuild audit logging inside Unit of Work transaction ports.
|
|
414
|
+
*/
|
|
415
|
+
export function createDrizzleMysqlAuditLogPort<
|
|
416
|
+
TSchema extends Record<string, unknown>,
|
|
417
|
+
>(
|
|
418
|
+
db: DrizzleMysqlDatabase<TSchema>,
|
|
419
|
+
adapterOptions: DrizzleMysqlAuditLogOptions = {},
|
|
420
|
+
): AuditLogPort {
|
|
421
|
+
const table = sql.raw(
|
|
422
|
+
quoteIdentifier(adapterOptions.tableName ?? "audit_log", "`"),
|
|
423
|
+
);
|
|
424
|
+
|
|
425
|
+
return {
|
|
426
|
+
async record(input) {
|
|
427
|
+
await db.execute(
|
|
428
|
+
createAuditLogInsertQuery(
|
|
429
|
+
table,
|
|
430
|
+
createAuditLogSqlRow(input, adapterOptions),
|
|
431
|
+
),
|
|
432
|
+
);
|
|
433
|
+
},
|
|
434
|
+
};
|
|
435
|
+
}
|
|
436
|
+
|
|
342
437
|
/**
|
|
343
438
|
* Create idempotent SQL statements for the Drizzle MySQL outbox table.
|
|
344
439
|
*
|
package/src/postgres/index.ts
CHANGED
|
@@ -30,6 +30,7 @@
|
|
|
30
30
|
import type { IdempotencyPort } from "@beignet/core/idempotency";
|
|
31
31
|
import type { OutboxPort } from "@beignet/core/outbox";
|
|
32
32
|
import {
|
|
33
|
+
type AuditLogPort,
|
|
33
34
|
type BufferedDomainEventRecorder,
|
|
34
35
|
createDomainEventRecorder,
|
|
35
36
|
type EventBusPort,
|
|
@@ -50,6 +51,11 @@ import {
|
|
|
50
51
|
} from "drizzle-orm/pg-core";
|
|
51
52
|
import pg, { type Pool, type PoolConfig } from "pg";
|
|
52
53
|
import { z } from "zod";
|
|
54
|
+
import {
|
|
55
|
+
createAuditLogInsertQuery,
|
|
56
|
+
createAuditLogSqlRow,
|
|
57
|
+
type DrizzleAuditLogCoreOptions,
|
|
58
|
+
} from "../shared/audit-core.js";
|
|
53
59
|
import { type DbHealth, dbHealthError, dbHealthOk } from "../shared/health.js";
|
|
54
60
|
import {
|
|
55
61
|
createIdempotencyPortCore,
|
|
@@ -201,6 +207,91 @@ export function createDrizzlePostgresUnitOfWork<
|
|
|
201
207
|
};
|
|
202
208
|
}
|
|
203
209
|
|
|
210
|
+
/**
|
|
211
|
+
* Options for a Drizzle Postgres-backed audit log port.
|
|
212
|
+
*/
|
|
213
|
+
export interface DrizzlePostgresAuditLogOptions
|
|
214
|
+
extends DrizzleAuditLogCoreOptions {
|
|
215
|
+
/**
|
|
216
|
+
* Table that stores audit log entries.
|
|
217
|
+
*
|
|
218
|
+
* Default: "audit_log".
|
|
219
|
+
*/
|
|
220
|
+
tableName?: string;
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
/**
|
|
224
|
+
* Create idempotent SQL statements for the Drizzle Postgres audit log table.
|
|
225
|
+
*
|
|
226
|
+
* Run these during migrations or local setup before using
|
|
227
|
+
* `createDrizzlePostgresAuditLogPort(...)`.
|
|
228
|
+
*/
|
|
229
|
+
export function createDrizzlePostgresAuditLogSetupStatements(
|
|
230
|
+
options: DrizzlePostgresAuditLogOptions = {},
|
|
231
|
+
): readonly string[] {
|
|
232
|
+
const tableName = options.tableName ?? "audit_log";
|
|
233
|
+
const table = quoteIdentifier(tableName, '"');
|
|
234
|
+
const indexPrefix = tableName.replaceAll(/[^A-Za-z0-9_]/g, "_");
|
|
235
|
+
|
|
236
|
+
return [
|
|
237
|
+
`CREATE TABLE IF NOT EXISTS ${table} (
|
|
238
|
+
id text PRIMARY KEY NOT NULL,
|
|
239
|
+
action text NOT NULL,
|
|
240
|
+
actor_type text NOT NULL,
|
|
241
|
+
actor_id text,
|
|
242
|
+
actor_display_name text,
|
|
243
|
+
tenant_id text,
|
|
244
|
+
tenant_slug text,
|
|
245
|
+
resource_type text,
|
|
246
|
+
resource_id text,
|
|
247
|
+
resource_name text,
|
|
248
|
+
outcome text DEFAULT 'success' NOT NULL,
|
|
249
|
+
request_id text,
|
|
250
|
+
trace_id text,
|
|
251
|
+
message text,
|
|
252
|
+
metadata text,
|
|
253
|
+
actor_metadata text,
|
|
254
|
+
tenant_metadata text,
|
|
255
|
+
resource_metadata text,
|
|
256
|
+
occurred_at text NOT NULL
|
|
257
|
+
)`,
|
|
258
|
+
`CREATE INDEX IF NOT EXISTS ${quoteIdentifier(`${indexPrefix}_action_idx`, '"')} ON ${table} (action)`,
|
|
259
|
+
`CREATE INDEX IF NOT EXISTS ${quoteIdentifier(`${indexPrefix}_actor_idx`, '"')} ON ${table} (actor_type, actor_id)`,
|
|
260
|
+
`CREATE INDEX IF NOT EXISTS ${quoteIdentifier(`${indexPrefix}_occurred_at_idx`, '"')} ON ${table} (occurred_at)`,
|
|
261
|
+
`CREATE INDEX IF NOT EXISTS ${quoteIdentifier(`${indexPrefix}_request_idx`, '"')} ON ${table} (request_id)`,
|
|
262
|
+
`CREATE INDEX IF NOT EXISTS ${quoteIdentifier(`${indexPrefix}_resource_idx`, '"')} ON ${table} (resource_type, resource_id)`,
|
|
263
|
+
`CREATE INDEX IF NOT EXISTS ${quoteIdentifier(`${indexPrefix}_tenant_idx`, '"')} ON ${table} (tenant_id)`,
|
|
264
|
+
];
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
/**
|
|
268
|
+
* Create a Beignet audit log port backed by a Drizzle Postgres database.
|
|
269
|
+
*
|
|
270
|
+
* The port accepts both the root Drizzle database and transaction clients, so
|
|
271
|
+
* applications can rebuild audit logging inside Unit of Work transaction ports.
|
|
272
|
+
*/
|
|
273
|
+
export function createDrizzlePostgresAuditLogPort<
|
|
274
|
+
TSchema extends Record<string, unknown>,
|
|
275
|
+
>(
|
|
276
|
+
db: DrizzlePostgresDatabase<TSchema>,
|
|
277
|
+
adapterOptions: DrizzlePostgresAuditLogOptions = {},
|
|
278
|
+
): AuditLogPort {
|
|
279
|
+
const table = sql.raw(
|
|
280
|
+
quoteIdentifier(adapterOptions.tableName ?? "audit_log", '"'),
|
|
281
|
+
);
|
|
282
|
+
|
|
283
|
+
return {
|
|
284
|
+
async record(input) {
|
|
285
|
+
await db.execute(
|
|
286
|
+
createAuditLogInsertQuery(
|
|
287
|
+
table,
|
|
288
|
+
createAuditLogSqlRow(input, adapterOptions),
|
|
289
|
+
),
|
|
290
|
+
);
|
|
291
|
+
},
|
|
292
|
+
};
|
|
293
|
+
}
|
|
294
|
+
|
|
204
295
|
/**
|
|
205
296
|
* Options for a Drizzle Postgres-backed outbox port.
|
|
206
297
|
*/
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
import {
|
|
2
|
+
type ActivityActorType,
|
|
3
|
+
type AuditLogEntry,
|
|
4
|
+
type AuditLogEntryInput,
|
|
5
|
+
type AuditLogOptions,
|
|
6
|
+
normalizeAuditLogEntry,
|
|
7
|
+
redactAuditLogEntry,
|
|
8
|
+
} from "@beignet/core/ports";
|
|
9
|
+
import { type SQL, sql } from "drizzle-orm";
|
|
10
|
+
|
|
11
|
+
export interface DrizzleAuditLogCoreOptions extends AuditLogOptions {
|
|
12
|
+
/**
|
|
13
|
+
* Optional ID factory for deterministic tests or runtimes without
|
|
14
|
+
* `globalThis.crypto.randomUUID()`.
|
|
15
|
+
*/
|
|
16
|
+
createId?: () => string;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export type AuditLogSqlRow = {
|
|
20
|
+
id: string;
|
|
21
|
+
action: string;
|
|
22
|
+
actorType: ActivityActorType;
|
|
23
|
+
actorId: string | null;
|
|
24
|
+
actorDisplayName: string | null;
|
|
25
|
+
tenantId: string | null;
|
|
26
|
+
tenantSlug: string | null;
|
|
27
|
+
resourceType: string | null;
|
|
28
|
+
resourceId: string | null;
|
|
29
|
+
resourceName: string | null;
|
|
30
|
+
outcome: AuditLogEntry["outcome"];
|
|
31
|
+
requestId: string | null;
|
|
32
|
+
traceId: string | null;
|
|
33
|
+
message: string | null;
|
|
34
|
+
metadata: string | null;
|
|
35
|
+
actorMetadata: string | null;
|
|
36
|
+
tenantMetadata: string | null;
|
|
37
|
+
resourceMetadata: string | null;
|
|
38
|
+
occurredAt: string;
|
|
39
|
+
};
|
|
40
|
+
|
|
41
|
+
function defaultCreateAuditLogId(): string {
|
|
42
|
+
if (typeof globalThis.crypto?.randomUUID !== "function") {
|
|
43
|
+
throw new Error(
|
|
44
|
+
"Drizzle audit log adapters require globalThis.crypto.randomUUID(). Pass createId when this runtime does not provide it.",
|
|
45
|
+
);
|
|
46
|
+
}
|
|
47
|
+
return globalThis.crypto.randomUUID();
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
function serialize(value: unknown): string | null {
|
|
51
|
+
return value === undefined ? null : JSON.stringify(value);
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
export function createAuditLogSqlRow(
|
|
55
|
+
input: AuditLogEntryInput,
|
|
56
|
+
options: DrizzleAuditLogCoreOptions = {},
|
|
57
|
+
): AuditLogSqlRow {
|
|
58
|
+
const normalized = normalizeAuditLogEntry(input);
|
|
59
|
+
const entry = options.redact
|
|
60
|
+
? options.redact(redactAuditLogEntry(normalized))
|
|
61
|
+
: redactAuditLogEntry(normalized);
|
|
62
|
+
const createId = options.createId ?? defaultCreateAuditLogId;
|
|
63
|
+
|
|
64
|
+
return {
|
|
65
|
+
id: createId(),
|
|
66
|
+
action: entry.action,
|
|
67
|
+
actorType: entry.actor.type,
|
|
68
|
+
actorId: entry.actor.id ?? null,
|
|
69
|
+
actorDisplayName: entry.actor.displayName ?? null,
|
|
70
|
+
tenantId: entry.tenant?.id ?? null,
|
|
71
|
+
tenantSlug: entry.tenant?.slug ?? null,
|
|
72
|
+
resourceType: entry.resource?.type ?? null,
|
|
73
|
+
resourceId: entry.resource?.id ?? null,
|
|
74
|
+
resourceName: entry.resource?.name ?? null,
|
|
75
|
+
outcome: entry.outcome,
|
|
76
|
+
requestId: entry.requestId ?? null,
|
|
77
|
+
traceId: entry.traceId ?? null,
|
|
78
|
+
message: entry.message ?? null,
|
|
79
|
+
metadata: serialize(entry.metadata),
|
|
80
|
+
actorMetadata: serialize(entry.actor.metadata),
|
|
81
|
+
tenantMetadata: serialize(entry.tenant?.metadata),
|
|
82
|
+
resourceMetadata: serialize(entry.resource?.metadata),
|
|
83
|
+
occurredAt: entry.occurredAt.toISOString(),
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
export function createAuditLogInsertQuery(
|
|
88
|
+
table: SQL,
|
|
89
|
+
row: AuditLogSqlRow,
|
|
90
|
+
): SQL {
|
|
91
|
+
return sql`
|
|
92
|
+
insert into ${table} (
|
|
93
|
+
id,
|
|
94
|
+
action,
|
|
95
|
+
actor_type,
|
|
96
|
+
actor_id,
|
|
97
|
+
actor_display_name,
|
|
98
|
+
tenant_id,
|
|
99
|
+
tenant_slug,
|
|
100
|
+
resource_type,
|
|
101
|
+
resource_id,
|
|
102
|
+
resource_name,
|
|
103
|
+
outcome,
|
|
104
|
+
request_id,
|
|
105
|
+
trace_id,
|
|
106
|
+
message,
|
|
107
|
+
metadata,
|
|
108
|
+
actor_metadata,
|
|
109
|
+
tenant_metadata,
|
|
110
|
+
resource_metadata,
|
|
111
|
+
occurred_at
|
|
112
|
+
) values (
|
|
113
|
+
${row.id},
|
|
114
|
+
${row.action},
|
|
115
|
+
${row.actorType},
|
|
116
|
+
${row.actorId},
|
|
117
|
+
${row.actorDisplayName},
|
|
118
|
+
${row.tenantId},
|
|
119
|
+
${row.tenantSlug},
|
|
120
|
+
${row.resourceType},
|
|
121
|
+
${row.resourceId},
|
|
122
|
+
${row.resourceName},
|
|
123
|
+
${row.outcome},
|
|
124
|
+
${row.requestId},
|
|
125
|
+
${row.traceId},
|
|
126
|
+
${row.message},
|
|
127
|
+
${row.metadata},
|
|
128
|
+
${row.actorMetadata},
|
|
129
|
+
${row.tenantMetadata},
|
|
130
|
+
${row.resourceMetadata},
|
|
131
|
+
${row.occurredAt}
|
|
132
|
+
)
|
|
133
|
+
`;
|
|
134
|
+
}
|