Feat: Restructuring MigrateImport, Dispatching a per product job for import
This commit is contained in:
@@ -0,0 +1,52 @@
|
||||
<?php
|
||||
|
||||
namespace Modules\Core\MigrateImport\Services;
|
||||
|
||||
use Lunar\Models\Language;
|
||||
|
||||
/**
|
||||
* The language every resolver in an import run writes product-facing text
|
||||
* under (name, description, option names, ...) — NOT necessarily this
|
||||
* store's own Lunar\Models\Language::getDefault(). An export file has no
|
||||
* reliable way to declare its own language, and a store's default admin/
|
||||
* storefront language is an independent fact from whatever language a
|
||||
* given export happens to be written in — conflating the two (this
|
||||
* class's own former name, DefaultLocale, said as much) used to silently
|
||||
* save every imported product's text under the wrong language, invisible
|
||||
* unless that language was also the one selected while viewing/editing
|
||||
* the product afterward.
|
||||
*
|
||||
* Set once per import run from the operator's own answer (see
|
||||
* Command\MigrateImportCommand::askImportLocale(), threaded through
|
||||
* ImportSpec::$locale) at the top of Importer::import() — every resolver
|
||||
* downstream (ProductAttributeResolver, ProductOptionResolver,
|
||||
* CollectionResolver, ImportAttributeResolver) calls code() exactly as
|
||||
* before, unaware anything changed. Falls back to Language::getDefault()
|
||||
* only when nothing was ever set (e.g. an import path with no locale
|
||||
* concept of its own — JudgeMe's reviews-only export never calls set()).
|
||||
*/
|
||||
class ImportLocale
|
||||
{
|
||||
private static ?string $code = null;
|
||||
|
||||
public static function set(string $code): void
|
||||
{
|
||||
self::$code = $code;
|
||||
}
|
||||
|
||||
public static function code(): string
|
||||
{
|
||||
return self::$code ?? Language::getDefault()->code;
|
||||
}
|
||||
|
||||
/**
|
||||
* A static property outlives a single request only inside a
|
||||
* long-running worker process, where a queued job for one import
|
||||
* must not leak its locale into the next — called at the end of
|
||||
* every Importer::import() run, success or failure.
|
||||
*/
|
||||
public static function reset(): void
|
||||
{
|
||||
self::$code = null;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,26 @@
|
||||
<?php
|
||||
|
||||
namespace Modules\Core\MigrateImport\Services;
|
||||
|
||||
use InvalidArgumentException;
|
||||
use Modules\Core\MigrateImport\DTOs\ImportSpec;
|
||||
use Modules\Core\MigrateImport\Contracts\Importer;
|
||||
use Modules\Core\MigrateImport\JudgeMe\Services\JudgeMeExportImporter;
|
||||
use Modules\Core\MigrateImport\Shopify\Services\ShopifyExportImporter;
|
||||
|
||||
class ImporterFactory
|
||||
{
|
||||
public static function make(ImportSpec $spec): Importer
|
||||
{
|
||||
return match ([$spec->source, $spec->type]) {
|
||||
['shopify', 'export'] => new ShopifyExportImporter,
|
||||
// ["shopify", "api"] => new ShopifyApiImporter(),
|
||||
['judgeme', 'export'] => new JudgeMeExportImporter,
|
||||
// ["woocommerce", "export"] => new WooCommerceExportImporter(),
|
||||
// ["woocommerce", "api"] => new WooCommerceApiImporter(),
|
||||
default => throw new InvalidArgumentException(
|
||||
"No importer available for source \"{$spec->source}\" with type \"{$spec->type}\".",
|
||||
),
|
||||
};
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user