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í |