Siirry sisältöön

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ä.

Ominaisuuden Code generation -välilehti: sen liput ja mallin lukemat muuttujat

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

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

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ö.

OminaisuudessaMallissaReitillä
readOnly · writeOnly · nullabletimestamps · softDelete (boolean)idempotent · deprecated (boolean)
unique · searchable · immutable · piiOperatiivinen profiili (arvot): volumetry · accessPattern · traffic · freshness · sensitivity · retentioncacheSeconds (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.

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ä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.