Ga naar inhoud

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.

Het tabblad Code generation van een eigenschap: haar vlaggen en haar door het template gelezen variabelen

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

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

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 eigenschapOp een modelOp een route
readOnly · writeOnly · nullabletimestamps · softDelete (booleaans)idempotent · deprecated (booleaans)
unique · searchable · immutable · piiOperationeel profiel (waarden): volumetry · accessPattern · traffic · freshness · sensitivity · retentioncacheSeconds (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.

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.

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.