Přeskočit na obsah

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é.

Záložka Code generation vlastnosti: její příznaky a proměnné čtené šablonou

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, vars

Reference 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).

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 vlastnostiNa modeluNa trase
readOnly · writeOnly · nullabletimestamps · softDelete (booleovské)idempotent · deprecated (booleovské)
unique · searchable · immutable · piiProvozní profil (hodnoty): volumetry · accessPattern · traffic · freshness · sensitivity · retentioncacheSeconds (čí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.

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.

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.