История версий CMS Donate Engine

2026-10-19 13:21:50
fix(sql): debug error_log

2026-10-18 22:48:20
perf(database): SqlParser md5 cache perf(router): CompiledUrlGenerator + file cache fix(install): MigrateMySQL19164 1054/2014, DBMigration null-guard feat(settings): DB logging select off/error/all feat(install): DefaultPasswordChecker non-blocking warning fix(errorhandler): mask passwords & session tokens in backtrace chore(docker): opcache JIT tracing, validate_timestamps docs(todo): split-current-user-money, monolog, mysql-buffered, Remove_fpm_client Baseline: 356/5, PHPStan 0, container OK

2026-10-17 20:45:50
fix(admin/money,realmoney): invalidate user data version after money delete fix(auth): populate session balance from driver, not stale CurrentUser refactor(CurrentUser): stop loading balance from PlayerDataRepository fix(cache): per-service circuit isolation chore(session): remove dead UserDataVersionManager fix(money): CraftConomy3 set semantics + SQL syntax + zero-guard

2026-10-17 09:36:35
fix(admin/money,realmoney): validate money input and check addMoney result ux(admin/money,realmoney): remove dead back link from modal result messages

2026-10-17 08:43:12
refactor(core): drop dead $GLOBALS[coins/rub/posts] writes

2026-10-17 08:11:52
fix(money): allow set balance to zero

2026-10-17 06:46:44
test(store): cover ManualGive give strategy

2026-10-16 15:39:03
fix(user): read balance from money db in PlayerDataRepository

2026-10-16 13:53:46
fix(store): prevent double refund on concurrent cancel The cancel flow credited the buyer before flipping the message body, so two admins clicking at the same time could each pass the marker check and each trigger addMoney, doubling the refund. Flip the message body first with a conditional UPDATE on the original body and bail out when affectedRows is 0. Only the request that wins the UPDATE proceeds to credit the buyer and write the refund log. Roll back the body if addMoney returns false.

2026-10-16 13:34:33
fix(store): restore add-product action in category nav

2026-10-16 13:19:48
feat(store): manual delivery with admin workflow in IM Discord is a notification channel, not a delivery method. Split the concern: GiveType::Manual replaces GiveType::Discord as the delivery type, ManualGive settles the purchase (money, stock, log) at buy time, and delivery is performed by an admin in-game. PurchaseDialogNotifier posts new manual orders to the shared admin dialog: the bot is the author, admins are members, the message shows the server, item x count, a link to the buyer profile, and the command in a code block. Three inline actions per order: - Copy 14 client-side, clipboard - I delivered 14 atomic UPDATE on the message body, first click wins - Cancel and refund 14 credits the buyer via memberData and writes a buy_store_refund row through PurchaseLog::writeRefund Admin membership in the server dialog is synced on each purchase: new owners are added, removed owners are dropped, the bot stays first. StorePurchaseService notifies admins only for Manual. StoreApiController and StoreAdminDeleteService use UrlGeneratorInterface for URLs instead of string concatenation. Rename name -> serverName in StoreProductQuery::findForPurchase and GiveContext. Discord webhook (discord_hook_shop) is used only as an additional notification channel for manual orders, in plain text. Migration 19248: - products: give discord -> manual - bundles: give:discord -> give:manual in command JSON - new translations for admin workflow and player refund notice - remove obsolete ADMIN_PURCHASE_NOTIFY_SUBJECT(_GLOBAL)

2026-10-14 13:09:04
fix(session): reload steam_id when session holds an empty string

2026-10-14 08:52:57
fix(session): reload steam_id from profile when session holds an empty string

2026-10-14 08:36:33
refactor(store): unify SteamID validation, DI purchase service fix(database): cache tags

2026-10-14 06:29:21
refactor(rcon): move protocol implementations into Protocol subdirectory

2026-10-13 18:50:39
refactor(rcon,query): add RconClient interface, rename Facade adapters

2026-10-13 08:56:46
feat(store): name the server in player-offline message

2026-10-12 23:33:43
fix(store): route GiveQueue to RCON, classify placeholder failures, read member fields from main db GiveType::fromGive mapped GiveQueue to Inventory, so store purchases went through the wrong delivery path. Placeholder failures were indistinguishable, surfacing server unavailable for missing Steam. Member fields were read through the money connection without cache. ValidatePayment duplicated the identity check. - GiveType: GiveQueue !92 Rcon - PlaceholderResolver: PlaceholderKind (Identity/Presence/Runtime/Unknown) and a single missingIdentity() preflight - RconGive: match on PlaceholderKind, no preflight duplication - StorePurchaseService: take CurrentUser, drop flat fields and ValidatePayment - MemberDataFactory/memberData: split $mainDb from $moneyDb - CurrentUser::getServerAuth() - Frontend: SteamID as placeholder, not value

2026-10-12 17:29:18
fix(http): return 405 for routing MethodNotAllowedException

2026-10-12 07:09:52
fix(admin): layout alignment and Response support - restore text-right on #naviButtons for legacy float-based toolbars - wrap cron navi in d-inline-flex to prevent button collapse - capture controller return value in AdminRunner and pass Response through, matching FrontRunner behaviour