Tovább a tartalomhoz

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.

Egy tulajdonság Code generation lapja: a jelzői és a sablon által olvasott változói

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

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

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ágonEgy modellenEgy útvonalon
readOnly · writeOnly · nullabletimestamps · softDelete (boolean)idempotent · deprecated (boolean)
unique · searchable · immutable · piiMűködési profil (értékek): volumetry · accessPattern · traffic · freshness · sensitivity · retentioncacheSeconds (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.

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.

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.