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ľkaPopisKľúčové polia
ObligationJedna konkrétna zákonná povinnosť. ~523 záznamov v seede.origId, title, type, status, deadlineDate, validFrom
StatuteZákon, vyhláška alebo nariadenie z ktorého povinnosť pochádza.code (napr. 250/2012 Z. z.), title, urlSlovLex
AuthorizationZáznam o autorizácii obsahu advokátskou kanceláriou.authorizedAt, authorizedBy (JUDr. ...), reviewNotes
ChangeProposalDetegovaný návrh zmeny zo scrapera, čaká na manuálne schválenie.sourceUrl, sourceType, priority, status, aiProposal (Json)
AuthorityInštitúcia (ÚRSO, OKTE, MH SR, ŠVPS, MŽP).code, name, urlOfficial
CommodityKomodita (electricity, gas, heat, water, oil).code, name, slug
ActivityDruh činnosti (výroba, distribúcia, dodávka, OZE, agregácia).name, slug

2. Vzťahy (M:N)

  • Obligation ↔ Statute cez ObligationStatute join table (jedna povinnosť môže byť v 1-N predpisoch).
  • Obligation ↔ Authority, Commodity, Activity, Region — Prisma implicit M:N cez _ObligationToX tables.
  • ObligationVersion — historický snapshot povinnosti pri každej zmene. Diff oproti predošlej verzii v changeSummary JSON.

3. Audit & integrity

Tabuľka AuditLog zaznamenáva každú akciu s hash-chained integrity:

  • prevHash — hash predchádzajúceho záznamu
  • currHash — 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.