@mybuildex/pkg 0.6.1 → 0.7.0

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.
@@ -0,0 +1,595 @@
1
+ "use strict";
2
+ // Auditoria de escrita: quem fez, onde, como era antes e como ficou.
3
+ //
4
+ // Duas peças:
5
+ //
6
+ // 1. Extensão Prisma aplicada pelo createMultitenantPrisma quando a API passa
7
+ // `audit: {api, tables}`: intercepta create/update/upsert/delete e as
8
+ // variantes *Many das tabelas listadas, lê o estado anterior (update/
9
+ // upsert por where único, *Many limitado a maxManyRows) e empilha uma
10
+ // entrada no contexto da request. Leitura nunca é auditada.
11
+ //
12
+ // 2. createAuditPlugin: abre o contexto por request (AsyncLocalStorage, igual
13
+ // ao request-scope) e grava as entradas num único INSERT por schema no
14
+ // onSend — ANTES da resposta sair: no Cloud Run a CPU é cortada depois da
15
+ // resposta, e um insert "depois" poderia nunca acontecer.
16
+ //
17
+ // Sem request (cron, script, timer) ou escrita depois do onSend: a entrada é
18
+ // gravada na hora, com origin SYSTEM quando não há request.
19
+ //
20
+ // Falha ao gravar a auditoria NÃO derruba a escrita (decisão 29/09/2026): log
21
+ // de erro `audit_write_failed` e segue.
22
+ //
23
+ // Limitações conhecidas:
24
+ // - só o model da chamada é auditado (escrita aninhada em relação, não);
25
+ // - dentro de $transaction interativa o "antes" é lido fora da transação;
26
+ // - SQL cru não passa pela extensão: use auditRaw().
27
+ Object.defineProperty(exports, "__esModule", { value: true });
28
+ exports.AUDIT_COLUMNS = exports.AUDIT_WRITE_OPERATIONS = void 0;
29
+ exports.getAuditContext = getAuditContext;
30
+ exports.runInAuditContext = runInAuditContext;
31
+ exports.createAuditQueryHandler = createAuditQueryHandler;
32
+ exports.createAuditExtension = createAuditExtension;
33
+ exports.auditEnabled = auditEnabled;
34
+ exports.withAudit = withAudit;
35
+ exports.auditRaw = auditRaw;
36
+ exports.auditDate = auditDate;
37
+ exports.clearAuditActorCache = clearAuditActorCache;
38
+ exports.resolveAuditActor = resolveAuditActor;
39
+ exports.auditRow = auditRow;
40
+ exports.writeEntries = writeEntries;
41
+ exports.createAuditPlugin = createAuditPlugin;
42
+ exports.createForbiddenThrottle = createForbiddenThrottle;
43
+ const node_async_hooks_1 = require("node:async_hooks");
44
+ const node_crypto_1 = require("node:crypto");
45
+ const serialize_1 = require("./serialize");
46
+ const resolve_1 = require("../tenant/resolve");
47
+ exports.AUDIT_WRITE_OPERATIONS = [
48
+ "create",
49
+ "createMany",
50
+ "createManyAndReturn",
51
+ "update",
52
+ "updateMany",
53
+ "updateManyAndReturn",
54
+ "upsert",
55
+ "delete",
56
+ "deleteMany",
57
+ ];
58
+ const WRITE_SET = new Set(exports.AUDIT_WRITE_OPERATIONS);
59
+ const storage = new node_async_hooks_1.AsyncLocalStorage();
60
+ const IDENT_RE = /^[A-Za-z0-9_]+$/;
61
+ function defaultLogger(event, data) {
62
+ const severity = event.endsWith("failed") ? "ERROR" : event === "http_access" ? "INFO" : "WARNING";
63
+ const line = JSON.stringify({ severity, event, ...data });
64
+ if (severity === "ERROR")
65
+ console.error(line);
66
+ else if (severity === "INFO")
67
+ console.log(line);
68
+ else
69
+ console.warn(line);
70
+ }
71
+ function recordIdOf(...candidates) {
72
+ for (const c of candidates) {
73
+ const id = c?.id;
74
+ if (id !== undefined && id !== null && typeof id !== "object")
75
+ return String(id);
76
+ }
77
+ return null;
78
+ }
79
+ function countOf(result) {
80
+ if (Array.isArray(result))
81
+ return result.length;
82
+ const n = result?.count;
83
+ return typeof n === "number" ? n : null;
84
+ }
85
+ /** Contexto de auditoria da request corrente (undefined fora de request). */
86
+ function getAuditContext() {
87
+ return storage.getStore();
88
+ }
89
+ /** Abre um contexto fora do Fastify (testes, jobs que queiram agrupar escritas). */
90
+ function runInAuditContext(request, fn) {
91
+ return storage.run({ request, requestId: (0, node_crypto_1.randomUUID)(), entries: [], flushed: false }, fn);
92
+ }
93
+ /**
94
+ * Handler `$allOperations` da extensão (exportado para teste). `base` é o
95
+ * client SEM extensão do mesmo schema: lê o "antes" e grava o log.
96
+ */
97
+ function createAuditQueryHandler(base, options) {
98
+ const all = options.tables === "*";
99
+ const tables = new Set(all ? [] : options.tables ?? []);
100
+ const exclude = new Set(options.exclude ?? []);
101
+ const audited = (model) => (all ? !exclude.has(model) : tables.has(model));
102
+ const auditTable = options.table ?? "audit_logs";
103
+ const maxMany = options.maxManyRows ?? 200;
104
+ const log = options.logger ?? defaultLogger;
105
+ if (!IDENT_RE.test(auditTable))
106
+ throw new Error(`audit: nome de tabela inválido: ${auditTable}`);
107
+ const serialize = {
108
+ maskKeys: options.maskKeys,
109
+ maxStringBytes: options.maxStringBytes,
110
+ maxJsonBytes: options.maxJsonBytes,
111
+ };
112
+ return async function auditAllOperations({ model, operation, args, query }) {
113
+ if (!model || !WRITE_SET.has(operation) || !audited(model))
114
+ return query(args);
115
+ const delegate = base[model];
116
+ let before = null;
117
+ try {
118
+ if (operation === "update" || operation === "upsert") {
119
+ before = await delegate.findUnique({ where: args?.where });
120
+ }
121
+ else if (operation === "updateMany" || operation === "updateManyAndReturn" || operation === "deleteMany") {
122
+ before = await delegate.findMany({ where: args?.where, take: maxMany });
123
+ }
124
+ }
125
+ catch (e) {
126
+ log("audit_before_failed", { api: options.api, table: model, operation, error: e?.message ?? String(e) });
127
+ }
128
+ const result = await query(args);
129
+ try {
130
+ let after = null;
131
+ let changed = null;
132
+ let recordId = null;
133
+ let affected = null;
134
+ let op = operation;
135
+ switch (operation) {
136
+ case "create":
137
+ after = result;
138
+ recordId = recordIdOf(result);
139
+ changed = (0, serialize_1.changedFields)(null, result);
140
+ affected = 1;
141
+ break;
142
+ case "update":
143
+ recordId = recordIdOf(result, before, args?.where);
144
+ changed = (0, serialize_1.changedFields)(before, result);
145
+ // só o diff (campos alterados + id), não a linha inteira
146
+ before = before ? (0, serialize_1.onlyChanged)(before, changed) : null;
147
+ after = (0, serialize_1.onlyChanged)(result, changed);
148
+ affected = 1;
149
+ break;
150
+ case "upsert":
151
+ op = before ? "upsert_update" : "upsert_create";
152
+ recordId = recordIdOf(result, before);
153
+ changed = (0, serialize_1.changedFields)(before, result);
154
+ if (before) {
155
+ before = (0, serialize_1.onlyChanged)(before, changed);
156
+ after = (0, serialize_1.onlyChanged)(result, changed);
157
+ }
158
+ else {
159
+ after = result;
160
+ }
161
+ affected = 1;
162
+ break;
163
+ case "delete":
164
+ before = result;
165
+ recordId = recordIdOf(result, args?.where);
166
+ changed = (0, serialize_1.changedFields)(result, null);
167
+ affected = 1;
168
+ break;
169
+ case "createMany":
170
+ after = { data: args?.data };
171
+ affected = countOf(result);
172
+ break;
173
+ case "createManyAndReturn":
174
+ after = result;
175
+ affected = countOf(result);
176
+ break;
177
+ case "updateMany":
178
+ after = { where: args?.where ?? null, data: args?.data ?? null };
179
+ affected = countOf(result);
180
+ break;
181
+ case "updateManyAndReturn":
182
+ after = result;
183
+ affected = countOf(result);
184
+ break;
185
+ case "deleteMany":
186
+ after = { where: args?.where ?? null };
187
+ affected = countOf(result);
188
+ break;
189
+ }
190
+ pushEntry({
191
+ api: options.api,
192
+ schema: base.$schema,
193
+ auditTable,
194
+ client: base,
195
+ createdAt: new Date(),
196
+ tableName: model,
197
+ recordId,
198
+ operation: op,
199
+ before,
200
+ after,
201
+ changed,
202
+ affectedRows: affected,
203
+ serialize,
204
+ log,
205
+ actorLookup: options.actorLookup ?? true,
206
+ actorCacheTtlMs: options.actorCacheTtlMs,
207
+ });
208
+ }
209
+ catch (e) {
210
+ log("audit_capture_failed", { api: options.api, table: model, operation, error: e?.message ?? String(e) });
211
+ }
212
+ return result;
213
+ };
214
+ }
215
+ /** Extensão pronta para `client.$extends(...)`. */
216
+ function createAuditExtension(base, options) {
217
+ return { name: "mybuildex-audit", query: { $allModels: { $allOperations: createAuditQueryHandler(base, options) } } };
218
+ }
219
+ /** A auditoria está ligada? ("*" ou lista não vazia) */
220
+ function auditEnabled(options) {
221
+ return options?.tables === "*" || (Array.isArray(options?.tables) && options.tables.length > 0);
222
+ }
223
+ /** Aplica a extensão preservando o `$schema` do client base. */
224
+ function withAudit(base, options) {
225
+ if (!auditEnabled(options))
226
+ return base;
227
+ const extended = base.$extends(createAuditExtension(base, options));
228
+ if (extended.$schema !== base.$schema) {
229
+ Object.defineProperty(extended, "$schema", { value: base.$schema, configurable: true, enumerable: false });
230
+ }
231
+ return extended;
232
+ }
233
+ /**
234
+ * Registra uma escrita feita por SQL cru (não passa pela extensão). Sem
235
+ * antes/depois: guarda o SQL e os parâmetros.
236
+ */
237
+ async function auditRaw(prisma, input, options = {}) {
238
+ const auditTable = input.auditTable ?? "audit_logs";
239
+ pushEntry({
240
+ api: input.api,
241
+ schema: prisma.$schema,
242
+ auditTable,
243
+ client: prisma,
244
+ createdAt: new Date(),
245
+ tableName: input.table,
246
+ recordId: input.recordId === undefined || input.recordId === null ? null : String(input.recordId),
247
+ operation: `raw_${input.operation}`,
248
+ before: null,
249
+ after: { sql: input.sql, params: input.params ?? [] },
250
+ changed: null,
251
+ affectedRows: input.affectedRows ?? null,
252
+ serialize: options,
253
+ log: options.logger ?? defaultLogger,
254
+ });
255
+ }
256
+ function pushEntry(entry) {
257
+ const ctx = storage.getStore();
258
+ if (ctx && !ctx.flushed) {
259
+ ctx.entries.push(entry);
260
+ return;
261
+ }
262
+ // sem request, ou escrita depois do onSend: grava na hora
263
+ void writeEntries([entry], ctx);
264
+ }
265
+ // ---------------------------------------------------------------- gravação ----
266
+ exports.AUDIT_COLUMNS = [
267
+ "created_at",
268
+ "request_id",
269
+ "api",
270
+ "module",
271
+ "action",
272
+ "acl_entry",
273
+ "http_method",
274
+ "route",
275
+ "url",
276
+ "table_name",
277
+ "record_id",
278
+ "operation",
279
+ "origin",
280
+ "actor_uid",
281
+ "actor_email",
282
+ "actor_name",
283
+ "actor_id_user",
284
+ "actor_id_people",
285
+ "actor_people_name",
286
+ "ip",
287
+ "user_agent",
288
+ "data_before",
289
+ "data_after",
290
+ "changed_fields",
291
+ "affected_rows",
292
+ "status_code",
293
+ "request_failed",
294
+ ];
295
+ /** DATETIME(3) em UTC — o mesmo relógio que o Prisma usa nas colunas de data. */
296
+ function auditDate(d) {
297
+ return d.toISOString().replace("T", " ").replace("Z", "");
298
+ }
299
+ function cut(value, max) {
300
+ if (value === undefined || value === null || value === "")
301
+ return null;
302
+ const s = String(value);
303
+ return s.length > max ? s.slice(0, max) : s;
304
+ }
305
+ function firstIp(request) {
306
+ const fwd = request?.headers?.["x-forwarded-for"];
307
+ const first = typeof fwd === "string" ? fwd.split(",")[0].trim() : undefined;
308
+ return cut(first || request?.ip, 64);
309
+ }
310
+ function defaultOrigin(request) {
311
+ if (!request)
312
+ return "SYSTEM";
313
+ // serviço interno autenticado pelo segredo entre APIs (auth internalAuth)
314
+ if (request.internal === true)
315
+ return "SERVICE";
316
+ return request.user || request.user_id ? "USER" : "ANONYMOUS";
317
+ }
318
+ const DEFAULT_ACTOR_TTL_MS = 10 * 60 * 1000;
319
+ const ACTOR_NOT_FOUND_TTL_MS = 60 * 1000;
320
+ const ACTOR_CACHE_MAX = 5000;
321
+ const actorCache = new Map();
322
+ /** Limpa o cache do autor (testes). */
323
+ function clearAuditActorCache() {
324
+ actorCache.clear();
325
+ }
326
+ /** Autor pelo uid, na base da escola. null quando não acha ou falha (nunca lança). */
327
+ async function resolveAuditActor(client, schema, uid, options = {}) {
328
+ const key = `${schema}\u0000${uid}`;
329
+ const hit = actorCache.get(key);
330
+ if (hit && hit.expMs > Date.now())
331
+ return hit.actor;
332
+ if (typeof client.$queryRawUnsafe !== "function" || !IDENT_RE.test(schema))
333
+ return null;
334
+ try {
335
+ const rows = await client.$queryRawUnsafe(`select u.id as id_user, u.id_people, p.name as people_name ` +
336
+ `from \`${schema}\`.\`users\` u left join \`${schema}\`.\`peoples\` p on p.id = u.id_people ` +
337
+ `where u.firebase_id = ? and u.deleted_at is null order by u.id limit 1`, uid);
338
+ const row = Array.isArray(rows) ? rows[0] : undefined;
339
+ const actor = row
340
+ ? {
341
+ idUser: row.id_user === null || row.id_user === undefined ? null : String(row.id_user),
342
+ idPeople: row.id_people === null || row.id_people === undefined ? null : String(row.id_people),
343
+ peopleName: row.people_name ?? null,
344
+ }
345
+ : null;
346
+ actorCache.set(key, { expMs: Date.now() + (actor ? options.ttlMs ?? DEFAULT_ACTOR_TTL_MS : ACTOR_NOT_FOUND_TTL_MS), actor });
347
+ if (actorCache.size > ACTOR_CACHE_MAX) {
348
+ const it = actorCache.keys();
349
+ for (let i = 0; i < 100 && actorCache.size > ACTOR_CACHE_MAX; i++) {
350
+ const k = it.next().value;
351
+ if (k === undefined)
352
+ break;
353
+ actorCache.delete(k);
354
+ }
355
+ }
356
+ if (!actor)
357
+ options.log?.("audit_actor_not_found", { api: options.api, schema, uid });
358
+ return actor;
359
+ }
360
+ catch (e) {
361
+ // não cacheia a falha: a próxima escrita tenta de novo
362
+ options.log?.("audit_actor_failed", { api: options.api, schema, uid, error: e?.message ?? String(e) });
363
+ return null;
364
+ }
365
+ }
366
+ /** Linha (na ordem de AUDIT_COLUMNS) de uma entrada. Exportado para teste. */
367
+ function auditRow(entry, request, info, actor = null) {
368
+ const acl = request?.routeOptions?.config?.routeAcl;
369
+ const route = request?.routeOptions?.url;
370
+ const statusCode = info.statusCode;
371
+ return [
372
+ auditDate(entry.createdAt),
373
+ info.requestId,
374
+ cut(entry.api, 50),
375
+ cut(acl?.module ?? entry.tableName, 100),
376
+ cut(acl?.action, 50),
377
+ cut(acl?.rule?.anyOf?.length ? acl.rule.anyOf.join(",") : acl?.rule?.kind && acl.rule.kind !== "entries" ? `@${acl.rule.kind}` : null, 255),
378
+ cut(request?.method, 10),
379
+ cut(route, 255),
380
+ cut(request?.url ?? request?.raw?.url, 1000),
381
+ cut(entry.tableName, 100),
382
+ cut(entry.recordId, 100),
383
+ cut(entry.operation, 30),
384
+ info.origin,
385
+ cut(request?.user_id ?? request?.user?.uid, 128),
386
+ cut(request?.user?.email, 255),
387
+ cut(request?.user?.name, 255),
388
+ cut(actor?.idUser, 20),
389
+ cut(actor?.idPeople, 20),
390
+ cut(actor?.peopleName, 255),
391
+ firstIp(request),
392
+ cut(request?.headers?.["user-agent"], 500),
393
+ (0, serialize_1.auditJson)(entry.before, entry.serialize),
394
+ (0, serialize_1.auditJson)(entry.after, entry.serialize),
395
+ entry.changed ? JSON.stringify(entry.changed) : null,
396
+ entry.affectedRows,
397
+ statusCode,
398
+ statusCode !== null && statusCode >= 400 ? 1 : 0,
399
+ ];
400
+ }
401
+ let originResolver;
402
+ /** Grava as entradas: um INSERT por (schema, tabela de destino). Nunca lança. */
403
+ async function writeEntries(entries, ctx, statusCode = null) {
404
+ if (!entries.length)
405
+ return;
406
+ const request = ctx?.request;
407
+ const info = {
408
+ requestId: ctx?.requestId ?? null,
409
+ statusCode,
410
+ origin: (request && originResolver?.(request)) || defaultOrigin(request),
411
+ };
412
+ const groups = new Map();
413
+ for (const e of entries) {
414
+ const key = `${e.schema}\u0000${e.auditTable}`;
415
+ const list = groups.get(key);
416
+ if (list)
417
+ list.push(e);
418
+ else
419
+ groups.set(key, [e]);
420
+ }
421
+ for (const list of groups.values()) {
422
+ const first = list[0];
423
+ try {
424
+ if (!IDENT_RE.test(first.schema) || !IDENT_RE.test(first.auditTable)) {
425
+ throw new Error(`schema/tabela inválidos: ${first.schema}.${first.auditTable}`);
426
+ }
427
+ const placeholders = `(${exports.AUDIT_COLUMNS.map(() => "?").join(",")})`;
428
+ const sql = `insert into \`${first.schema}\`.\`${first.auditTable}\` (${exports.AUDIT_COLUMNS.join(",")}) values ` +
429
+ list.map(() => placeholders).join(",");
430
+ const uid = request?.user_id ?? request?.user?.uid;
431
+ const actor = uid && first.actorLookup
432
+ ? await resolveAuditActor(first.client, first.schema, String(uid), { ttlMs: first.actorCacheTtlMs, log: first.log, api: first.api })
433
+ : null;
434
+ const params = list.flatMap(e => auditRow(e, request, info, actor));
435
+ await first.client.$executeRawUnsafe(sql, ...params);
436
+ }
437
+ catch (e) {
438
+ first.log("audit_write_failed", {
439
+ api: first.api,
440
+ schema: first.schema,
441
+ entries: list.length,
442
+ tables: [...new Set(list.map(x => x.tableName))],
443
+ error: e?.message ?? String(e),
444
+ });
445
+ }
446
+ }
447
+ }
448
+ const INSTALLED = "auditInstalled";
449
+ /**
450
+ * Plugin (função aplicada direto na instância, como os demais do pkg): abre o
451
+ * contexto no onRequest e grava no onSend. Idempotente.
452
+ */
453
+ function createAuditPlugin(options = {}) {
454
+ const log = options.logger ?? defaultLogger;
455
+ const now = options.now ?? Date.now;
456
+ const auditTable = options.table ?? "audit_logs";
457
+ const limit = Math.max(1, options.forbiddenLimitPerMinute ?? 30);
458
+ const throttle = createForbiddenThrottle(limit, now);
459
+ return async function auditPlugin(fastify) {
460
+ if (typeof fastify.hasDecorator === "function" && fastify.hasDecorator(INSTALLED))
461
+ return;
462
+ fastify.decorate(INSTALLED, true);
463
+ if (options.resolveOrigin)
464
+ originResolver = options.resolveOrigin;
465
+ // `done` (não async): o AsyncLocalStorage precisa envolver a
466
+ // continuação do ciclo, igual ao createRequestScopePlugin.
467
+ fastify.addHook("onRequest", (request, _reply, done) => {
468
+ storage.run({ request, requestId: (0, node_crypto_1.randomUUID)(), entries: [], flushed: false, startedAt: now() }, done);
469
+ });
470
+ // Marca o contexto como gravado e devolve a promise da gravação, ou
471
+ // undefined quando não há nada a gravar — o caso de toda leitura, que
472
+ // assim segue síncrona (sem criar tick à toa no GET).
473
+ const flush = (request, reply) => {
474
+ const ctx = storage.getStore();
475
+ if (!ctx || ctx.request !== request || ctx.flushed)
476
+ return undefined;
477
+ ctx.flushed = true;
478
+ if (Number(reply?.statusCode) === 403 && options.auditForbidden !== false) {
479
+ const entry = forbiddenEntry(request, options, auditTable, throttle, log);
480
+ if (entry)
481
+ ctx.entries.push(entry);
482
+ }
483
+ if (options.accessLog !== false) {
484
+ log("http_access", {
485
+ api: options.api,
486
+ method: request.method,
487
+ route: request.routeOptions?.url,
488
+ status: Number(reply?.statusCode) || null,
489
+ uid: request.user_id ?? request.user?.uid ?? null,
490
+ id_school: request.id_school ?? (0, resolve_1.resolveTenantId)(request) ?? null,
491
+ ms: ctx.startedAt !== undefined ? now() - ctx.startedAt : null,
492
+ audited: ctx.entries.length,
493
+ });
494
+ }
495
+ if (!ctx.entries.length)
496
+ return undefined;
497
+ const entries = ctx.entries.splice(0);
498
+ return writeEntries(entries, ctx, Number(reply?.statusCode) || null);
499
+ };
500
+ // Hooks com `done` (não async) pelo mesmo motivo: só espera quando grava.
501
+ fastify.addHook("onSend", (request, reply, payload, done) => {
502
+ const pending = flush(request, reply);
503
+ if (!pending)
504
+ return done(null, payload);
505
+ pending.then(() => done(null, payload), () => done(null, payload));
506
+ });
507
+ // rede de segurança: resposta que não passou pelo onSend (hijack)
508
+ fastify.addHook("onResponse", (request, reply, done) => {
509
+ const pending = flush(request, reply);
510
+ if (!pending)
511
+ return done();
512
+ pending.then(() => done(), () => done());
513
+ });
514
+ };
515
+ }
516
+ function createForbiddenThrottle(limit, now = Date.now) {
517
+ const windows = new Map();
518
+ return {
519
+ hit(key) {
520
+ const t = now();
521
+ let w = windows.get(key);
522
+ let suppressedBefore = 0;
523
+ if (!w || t - w.start >= 60_000) {
524
+ suppressedBefore = w?.suppressed ?? 0;
525
+ w = { start: t, count: 0, suppressed: 0 };
526
+ windows.set(key, w);
527
+ if (windows.size > 10_000) {
528
+ for (const [k, v] of windows)
529
+ if (t - v.start >= 120_000)
530
+ windows.delete(k);
531
+ }
532
+ }
533
+ w.count++;
534
+ if (w.count <= limit)
535
+ return { decision: "record", suppressedBefore };
536
+ if (w.count === limit + 1)
537
+ return { decision: "summary", suppressedBefore };
538
+ w.suppressed++;
539
+ return { decision: "skip", suppressedBefore };
540
+ },
541
+ };
542
+ }
543
+ function forbiddenEntry(request, options, auditTable, throttle, log) {
544
+ // sem escola na URL não há onde gravar (o client default é uma escola real)
545
+ const idSchool = (0, resolve_1.resolveTenantId)(request);
546
+ if (!idSchool)
547
+ return null;
548
+ let client = request.prisma;
549
+ if (!client || Number(request.id_school) !== Number(idSchool) || typeof client.$executeRawUnsafe !== "function") {
550
+ client = options.getTenantClient?.(idSchool);
551
+ }
552
+ if (!client || typeof client.$executeRawUnsafe !== "function" || !IDENT_RE.test(String(client.$schema ?? "")))
553
+ return null;
554
+ const acl = request.routeOptions?.config?.routeAcl;
555
+ const route = request.routeOptions?.url ?? "";
556
+ const uid = request.user_id ?? request.user?.uid;
557
+ const base = request.aclDenied ? "acl_denied" : "forbidden";
558
+ const { decision, suppressedBefore } = throttle.hit(`${client.$schema}|${uid ?? firstIp(request) ?? "?"}|${route}`);
559
+ if (decision === "skip") {
560
+ log("audit_forbidden_throttled", { api: options.api, uid, route, id_school: idSchool });
561
+ return null;
562
+ }
563
+ const after = {
564
+ params: request.params ?? null,
565
+ query: request.query ?? null,
566
+ body: request.body ?? null,
567
+ };
568
+ if (suppressedBefore)
569
+ after.suppressed_previous_minute = suppressedBefore;
570
+ if (decision === "summary") {
571
+ after.throttled = true;
572
+ after.limit_per_minute = options.forbiddenLimitPerMinute ?? 30;
573
+ }
574
+ return {
575
+ api: options.api ?? "unknown",
576
+ schema: String(client.$schema),
577
+ auditTable,
578
+ client,
579
+ createdAt: new Date(),
580
+ tableName: acl?.module ?? "http",
581
+ recordId: request.params?.id === undefined || request.params?.id === null ? null : String(request.params.id),
582
+ operation: decision === "summary" ? `${base}_throttled` : base,
583
+ before: {
584
+ permissions: Array.isArray(request.permissions) ? request.permissions : null,
585
+ permissions_error: !!request.permissions_error,
586
+ },
587
+ after,
588
+ changed: null,
589
+ affectedRows: 0,
590
+ serialize: {},
591
+ log: options.logger ?? defaultLogger,
592
+ actorLookup: true,
593
+ };
594
+ }
595
+ //# sourceMappingURL=audit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audit.js","sourceRoot":"","sources":["../../src/audit/audit.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ /** Chaves mascaradas em qualquer nível (senha, token, segredo, chave privada...). */
2
+ export declare const DEFAULT_MASK_KEYS: RegExp;
3
+ export declare const MASK = "***";
4
+ export interface SerializeOptions {
5
+ /** Regex das chaves mascaradas (default DEFAULT_MASK_KEYS). */
6
+ maskKeys?: RegExp;
7
+ /** Tamanho máximo de uma string, bytes (default 16 KB). */
8
+ maxStringBytes?: number;
9
+ /** Tamanho máximo do JSON final, bytes (default 512 KB). */
10
+ maxJsonBytes?: number;
11
+ }
12
+ /** Valor pronto para JSON.stringify, com máscara e truncamento. */
13
+ export declare function sanitizeForAudit(value: unknown, options?: SerializeOptions, depth?: number): unknown;
14
+ /** JSON da coluna (ou null). Acima do limite, grava só um marcador com o tamanho. */
15
+ export declare function auditJson(value: unknown, options?: SerializeOptions): string | null;
16
+ /** Campos que mudaram entre antes e depois (comparação por valor serializado). */
17
+ export declare function changedFields(before: unknown, after: unknown): string[];
18
+ /** Só os campos alterados (mais o id) — o update grava o diff, não a linha
19
+ * inteira: corta a maior parte do tamanho do audit_logs. */
20
+ export declare function onlyChanged(row: unknown, changed: string[]): unknown;