Mallin konteksti
Kun generoit koodia, Restorm välittää koko suunnitelmasi mallille
ctx-objektina. Mallisi, enumisi, reittisi ja ennen kaikkea niiden
aikeet (searchable, PII, cache, ja mallin koko operatiivinen profiili: volyymi,
käyttöprofiili, liikenne, tuoreus, herkkyys, säilytys) ovat siellä — malli lukee
ne päättääkseen, mitä generoida. Siihen ei tarvita muuttujaa: tiedot, jotka olet
jo syöttänyt suunnitelmaan, ovat suoraan käytettävissä.

ctx:n muoto
Section titled “ctx:n muoto”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, varsViittaukset tehdään nimellä (ei koskaan sisäisellä tunnisteella):
property.enum on enumin nimi, property.references.model kohdemallin nimi,
model.inherits vanhemman nimi. Mallissa properties[] listaa sen omat
ominaisuudet (tyypin määrittelyä varten) ja allProperties[] omat + perityt,
litistetyt ominaisuudet (täydellistä instanssia varten: esimerkkidata,
SQL-sarakkeet, pyynnön runko).
Lipun lukeminen: kultainen sääntö
Section titled “Lipun lukeminen: kultainen sääntö”Boolean-liput ovat ctx:ssä läsnä vain kun ne ovat käytössä. Moottori
renderöi StrictUndefined-tilassa: on siis testattava avaimen läsnäoloa, ei
koskaan sen arvoa.
{# ✅ oikein — testataan läsnäoloa #}{% if 'searchable' in p %}INDEX({{ p['name'] }}){% endif %}
{# ❌ väärin — nostaa virheen, kun lippu puuttuu #}{% if p.searchable %}…{% endif %}Vain property.required (boolean) ja route.auth (enumeraatio) ovat aina
läsnä. Muut boolean-liput ovat »läsnä = tosi»; arvolliset kentät (volyymi,
operatiivinen profiili, cache…) kantavat arvonsa, kun ne on täytetty, ja
puuttuvat muutoin — sama läsnäolosääntö.
| Ominaisuudessa | Mallissa | Reitillä |
|---|---|---|
readOnly · writeOnly · nullable | timestamps · softDelete (boolean) | idempotent · deprecated (boolean) |
unique · searchable · immutable · pii | Operatiivinen profiili (arvot): volumetry · accessPattern · traffic · freshness · sensitivity · retention | cacheSeconds (luku) · pagination (objekti) |
Mallin operatiivisen profiilin arvot: 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).
Esimerkki: paljon luettavan datan välimuistittaminen
Section titled “Esimerkki: paljon luettavan datan välimuistittaminen”Kaksi tapausta sen mukaan, onko tieto jo suunnitelmassa vai ei.
a) Suunnitelma kantaa jo tiedon
Section titled “a) Suunnitelma kantaa jo tiedon”Jos olet täyttänyt reitille välimuistin keston, se saapuu kohtaan
route['cacheSeconds']; route['idempotent'] kertoo, että se on turvallinen
välimuistittaa (vain luku):
{% 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) »Paljon luettava» on mallin natiivikenttä
Section titled “b) »Paljon luettava» on mallin natiivikenttä”Muuttujaa ei tarvita: »paljon luettava» on suoraan mallin käyttöprofiili.
Mallin asetuksissa, ryhmässä Operatiivinen profiili, valitset Lukupainotettu
— malli lukee sen kohdasta model['accessPattern']. Yhdistä se kohtaan
model['freshness'] (tuoreuden sietokyky) päättääksesi, pitääkö
välimuistittaa ja kuinka pitkäksi aikaa:
{% 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 }}); // välimuisti käytössä ({{ ttl }}s){% endif %}{% endfor %}Huomaa testi != 'strong': lukupainotettua mutta vahvasti johdonmukaista
mallia ei pidä välimuistittaa. Juuri siinä on koko idea, kun molemmat aikeet ovat
vierekkäin suunnitelmassa.
Varaa generoinnin muuttujat sille, mitä suunnitelma ei jo kanna (malliin kuuluva asetus): liiketoiminnan aikeet — volyymi, käyttöprofiili, liikenne, tuoreus, herkkyys, säilytys — ovat mallin natiivikenttiä.
Täydellinen sopimus
Section titled “Täydellinen sopimus”Tämä konteksti on versionoitu (ctx['contextVersion']) ja kuvattu
tyhjentävästi sovelluksen repositoryssa toimitetulla JSON-Schemalla
(docs/contributing/design-codegen-context.schema.json) — kopioi se malliisi,
jotta sen CI validoi referenssikontekstin. Tekoälyagentti saa saman sopimuksen
lennossa MCP-työkalulla get_design_template_contract.