A sablon kontextusa
Amikor kódot generál, a Restorm a teljes tervét átadja a sablonnak egy
ctx objektum formájában. A modelljei, enumjai, útvonalai és mindenekelőtt
a szándékaik (searchable, PII, cache, és a modell teljes működési profilja:
volumen, hozzáférési profil, forgalom, frissesség, érzékenység, megőrzés) ott
vannak — egy sablon olvassa őket, hogy eldöntse, mit generáljon. Ehhez nincs
szükség változóra: az információk, amelyeket már beírt a tervbe, közvetlenül
elérhetők.

A ctx alakja
Section titled “A ctx alakja”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, varsA hivatkozások név szerint történnek (soha nem belső azonosítóval):
property.enum az enum neve, property.references.model a célzott modell neve,
model.inherits a szülő neve. Egy modellen a properties[] felsorolja a
saját tulajdonságait (a típus deklarálásához), és az allProperties[] a
saját + örökölt, kilapított tulajdonságokat (egy teljes példányhoz: példa-
adatok, SQL oszlopok, kéréstörzs).
Egy jelző olvasása: az aranyszabály
Section titled “Egy jelző olvasása: az aranyszabály”A boolean jelzők a ctx-ben csak akkor vannak jelen, ha aktiválva vannak. A
motor StrictUndefined módban renderel: tehát a kulcs jelenlétét kell
tesztelni, soha nem az értékét.
{# ✅ helyes — a jelenlétet teszteljük #}{% if 'searchable' in p %}INDEX({{ p['name'] }}){% endif %}
{# ❌ hibás — hibát vet, ha a jelző hiányzik #}{% if p.searchable %}…{% endif %}Csak a property.required (boolean) és a route.auth (felsorolás) van mindig
jelen. A többi boolean jelző „jelen van = igaz”; az értékkel bíró mezők
(volumen, működési profil, cache…) az értéküket hordozzák, ha ki vannak töltve, és
egyébként hiányoznak — ugyanaz a jelenléti szabály.
| Egy tulajdonságon | Egy modellen | Egy útvonalon |
|---|---|---|
readOnly · writeOnly · nullable | timestamps · softDelete (boolean) | idempotent · deprecated (boolean) |
unique · searchable · immutable · pii | Működési profil (értékek): volumetry · accessPattern · traffic · freshness · sensitivity · retention | cacheSeconds (szám) · pagination (objektum) |
Egy modell működési profiljának értékei: 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).
Példa: az erős olvasási igényű adatok gyorsítótárazása
Section titled “Példa: az erős olvasási igényű adatok gyorsítótárazása”Két eset, aszerint hogy az információ már létezik-e a tervben vagy sem.
a) A terv már hordozza az információt
Section titled “a) A terv már hordozza az információt”Ha megadott egy gyorsítótár-időtartamot egy útvonalon, az a
route['cacheSeconds']-ba érkezik; a route['idempotent'] megmondja, hogy
biztonságosan gyorsítótárazható (csak olvasható):
{% 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) Az „erős olvasási igény” a modell natív mezője
Section titled “b) Az „erős olvasási igény” a modell natív mezője”Nincs szükség változóra: az „erős olvasási igény” közvetlenül a modell
hozzáférési profilja. A modell beállításaiban, a Működési profil
csoportban a Olvasás-domináns-t választja — a sablon a
model['accessPattern']-ből olvassa. Kombinálja a model['freshness']-szel (a
frissesség tűrése), hogy eldöntse, kell-e gyorsítótárazni, és mennyi ideig:
{% 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 }}); // gyorsítótár aktív ({{ ttl }}s){% endif %}{% endfor %}Vegye észre a != 'strong' tesztet: egy olvasás-domináns, de erős
konzisztenciájú modellt nem szabad gyorsítótárazni. Éppen ez az értelme
annak, hogy a két szándék egymás mellett van a tervben.
Tartsa fenn a generálási változókat arra, amit a terv még nem hordoz (egy sablonhoz tartozó beállítás): az üzleti szándékok — volumen, hozzáférési profil, forgalom, frissesség, érzékenység, megőrzés — a modell natív mezői.
A teljes szerződés
Section titled “A teljes szerződés”Ez a kontextus verziókövetett (ctx['contextVersion']), és kimerítően leírja egy
JSON-Schema, amely az alkalmazás tárolójában van szállítva
(docs/contributing/design-codegen-context.schema.json) — másolja be a
sablonjába, hogy a CI-je validálja a referenciakontextust. Egy AI ügynök
ugyanezt a szerződést kapja meg menet közben az get_design_template_contract
MCP eszközön keresztül.