Routes a API

Aplikace má čtyři vrstvy routes:

  1. Veřejné — server-rendered HTML, fallback catch-all.
  2. Admin SPA — Vue 3 SPA z embedovaných assetů.
  3. JSON API /api/* — vše, čím SPA komunikuje se serverem.
  4. OAuth2 + MCP — strojový přístup pro Claude a další klienty.

Veřejné routes

PathMetodaPopis
/files/{hash}GETPlný soubor (content-addressed, cache-friendly)
/files/{hash}/nahledGETThumbnail
/tag/{name}GETStránky s daným tagem
/search?q=…GETFulltextové vyhledávání
/sitemap.xmlGETSitemap
/static/{*path}GETNamespaced statické assety (assets/<NAMESPACE>/{css,js,img})
/{*path}GETCatch-all — viz níže

Catch-all logika

GET /{*path}
  1. match v menus  → render menu markdown (skip pokud private a host nepřihlášen)
  2. match v pages  → render stránky    (skip pokud private a host nepřihlášen)
  3. → 404

Admin SPA

PathMetodaPopis
/adminGETVstup do SPA — vrací index.html
/admin/{*path}GETStatické soubory z client/dist/ přes rust-embed; chybějící cesty → fallback na index.html (deep linky pro Vue Router)

SPA pokrývá: stránky, tagy, soubory, galerie, menu, tokeny, AI assistant chat, LLM providery a modely, vlastní MCP servery, tool permissions.

JSON API /api/*

Vyžaduje session cookie site_session (HTTP-only, Lax, 24 h). Middleware require_login_api vrací 401 JSON, pokud chybí.

SkupinaRoutes
authPOST /api/auth/login, POST /api/auth/logout, GET /api/auth/me
pagesCRUD (GET, POST, GET/:id, PUT/:id, DELETE/:id); GET /api/pages/paths; POST /api/pages/:id/revisions/:rev_id/restore
tagsCRUD
filesCRUD; POST je multipart upload (limit 50 MB)
galleriesCRUD; GET /api/galleries/paths
menuCRUD
tokensGET, POST, DELETE/:id (správa service tokenů)
markdownPOST /api/markdown/render (markdown → HTML s expanzí direktiv)
pathsPOST /api/paths/children (enumerace složek + obsah)
assistantChat sessions, zprávy, streaming odpovědí (viz about/blog/ai)
llmGET/POST /api/llm/providers, GET/POST /api/llm/models (CRUD)
tool-permissionsCRUD pravidel pro AI nástroje

OAuth2 + MCP

PathMetodaPopis
POST /mcpPOSTMCP JSON-RPC 2.0 endpoint (Bearer auth)
POST /oauth/registerPOSTRFC 7591 dynamic client registration
GET /oauth/authorizeGETLogin + consent stránka
POST /oauth/authorizePOSTVystaví auth code (10 min, PKCE)
POST /oauth/tokenPOSTgrant_type=authorization_code (PKCE verify) nebo refresh_token
GET /.well-known/oauth-authorization-serverGETServer metadata
GET /.well-known/oauth-protected-resourceGETOznačuje /mcp jako chráněný resource

Auth flow

KlientMechanismus
Vue admin SPAPOST /api/auth/login → server nastaví cookie site_session (HTTP-only, Lax, 24 h)
Service skript / starý MCP klientService token z /admin/tokenyAuthorization: Bearer <token>
Claude Desktop / Claude.aiOAuth2 PKCE flow → access_token (1 h) + refresh_token (bez expirace) → Authorization: Bearer <access_token>

Hesla hashována Argon2 (src/auth.rs). MCP handler odvozuje user_id z bearer tokenu pro audit pole (created_by, modified_by).