Kontext šablony
Když generujete kód, Restorm předá celý váš návrh šabloně ve formě objektu
ctx. Vaše modely, enumy, trasy a především jejich záměry (searchable,
PII, cache a celý provozní profil modelu: volumetrie, profil přístupu, provoz,
čerstvost, citlivost, retence) jsou tam — šablona je čte, aby rozhodla, co
vygenerovat. Není k tomu třeba proměnná: informace, které jste již zadali do
návrhu, jsou přímo dostupné.

Tvar ctx
Section titled “Tvar ctx”ctx├─ design # name, version, description, basePath, defaultAuth, vars├─ enums[] # name, description, values[]├─ models[] # name, description, inherits, identifier, timestamps, softDelete,│ # volumetry, accessPattern, traffic, freshness, sensitivity,│ # retention, properties[], allProperties[], examples[], vars└─ groups[] # name, basePath, versionPrefix, headers[], routes[] └─ routes[] # method, path, fullPath, params[], body, responses[], # auth, pagination, cacheSeconds, idempotent, deprecated, varsReference se dělají podle názvu (nikdy podle interního identifikátoru):
property.enum je název enumu, property.references.model název cílového
modelu, model.inherits název rodiče. Na modelu properties[] vyjmenovává
jeho vlastní vlastnosti (pro deklaraci typu) a allProperties[] vlastnosti
vlastní + zděděné, zploštěné (pro kompletní instanci: příkladová data, SQL
sloupce, tělo požadavku).
Čtení příznaku: zlaté pravidlo
Section titled “Čtení příznaku: zlaté pravidlo”Booleovské příznaky jsou v ctx přítomny pouze tehdy, když jsou aktivované.
Engine vykresluje ve StrictUndefined: je tedy třeba testovat přítomnost
klíče, nikdy jeho hodnotu.
{# ✅ správně — testujeme přítomnost #}{% if 'searchable' in p %}INDEX({{ p['name'] }}){% endif %}
{# ❌ chybně — vyvolá chybu, když příznak chybí #}{% if p.searchable %}…{% endif %}Pouze property.required (booleovský) a route.auth (enumerace) jsou vždy
přítomny. Ostatní booleovské příznaky jsou „přítomen = pravda“; pole s
hodnotou (volumetrie, provozní profil, cache…) nesou svou hodnotu, když
jsou vyplněná, a jinak chybí — stejné pravidlo přítomnosti.
| Na vlastnosti | Na modelu | Na trase |
|---|---|---|
readOnly · writeOnly · nullable | timestamps · softDelete (booleovské) | idempotent · deprecated (booleovské) |
unique · searchable · immutable · pii | Provozní profil (hodnoty): volumetry · accessPattern · traffic · freshness · sensitivity · retention | cacheSeconds (číslo) · pagination (objekt) |
Hodnoty provozního profilu modelu: accessPattern
(readHeavy / writeHeavy / balanced / appendOnly), traffic
(low / medium / high), freshness (strong / shortCache / longCache),
sensitivity (public / internal / confidential / pii), retention
(permanent / archivable / ephemeral), volumetry (hundreds /
tenThousands / millions).
Příklad: cachování dat s vysokou poptávkou po čtení
Section titled “Příklad: cachování dat s vysokou poptávkou po čtení”Dva případy podle toho, zda informace v návrhu již existuje, nebo ne.
a) Návrh už nese tuto informaci
Section titled “a) Návrh už nese tuto informaci”Pokud jste na trase vyplnili dobu cachování, přichází v
route['cacheSeconds']; route['idempotent'] vám říká, že je bezpečná pro
cachování (pouze pro čtení):
{% for group in ctx['groups'] %}{% for route in group['routes'] %}{% if 'cacheSeconds' in route and 'idempotent' in route %}// {{ route['method'] }} {{ route['fullPath'] }}app.use("{{ route['fullPath'] }}", cache({{ route['cacheSeconds'] }}));{% endif %}{% endfor %}{% endfor %}b) „Vysoká poptávka po čtení“ je nativní pole modelu
Section titled “b) „Vysoká poptávka po čtení“ je nativní pole modelu”Není třeba proměnná: „vysoká poptávka po čtení“ je přímo profil přístupu
modelu. V nastavení modelu, skupina Provozní profil, zvolíte Převaha čtení — šablona to čte v model['accessPattern']. Zkombinujte to s
model['freshness'] (tolerance čerstvosti), abyste rozhodli, zda cachovat a na
jak dlouho:
{% for model in ctx['models'] %}{% if model['accessPattern'] == 'readHeavy' and model['freshness'] != 'strong' %}{% set ttl = 3600 if model['freshness'] == 'longCache' else 60 %}registerCache("{{ model['name'] }}", {{ ttl }}); // cache aktivována ({{ ttl }}s){% endif %}{% endfor %}Všimněte si testu != 'strong': model s převahou čtení, ale se silnou
konzistencí nesmí být cachován. To je celý smysl mít oba záměry vedle sebe
v návrhu.
Vyhraďte proměnné generování pro to, co návrh ještě nenese (nastavení specifické pro šablonu): obchodní záměry — volumetrie, profil přístupu, provoz, čerstvost, citlivost, retence — jsou nativní pole modelu.
Úplný kontrakt
Section titled “Úplný kontrakt”Tento kontext je verzovaný (ctx['contextVersion']) a vyčerpávajícím způsobem
popsaný JSON-Schematem dodaným v repozitáři aplikace
(docs/contributing/design-codegen-context.schema.json) — zkopírujte ho do své
šablony, aby její CI validovalo referenční kontext. AI agent získá tentýž
kontrakt za běhu prostřednictvím MCP nástroje get_design_template_contract.