Skip to content

ADR_00011: Povinný audit log pro vybrané domény

Status: Proposed / Accepted
Date: 2025-12-30


Context

Systém obsahuje domény, které pracují s:

  • finančními hodnotami,
  • regulatorně citlivými daty,
  • změnami s právním nebo účetním dopadem,
  • stavem, který musí být zpětně dohledatelný.

V těchto případech není dostačující: - aplikační logování (např. Serilog), - event stream určený pro integraci, - ani běžné historizační tabulky.

Je nutné mít explicitní auditní stopu, která: - je neměnná, - umožňuje dohledat kdo / kdy / co / proč, - je oddělena od doménové logiky, - splňuje požadavky na kontrolu, audit a compliance.

Současně platí, že ne všechny domény audit vyžadují a plošné auditování by vedlo k neúměrné složitosti.


Decision

Audit log je povinný pouze pro vybrané domény

Audit log je povinný pro domény, které:

  • pracují s financemi,
  • ovlivňují účetnictví,
  • podléhají regulatorním požadavkům,
  • nebo mají vysoký business dopad.

Audit není globální vlastností systému, ale explicitním architektonickým rozhodnutím na úrovni domény.


Domény s povinným auditem

Doména Důvod
Pricing Změny cen, slev, pravidel
Payments Platby, refundace, stav transakcí
Accounting Účetní správnost, auditovatelnost
Procurement Nákupy, dodavatelé, nákladové položky
Regulatory / Compliance Legislativní povinnosti
Stock Pohyb zboží, inventarizace

Domény jako Catalog, Basket, Search auditní log nevyžadují.


Charakter auditního logu

Auditní záznam:

  • je append-only (nikdy se nemění),
  • je oddělený od doménového modelu,
  • není zdrojem pravdy pro business logiku,
  • slouží výhradně pro dohledatelnost a kontrolu.

Obsahuje minimálně: - identifikaci entity, - typ operace, - původní a novou hodnotu (pokud relevantní), - identitu aktéra (uživatel / systém), - timestamp, - korelační ID.


4. Technické řešení

  • Audit je vytvářen na aplikační vrstvě
  • Zápis probíhá:
  • synchronně v rámci transakce, nebo
  • asynchronně přes outbox
  • Ukládán do:
  • stejného úložiště jako agregát - SQL pro jednodušší správu transakcí a konzistenci
  • v případě implementace sdílené transakce napříč DBs je možné uvažovat o NoSQL (Mongo)
  • Není realizován:
  • databázovými triggery
  • aplikačními logy
  • event streamem určeným pro integraci

Consequences

Pozitiva

  • Plná auditovatelnost citlivých operací
  • Připravenost na compliance a externí kontroly
  • Jasné oddělení business logiky a auditu
  • Možnost forenzní analýzy
  • Konzistentní přístup napříč doménami

Negativa

  • Vyšší objem ukládaných dat
  • Nutnost řešit retenci a archivaci
  • Vyšší komplexita infrastruktury

Rationale

Rozhodnutí Důvod
Audit jen pro vybrané domény Minimalizace složitosti
Oddělené úložiště Nezatěžuje doménový model
Append-only přístup Auditní integrita
Neřešit auditem business logiku Čisté oddělení odpovědností
Explicitní ADR Transparentní architektonické rozhodnutí