Datový model

Databáze je PostgreSQL, přístup přes SeaORM. Migrace m_001m_022 v src/migration/ běží automaticky při startu serveru.

Uživatelé a auth

users

SloupecTypPopis
idPK
usernameuniquePřihlašovací jméno
password_hashtextArgon2 hash

tokens

SloupecTypPopis
idPK
nonceuniqueHodnota tokenu
user_idFK → usersVlastník
expires_attimestamp?NULL = bez expirace
labeltext?Lidský popis (u service tokenů)
is_serviceboolfalse = session cookie (24 h), true = service token (manuální správa)

oauth_clients

RFC 7591 — dynamicky registrovaní OAuth klienti.

SloupecTypPopis
idPK
client_iduniqueIdentifikátor klienta
client_secrettext?Volitelné (PKCE-only klienti ho nemají)
client_nametextDisplay name
redirect_urisJSONSeznam povolených redirect URI

oauth_codes

Krátkodobé authorization codes (10 min, PKCE).

SloupecTypPopis
idPK
codeuniqueAuth code
client_idtext
user_idFK → users
redirect_uritext
code_challengetextSHA-256 PKCE challenge
expires_attimestamp
usedboolOne-time use

oauth_tokens

Access (1 h) + refresh (bez expirace) tokeny.

SloupecTypPopis
idPK
access_tokenuniqueBearer pro /mcp a další chráněné API
refresh_tokenuniquePro grant_type=refresh_token
client_id, user_id
expires_attimestampPouze pro access
revokedbool

Obsah

pages

SloupecTypPopis
idPK
pathuniqueURL cesta (např. about/blog)
summarytext?Krátký popis
markdowntextObsah stránky
tag_idsINT[]Pole tagů
privateboolSkrytá pro nepřihlášené
created_at/by, modified_at/byAudit

Migrace m_022 přidává fulltext index nad path + markdown (accent-insensitive) — pohání search_pages MCP tool i /search.

page_revisions

SloupecTypPopis
idPK
page_idFK → pages
seqintPořadí revize v rámci stránky
prev_markdowntextStav před změnou
difftextDiff (knihovna diffy)
created_at/byAudit

tags

SloupecTypPopis
idPK
nameuniqueNázev tagu
descriptiontext?Popis

menus

Statický obsah pro top-level cesty (např. /about, /blog, /partie).

SloupecTypPopis
idPK
pathuniqueURL cesta
markdowntextObsah
privateboolSkrytá pro nepřihlášené (od m_008)

Soubory a galerie

Starý systém images + gallery_images byl v m_010 nahrazen content-addressed schématem (deduplikace přes SHA-256).

files

Metadata souboru.

SloupecTypPopis
idPK
pathuniqueIdentifikátor / název (přidáno v m_017)
hashtextSHA-256 obsahu (FK → file_blobs.hash)
mimetypetextNapř. image/png
size_bytesint
descriptiontext?
created_at/byAudit

file_blobs

Obsah souboru, deduplikovaný hashem.

SloupecTypPopis
hashPKSHA-256
databyteaBinární obsah
size_bytesint
created_at

file_thumbnails

Automaticky generované náhledy obrázků (knihovna image).

SloupecTypPopis
file_idPK / FK → files
hashtextHash náhledu
width, heightint
mimetypetext

galleries

SloupecTypPopis
idPK
pathunique(přidáno v m_020)
titletext
descriptiontext?
file_idsINT[]Seznam ID souborů, v pořadí zobrazení
created_at/byAudit

AI assistant

Detail v about/blog/ai.

llm_providers

SloupecTypPopis
idPK
labeltextLidský název
kindenumanthropic, ollama, gemini
api_keytext?Pokud poskytovatel vyžaduje
base_urltext?Pro self-hosted endpointy

llm_models

Po m_015 rozdělené z původní llm_providers.

SloupecTypPopis
idPK
provider_idFK → llm_providers
labeltextLidský název
modeltextWire ID (např. claude-opus-4-7)
is_defaultbool

assistant_sessions

SloupecTypPopis
idPK
user_idFK → users
titletext
provider, modeltextSnapshoty pro audit
model_idFK → llm_models?
enabled_mcp_server_idsJSONBPole ID, které MCP servery jsou v session aktivní (od m_018)
created_at, updated_at

assistant_messages

SloupecTypPopis
idPK
session_idFK → assistant_sessions
seqintPořadí v session
roleenumuser, assistant (případně tool)
contentJSONMulti-modální obsah (text, tool calls, results)
created_at

user_mcp_servers

Externí MCP servery, které si uživatel přidá do své AI session.

SloupecTypPopis
idPK
user_idFK → users
nametext
urltextHTTP MCP endpoint
enabledbool
forward_user_tokenboolPředávat session token do MCP serveru
headersJSONVlastní hlavičky (např. Authorization)

tool_permissions

Pravidla pro povolení/zákaz volání nástrojů AI assistentem.

SloupecTypPopis
idPK
user_idFK → users
nametextPattern (wildcard) jména nástroje
effectenumallow, deny, prompt
priorityintVyšší = vyhodnoceno dřív