Skabelonens kontekst
Når du genererer kode, sender Restorm hele dit design til skabelonen i form
af et ctx-objekt. Dine modeller, dine enums, dine ruter og frem for alt
deres hensigter (searchable, PII, cache, og modellens hele operationelle
profil: volumen, adgangsprofil, trafik, friskhed, følsomhed, opbevaring) er der —
en skabelon læser dem for at afgøre, hvad der skal genereres. Ingen variabel er
nødvendig til det: informationerne, du allerede har indtastet i designet, er
direkte tilgængelige.

Formen på ctx
Section titled “Formen på 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, varsReferencerne foretages via navnet (aldrig via en intern identifikator):
property.enum er enummens navn, property.references.model navnet på den
tilsigtede model, model.inherits forælderens navn. På en model viser
properties[] dens egne egenskaber (til deklarationen af typen) og
allProperties[] de egne + arvede, fladtrykte egenskaber (til en komplet
instans: eksempeldata, SQL-kolonner, forespørgselskrop).
Læs et flag: den gyldne regel
Section titled “Læs et flag: den gyldne regel”De booleske flag er kun til stede i ctx når de er aktiveret. Motoren
renderer i StrictUndefined: man skal derfor teste nøglens tilstedeværelse,
aldrig dens værdi.
{# ✅ 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 %}Kun property.required (boolesk) og route.auth (opregning) er altid til
stede. De andre booleske flag er „til stede = sand”; felterne med værdi
(volumen, operationel profil, cache…) bærer deres værdi, når de er udfyldt, og er
fraværende ellers — samme tilstedeværelsesregel.
| På en egenskab | På en model | På en rute |
|---|---|---|
readOnly · writeOnly · nullable | timestamps · softDelete (booleske) | idempotent · deprecated (booleske) |
unique · searchable · immutable · pii | Operationel profil (værdier): volumetry · accessPattern · traffic · freshness · sensitivity · retention | cacheSeconds (tal) · pagination (objekt) |
Værdierne for en models operationelle profil: 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).
Eksempel: cache data med høj læseefterspørgsel
Section titled “Eksempel: cache data med høj læseefterspørgsel”To tilfælde, alt efter om informationen allerede findes i designet eller ej.
a) Designet bærer allerede informationen
Section titled “a) Designet bærer allerede informationen”Hvis du har udfyldt en cachevarighed på en rute, ankommer den i
route['cacheSeconds']; route['idempotent'] fortæller dig, at den er sikker at
cache (skrivebeskyttet):
{% 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) „Høj læseefterspørgsel” er et indbygget felt på modellen
Section titled “b) „Høj læseefterspørgsel” er et indbygget felt på modellen”Ingen variabel nødvendig: „høj læseefterspørgsel” er direkte modellens
adgangsprofil. I modellens indstillinger, gruppen Operationel profil,
vælger du Læsedominant — skabelonen læser det i model['accessPattern'].
Kombiner det med model['freshness'] (tolerance over for friskhed) for at
afgøre, om der skal caches, og for hvor længe:
{% 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 %}Bemærk testen != 'strong': en læsedominant model men med stærk konsistens
må ikke caches. Det er netop hele pointen med at have de to hensigter side om
side i designet.
Reserver genereringsvariablerne til det, som designet ikke allerede bærer (en skabelon-egen indstilling): forretningshensigterne — volumen, adgangsprofil, trafik, friskhed, følsomhed, opbevaring — er indbyggede felter på modellen.
Det komplette kontrakt
Section titled “Det komplette kontrakt”Denne kontekst er versionsstyret (ctx['contextVersion']) og beskrevet
udtømmende af et JSON-Schema leveret i applikationens repositorium
(docs/contributing/design-codegen-context.schema.json) — kopier det til din
skabelon, så dens CI validerer referencekonteksten. En AI-agent opnår det samme
kontrakt i farten via MCP-værktøjet get_design_template_contract.