De context van het template
Wanneer u code genereert, geeft Restorm uw hele ontwerp door aan het template
in de vorm van een ctx-object. Uw modellen, uw enums, uw routes en vooral
hun intenties (searchable, PII, cache, en het hele operationele profiel van
het model: volume, toegangsprofiel, verkeer, versheid, gevoeligheid, retentie)
zijn er — een template leest ze om te beslissen wat te genereren. Daar is geen
variabele voor nodig: de informatie die u al in het ontwerp hebt ingevoerd, is
rechtstreeks beschikbaar.

De vorm van ctx
Section titled “De vorm van 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, varsDe referenties gebeuren via de naam (nooit via een interne identificator):
property.enum is de naam van de enum, property.references.model de naam van
het beoogde model, model.inherits de naam van de ouder. Op een model somt
properties[] zijn eigen eigenschappen op (voor de declaratie van het type)
en allProperties[] de eigen + geërfde, afgeplatte eigenschappen (voor een
volledige instantie: voorbeeldgegevens, SQL-kolommen, verzoek-body).
Een vlag lezen: de gulden regel
Section titled “Een vlag lezen: de gulden regel”De booleaanse vlaggen zijn alleen aanwezig in ctx wanneer ze
ingeschakeld zijn. De engine rendert in StrictUndefined: u moet dus de
aanwezigheid van de sleutel testen, nooit zijn waarde.
{# ✅ correct — on teste la présence #}{% if 'searchable' in p %}INDEX({{ p['name'] }}){% endif %}
{# ❌ faux — lève une erreur quand le flag est absent #}{% if p.searchable %}…{% endif %}Alleen property.required (booleaans) en route.auth (enumeratie) zijn
altijd aanwezig. De andere booleaanse vlaggen zijn „aanwezig = waar”; de
velden met waarde (volume, operationeel profiel, cache…) dragen hun waarde
wanneer ze ingevuld zijn, en ontbreken anders — dezelfde aanwezigheidsregel.
| Op een eigenschap | Op een model | Op een route |
|---|---|---|
readOnly · writeOnly · nullable | timestamps · softDelete (booleaans) | idempotent · deprecated (booleaans) |
unique · searchable · immutable · pii | Operationeel profiel (waarden): volumetry · accessPattern · traffic · freshness · sensitivity · retention | cacheSeconds (getal) · pagination (object) |
De waarden van het operationele profiel van een model: 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).
Voorbeeld: gegevens met hoge leesvraag cachen
Section titled “Voorbeeld: gegevens met hoge leesvraag cachen”Twee gevallen, afhankelijk van of de informatie al in het ontwerp bestaat of niet.
a) Het ontwerp draagt de info al
Section titled “a) Het ontwerp draagt de info al”Als u een cacheduur op een route hebt ingevuld, komt die aan in
route['cacheSeconds']; route['idempotent'] vertelt u dat ze veilig te cachen
is (alleen-lezen):
{% 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) „Hoge leesvraag” is een native veld van het model
Section titled “b) „Hoge leesvraag” is een native veld van het model”Geen variabele nodig: „hoge leesvraag” is rechtstreeks het toegangsprofiel
van het model. In de instellingen van het model, groep Operationeel profiel,
kiest u Leesdominant — het template leest het in model['accessPattern'].
Combineer het met model['freshness'] (tolerantie voor versheid) om te beslissen
of er gecachet moet worden, en voor hoe lang:
{% 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 activé ({{ ttl }}s){% endif %}{% endfor %}Merk de test != 'strong' op: een leesdominant model maar met sterke
consistentie mag niet gecachet worden. Dat is precies het nut van de twee
intenties naast elkaar in het ontwerp.
Reserveer de generatievariabelen voor wat het ontwerp niet al draagt (een template-eigen instelling): de bedrijfsintenties — volume, toegangsprofiel, verkeer, versheid, gevoeligheid, retentie — zijn native velden van het model.
Het volledige contract
Section titled “Het volledige contract”Deze context is versiebeheerd (ctx['contextVersion']) en wordt uitputtend
beschreven door een JSON-Schema dat wordt geleverd in de repository van de
applicatie (docs/contributing/design-codegen-context.schema.json) — kopieer het
naar uw template zodat de CI ervan de referentiecontext valideert. Een AI-agent
verkrijgt hetzelfde contract on-the-fly via het MCP-tool
get_design_template_contract.