Hoppa till innehåll

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.

Fliken Code generation för en egenskap: dess flaggor och dess variabler lästa av mallen

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

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

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 egenskapPå en modellPå en rutt
readOnly · writeOnly · nullabletimestamps · softDelete (booleska)idempotent · deprecated (booleska)
unique · searchable · immutable · piiOperativ profil (värden): volumetry · accessPattern · traffic · freshness · sensitivity · retentioncacheSeconds (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.

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.

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.