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.

Oblik ctx
Section titled “Oblik ctx”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, varsReference 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).
Čitanje zastavice: zlatno pravilo
Section titled “Čitanje zastavice: zlatno pravilo”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 svojstvu | Na modelu | Na ruti |
|---|---|---|
readOnly · writeOnly · nullable | timestamps · softDelete (bulove) | idempotent · deprecated (bulove) |
unique · searchable · immutable · pii | Operativni profil (vrednosti): volumetry · accessPattern · traffic · freshness · sensitivity · retention | cacheSeconds (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.
a) Dizajn već nosi tu informaciju
Section titled “a) Dizajn već nosi tu informaciju”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.
Potpuni ugovor
Section titled “Potpuni ugovor”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.