fix(cache): separate timestamps from tag invalidation; restore cron cooldown
- Repository::getCacheTime/getCacheValue use DBAL (bypass cache) 14 stale
value broke cron cooldown
- Repository::updateCacheTime skips tag invalidation for timestamp keys
(last_run_cron, warmer, users, ...) 14 prevents ms_cache thrashing
- DatabaseFactory: tag versions in Redis/FS, not APCu; getAuthDb
invalidates shared cache
- CFG::onReload !92 DatabaseFactory::refreshAllPipelines: middleware
pipeline syncs with runtime config from ms_settings
- FPM error_log routed to container stderr via [global] /proc/1/fd/2
- CircuitBreaker::isAvailable uses apcu_exists (health probe was
counting as APCu miss on every SQL query)
- Regression test: RepositoryCacheTimeTest
fix(database): correct migration error logging and cross-worker cache invalidation
- DBMigration: attach migration name and SQL text to failed-query logs
(was: "sql_query() returned false" with no context)
- Database: restore lastError after logger INSERT resets it; reset
transaction state in finally on commit/rollback failure; sql_escape
no longer throws when the logger itself fails
- DatabaseFactory: tag invalidation via Redis/FS instead of per-worker
APCu; getAuthDb now invalidates shared cache; APCu adapter created
only when apcu_enabled() (fallback to Filesystem on CLI/APCu-less SAPI)
- ErrorHandler: saveLog returns false when both database and file sinks
fail instead of throwing to the caller
- updater/Database: escape serialized menu payload before UPDATE 14 fixes
SQL syntax error when a menu title contains an apostrophe
feat(modal): migrate popupModal to native dialog with bs3 shim
Migrate popupModal from bootstrap 3 div.modal to native dialog
element. Preserve bs3 api via $.fn.modal shim, so existing modules
(rullete.js, php controllers, data-api) keep working without changes.
Add cde-dialog.js and cde-dialog.css.
Update footer.tpl, header.tpl, shop.js, rullete.js,
cde-modules.css, cde-modules-login.css.
fix(store): return proper 404 page for missing store group and stop logging 404s
- StoreGroupQuery::fetchOne(): throw ResourceNotFoundException instead of returning null from an array-typed method (fixes TypeError / white screen)
- StoreCatalogController::__invoke(): throw ResourceNotFoundException when group has no server, skip redirect to id-0
- RequestHandler: catch ResourceNotFoundException / NotFoundHttpException and render 404 via Template::error() in the full layout
- RequestHandler: handle MethodNotAllowedException with a proper page instead of an empty body
- RequestHandler: wrap runLegacy() in try/catch so legacy exceptions don't escape to the PHP error handler
- RequestHandler: skip ErrorHandler::logException() for 404 responses, only log real 500 errors and transient container errors
refactor(layout): lazy-load feature scripts out of header
- donate: move payments-form.js bundle to donate_view.tpl,
lazy-load via pjax:complete
- store: move rullete.js bundle to modal_rulet.tpl
- admin: move admin_modal_edit_product.js bundle to its modal
- editor: drop codemirror.js from header, lazy-load in admin.js
and articles.php on first formTextEditorInit
- preload: prune APCu manifest of missing bundle files