Gå til indhold

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.

Fanen Code generation for en egenskab: dens flag og dens variabler læst af skabelonen

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

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

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 egenskabPå en modelPå en rute
readOnly · writeOnly · nullabletimestamps · softDelete (booleske)idempotent · deprecated (booleske)
unique · searchable · immutable · piiOperationel profil (værdier): volumetry · accessPattern · traffic · freshness · sensitivity · retentioncacheSeconds (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.

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.

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.