diff --git a/CHANGELOG.md b/CHANGELOG.md index b3bb9d8..8e3d787 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,43 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/). +## [0.20.1] - 2026-09-24 + +### Fixed +- `Modules\Core\Catalog\Support\ProductDocumentLocalizer::withLocalizedFields()` — a translated + attribute (name, description, ...) saved blank for the current locale kept the empty string + instead of falling back to the store's default language, since `??` only falls back on a + missing/null key, not an empty one. A product with no English copy yet showed a blank + title/description on `/en/` instead of its Greek content. +- `Modules\Core\Command\WipeCatalogCommand` — now also deletes every `CartLine` referencing a + `product_variant` purchasable as part of the wipe (line items only, `Cart` records themselves + are left alone). Previously, any cart still holding a line for a wiped variant crashed the + entire storefront on every page load (`PricingManager::for()` throws when the variant a line + points at no longer exists) until those dangling lines were removed by hand. +- `Modules\Core\Command\MigrateImportCommand` now asks which language a Shopify export file's + own text is written in before importing, instead of silently assuming it matches the store's + default language — the two are independent facts, and a mismatch used to save every imported + product's name/description under the wrong language. Backing class renamed `DefaultLocale` → + `Modules\Core\MigrateImport\Services\ImportLocale` to stop implying that assumption. + +### Changed +- `Modules\Core\MigrateImport` reorganized to match every other module's layout + (`Contracts/`, `DTOs/`, `Jobs/`, `Models/`, `Services/`) instead of loose files at each + namespace root — no behavior change, but every `use` of `Importer`, `ImportSpec`, + `ImporterFactory`, `ImportLocale`, `RunMigrateImportJob`, `ShopifyExportImporter`, + `ShopifyCsvReader`, `ProductGroup`, `JudgeMeExportImporter`, and `JudgeMeCsvReader` moved to + its new namespace. +- `Modules\Core\MigrateImport\Shopify\Services\ShopifyExportImporter::import()` now dispatches + one `Jobs\ImportShopifyProductJob` per product (via `Bus::batch()`) instead of importing every + product inline in a single queued job. A large export's variants, resolvers, and media + downloads accumulating in one long-lived process routinely exceeded `queue:work`'s + `--memory` limit; the worker died mid-run, the container restarted, and the entire import + started over from the first row every time, never actually finishing. Splitting into one job + per product resets memory between products, and a restart now only repeats whichever single + product was in flight. `Modules\Core\Catalog\Services\SkuBackfillService::backfill()` moved + from running right after the import loop to the batch's `then()` callback, since it must wait + for every product job to finish rather than firing the moment jobs are merely queued. + ## [0.20.0] - 2026-09-23 ### Added diff --git a/composer.json b/composer.json index d0dd581..fa19d81 100644 --- a/composer.json +++ b/composer.json @@ -2,7 +2,7 @@ "name": "boboko/core", "description": "Core module — authentication and shared panel behaviour", "type": "library", - "version": "0.20.0", + "version": "0.20.1", "autoload": { "psr-4": { "Modules\\Core\\": "src/"