Dokumentácia
Dátový model
Posledná aktualizácia: 15. januára 2026
Postgres 17 schéma s ~25 tabuľkami. Hlavné entity: Obligation (povinnosť), Statute (zákon/vyhláška), ChangeProposal (návrh zmeny), Authorization (autorizácia obsahu advokátom). M:N cez join tables s typovým indexom.
1. Hlavné entity
| Tabuľka | Popis | Kľúčové polia |
|---|---|---|
Obligation | Jedna konkrétna zákonná povinnosť. ~523 záznamov v seede. | origId, title, type, status, deadlineDate, validFrom |
Statute | Zákon, vyhláška alebo nariadenie z ktorého povinnosť pochádza. | code (napr. 250/2012 Z. z.), title, urlSlovLex |
Authorization | Záznam o autorizácii obsahu advokátskou kanceláriou. | authorizedAt, authorizedBy (JUDr. ...), reviewNotes |
ChangeProposal | Detegovaný návrh zmeny zo scrapera, čaká na manuálne schválenie. | sourceUrl, sourceType, priority, status, aiProposal (Json) |
Authority | Inštitúcia (ÚRSO, OKTE, MH SR, ŠVPS, MŽP). | code, name, urlOfficial |
Commodity | Komodita (electricity, gas, heat, water, oil). | code, name, slug |
Activity | Druh činnosti (výroba, distribúcia, dodávka, OZE, agregácia). | name, slug |
2. Vzťahy (M:N)
- Obligation ↔ Statute cez
ObligationStatutejoin table (jedna povinnosť môže byť v 1-N predpisoch). - Obligation ↔ Authority,
Commodity,Activity,Region— Prisma implicit M:N cez_ObligationToXtables. - ObligationVersion — historický snapshot povinnosti pri každej zmene. Diff oproti predošlej verzii v
changeSummaryJSON.
3. Audit & integrity
Tabuľka AuditLog zaznamenáva každú akciu s hash-chained integrity:
prevHash— hash predchádzajúceho záznamucurrHash— sha256(canonicalize(payload) + prevHash)- Verifikácia spätne detekuje akúkoľvek manipuláciu s payload-om.
Webhook deliveries (WebhookDelivery) si tiež držia HMAC SHA-256 podpis a status (PENDING / DELIVERED / FAILED / DEAD_LETTER) pre debugging.
4. Full-text search
Obligation.search_vector je generated tsvector stĺpec (Postgres native FTS) s GIN indexom. Slovenský unaccent wrapper clg_unaccent() robí FTS diakritika-insensitívnym. Príklad query:
SELECT id, title, ts_rank(search_vector, query) AS rank
FROM obligation, websearch_to_tsquery('simple', clg_unaccent('elektrina')) AS query
WHERE search_vector @@ query
AND status = 'PUBLISHED'
ORDER BY rank DESC
LIMIT 50;5. Migrácie a verzionovanie
Schema je verzionovaná cez Prisma migrations v packages/db/prisma/migrations/. Každá migrácia má timestamp prefix a SHA stable name. prisma migrate deploy v CI proti production DB; prisma migrate dev iba lokálne.
6. Backup & restore
Production používa Postgres 17 logical backups každú hodinu (pg_dump compressed) a fyzické WAL streaming na hot-standby. Off-site backup do Hetzner Storage Box encrypted cez restic, denne 03:30 UTC. Retention 7 dní / 4 týždne / 6 mesiacov / 2 roky.