Aller au contenu

Kontekst šablona

Kada generišete kod, Restorm prosleđuje ceo vaš dizajn šablonu u obliku objekta ctx. Vaši modeli, enumi, rute i pre svega njihove namere (searchable, PII, keš i ceo operativni profil modela: volumetrija, profil pristupa, saobraćaj, svežina, osetljivost, zadržavanje) su tamo — šablon ih čita kako bi odlučio šta da generiše. Za to nije potrebna promenljiva: informacije koje ste već uneli u dizajn direktno su dostupne.

Kartica Code generation svojstva: njegove zastavice i promenljive koje čita šablon

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

Reference se prave po nazivu (nikada po internom identifikatoru): property.enum je naziv enuma, property.references.model naziv ciljanog modela, model.inherits naziv roditelja. Na modelu properties[] navodi njegova sopstvena svojstva (za deklaraciju tipa), a allProperties[] svojstva sopstvena + nasleđena, spljoštena (za potpunu instancu: podaci primera, SQL kolone, telo zahteva).

Bulove zastavice prisutne su u ctx samo kada su aktivirane. Endžin iscrtava u StrictUndefined: stoga je potrebno testirati prisustvo ključa, nikada njegovu vrednost.

{# ✅ ispravno — testiramo prisustvo #}
{% if 'searchable' in p %}INDEX({{ p['name'] }}){% endif %}
{# ❌ pogrešno — baca grešku kada zastavica nedostaje #}
{% if p.searchable %}…{% endif %}

Samo su property.required (bulova) i route.auth (enumeracija) uvek prisutne. Ostale bulove zastavice su „prisutno = tačno“; polja sa vrednošću (volumetrija, operativni profil, keš…) nose svoju vrednost kada su popunjena, a inače nedostaju — isto pravilo prisustva.

Na svojstvuNa modeluNa ruti
readOnly · writeOnly · nullabletimestamps · softDelete (bulove)idempotent · deprecated (bulove)
unique · searchable · immutable · piiOperativni profil (vrednosti): volumetry · accessPattern · traffic · freshness · sensitivity · retentioncacheSeconds (broj) · pagination (objekat)

Vrednosti operativnog profila modela: 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).

Primer: keširanje podataka sa velikom potražnjom za čitanjem

Section titled “Primer: keširanje podataka sa velikom potražnjom za čitanjem”

Dva slučaja, u zavisnosti od toga da li informacija već postoji u dizajnu ili ne.

Ako ste na ruti popunili trajanje keša, ono stiže u route['cacheSeconds']; route['idempotent'] vam govori da je bezbedno za keširanje (samo za čitanje):

{% 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) „Velika potražnja za čitanjem“ je nativno polje modela

Section titled “b) „Velika potražnja za čitanjem“ je nativno polje modela”

Nije potrebna promenljiva: „velika potražnja za čitanjem“ direktno je profil pristupa modela. U podešavanjima modela, grupa Operativni profil, birate Dominacija čitanja — šablon to čita u model['accessPattern']. Kombinujte to sa model['freshness'] (tolerancija na svežinu) kako biste odlučili da li da kešite i na koliko dugo:

{% 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 }}); // keš aktiviran ({{ ttl }}s)
{% endif %}
{% endfor %}

Primetite test != 'strong': model sa dominacijom čitanja, ali sa jakom konzistentnošću ne sme da se kešira. To je cela svrha imati obe namere jednu uz drugu u dizajnu.

Rezervišite promenljive generisanja za ono što dizajn već ne nosi (podešavanje specifično za šablon): poslovne namere — volumetrija, profil pristupa, saobraćaj, svežina, osetljivost, zadržavanje — su nativna polja modela.

Ovaj kontekst je verzionisan (ctx['contextVersion']) i iscrpno opisan JSON-Schemom isporučenom u repozitorijumu aplikacije (docs/contributing/design-codegen-context.schema.json) — kopirajte ga u svoj šablon kako bi njegov CI validirao referentni kontekst. AI agent dobija isti ugovor u hodu putem MCP alata get_design_template_contract.