From 17996e9347557180af45666f7f9cbe55342ffaa0 Mon Sep 17 00:00:00 2001 From: Danijel Martinek Date: Mon, 11 May 2026 16:11:52 +0200 Subject: [PATCH] feat(core-audit): NoopAuditLog impl Co-Authored-By: Claude Sonnet 4.6 --- .../core-audit/src/noop-audit-log.test.ts | 29 +++++++++++++++++++ packages/core-audit/src/noop-audit-log.ts | 11 +++++++ 2 files changed, 40 insertions(+) create mode 100644 packages/core-audit/src/noop-audit-log.test.ts create mode 100644 packages/core-audit/src/noop-audit-log.ts diff --git a/packages/core-audit/src/noop-audit-log.test.ts b/packages/core-audit/src/noop-audit-log.test.ts new file mode 100644 index 0000000..68cdd69 --- /dev/null +++ b/packages/core-audit/src/noop-audit-log.test.ts @@ -0,0 +1,29 @@ +import { describe, it, expect } from "vitest"; +import { NoopAuditLog } from "./noop-audit-log"; +import type { AuditEntry } from "@repo/core-shared/audit"; + +describe("NoopAuditLog", () => { + const sample: AuditEntry = { + actorId: "user_1", + actorType: "user", + actorRoles: [], + action: "VIEW", + resource: { type: "articles", id: "1" }, + at: new Date(), + scope: { feature: "blog", environment: "test", tenant: "default" }, + from: { ipTruncated: "10.0.0.0", userAgent: "test" }, + containsPii: false, + outcome: "success", + }; + + it("record() is a no-op that does not throw", async () => { + const log = new NoopAuditLog(); + await expect(log.record(sample)).resolves.toBeUndefined(); + }); + + it("eraseSubject() is a no-op that does not throw", async () => { + const log = new NoopAuditLog(); + await expect(log.eraseSubject("user_1", "pseudonymize")).resolves.toBeUndefined(); + await expect(log.eraseSubject("user_1", "delete")).resolves.toBeUndefined(); + }); +}); diff --git a/packages/core-audit/src/noop-audit-log.ts b/packages/core-audit/src/noop-audit-log.ts new file mode 100644 index 0000000..3d9e5b1 --- /dev/null +++ b/packages/core-audit/src/noop-audit-log.ts @@ -0,0 +1,11 @@ +import type { AuditEntry } from "@repo/core-shared/audit"; +import type { IAuditLog } from "./audit-log.interface"; + +export class NoopAuditLog implements IAuditLog { + async record(_entry: AuditEntry): Promise { + // intentional no-op + } + async eraseSubject(_actorId: string, _mode: "pseudonymize" | "delete"): Promise { + // intentional no-op + } +}