Mallens kontext
När du genererar kod skickar Restorm hela din design till mallen i form av
ett ctx-objekt. Dina modeller, dina enumar, dina rutter och framför allt
deras avsikter (searchable, PII, cache, och modellens hela operativa profil:
volym, åtkomstprofil, trafik, färskhet, känslighet, kvarhållning) finns där — en
mall läser dem för att avgöra vad som ska genereras. Ingen variabel behövs för
det: informationen som du redan har matat in i designen är direkt tillgänglig.

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, varsReferenserna görs via namnet (aldrig via en intern identifierare):
property.enum är enumens namn, property.references.model namnet på den avsedda
modellen, model.inherits förälderns namn. På en modell listar properties[]
dess egna egenskaper (för typdeklarationen) och allProperties[] de egna +
ärvda, tillplattade egenskaperna (för en komplett instans: exempeldata,
SQL-kolumner, förfrågningskropp).
Läsa en flagga: den gyllene regeln
Section titled “Läsa en flagga: den gyllene regeln”De booleska flaggorna finns i ctx endast när de är aktiverade. Motorn
renderar i StrictUndefined: man måste alltså testa nyckelns närvaro,
aldrig dess värde.
{# ✅ 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 %}Endast property.required (boolesk) och route.auth (uppräkning) är alltid
närvarande. De andra booleska flaggorna är ”närvarande = sann”; fälten med
värde (volym, operativ profil, cache…) bär sitt värde när de är ifyllda, och
saknas annars — samma närvaroregel.
| På en egenskap | På en modell | På en rutt |
|---|---|---|
readOnly · writeOnly · nullable | timestamps · softDelete (booleska) | idempotent · deprecated (booleska) |
unique · searchable · immutable · pii | Operativ profil (värden): volumetry · accessPattern · traffic · freshness · sensitivity · retention | cacheSeconds (tal) · pagination (objekt) |
Värdena för en modells operativa 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).
Exempel: cacha data med hög läsefterfrågan
Section titled “Exempel: cacha data med hög läsefterfrågan”Två fall, beroende på om informationen redan finns i designen eller inte.
a) Designen bär redan informationen
Section titled “a) Designen bär redan informationen”Om du har fyllt i en cachevaraktighet på en rutt anländer den i
route['cacheSeconds']; route['idempotent'] talar om för dig att den är säker
att cacha (skrivskyddad):
{% 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ög läsefterfrågan” är ett inbyggt fält på modellen
Section titled “b) ”Hög läsefterfrågan” är ett inbyggt fält på modellen”Ingen variabel behövs: ”hög läsefterfrågan” är direkt modellens
åtkomstprofil. I modellens inställningar, gruppen Operativ profil, väljer
du Läsdominant — mallen läser det i model['accessPattern']. Kombinera det med
model['freshness'] (tolerans mot färskhet) för att avgöra om det ska cachas,
och för hur 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 %}Notera testet != 'strong': en läsdominant modell men med stark konsistens
ska inte cachas. Det är just hela poängen med att ha de två avsikterna sida
vid sida i designen.
Reservera genereringsvariablerna för det som designen inte redan bär (en mall-egen inställning): affärsavsikterna — volym, åtkomstprofil, trafik, färskhet, känslighet, kvarhållning — är inbyggda fält på modellen.
Det fullständiga kontraktet
Section titled “Det fullständiga kontraktet”Denna kontext är versionshanterad (ctx['contextVersion']) och beskrivs
uttömmande av ett JSON-Schema som levereras i applikationens repositorium
(docs/contributing/design-codegen-context.schema.json) — kopiera det till din
mall så att dess CI validerar referenskontexten. En AI-agent erhåller samma
kontrakt i farten via MCP-verktyget get_design_template_contract.