refactor(store): drop Template from services, add StoreResponse
Services now return data (notify-structure) instead of rendered HTML.
StoreResponse::restContent() is the single exit point that renders
notify_message.tpl and delegates to Template::restContent.
- StorePurchaseService: no Template, uses session->get() for cid/id
- StoreAdminDeleteService: no Template, returns notify
- StoreResponse: shared view helper for Store JSON responses
- store.php: 851 lines, HTTP-only
feat(console): add app:lint:container command
Compile DI container before deploy to catch autowiring errors.
ContainerFactory::lint() reuses createBuilder() without dumping
or writing cache files.
refactor(store): extract image picker from controller
Move scandir + tmbs filtering from imageSelect branch into
StoreImagePicker. Controller keeps only HTTP: assigns tmbs
and calls modal.
refactor(store): extract model layer from store.php
Move data preparation out of the controller into dedicated
classes: StoreProductFormData (insert branch), StoreProductForm
(add/edit modal), StorePackageView (package modal),
StoreCatalogView (index/server/category).
Also fixes:
- item='all' discount now matches in server/group badges
- number_format on string money/price (PHP 8.5 strictness)
test(store): cover PurchaseResolver::resolve()
Inject RandomItemPicker via constructor. Add 12 unit tests
for product/set/switch/roulette branches and DTO contract.
refactor(store): move localization to Smarty helpers
- Replace $LANGUAGE->t() and $config->get() assigns with {'KEY'|t}
and {'cfg'|cfg} in all store templates
- Drop dead assigns and hardcoded strings
- Restore steam fallback in SteamForm::render
- Assign meta description/keywords on store index
refactor(store): extract read-side into query classes
Move inline SELECTs from store.php into StoreGroupQuery,
StoreProductQuery, StoreItemQuery. Add StoreServerCommand
for editServer partial UPDATE. Reuse existing query methods
that were duplicated inline.