Skip to content

refactor(import): декомпозиция ImportCSV, EventGate и ProductImportService - #499

Open
Ibochkarev wants to merge 10 commits into
betafrom
feat/issue-344-decompose-import-csv
Open

refactor(import): декомпозиция ImportCSV, EventGate и ProductImportService#499
Ibochkarev wants to merge 10 commits into
betafrom
feat/issue-344-decompose-import-csv

Conversation

@Ibochkarev

@Ibochkarev Ibochkarev commented Aug 2, 2026

Copy link
Copy Markdown
Member

Описание

  1. [Feature] Декомпозировать ImportCSV (<1000 LOC soft-limit) #344 — декомпозиция ImportCSV на Services/Product/Import/*.
  2. [Feature] Единый EventGate для returnedValues (ImportCSV + Order/Cart) #358 — канонический Utils/EventGate для returnedValues.
  3. [Feature] ImportCSV: перенос из Utils в Services/Product (после split) #368 — основной код импорта в ProductImportService, DI-ключ ms3_product_import; Utils\ImportCSV — deprecated BC-wrapper.

Тип изменений

  • Рефакторинг (без изменения функциональности)

Связанные Issues

Closes #344
Closes #358
Closes #368

Как это было протестировано?

cd core/components/minishop3
composer install
composer test:smoke                    # exit 0
composer test -- --filter 'ProductImportServiceTest|ImportCsvDecompositionTest|EventGateTest|ParseImportedOptionValueTest'
# exit 0: 25 tests
composer stan                          # exit 0
  • Автоматические тесты
  • Ручное тестирование (полный импорт на стенде)

Чеклист

  • Основной код импорта в Services/Product/Import/ProductImportService
  • DI ms3_product_import в ServiceRegistry (override через ms3.services.php)
  • Processors + scheduler task → service
  • CSV/option.* контракт без изменений
  • PHPStan — exit 0

Дополнительные заметки

$modx->services->get('ms3_product_import')->process($params);

Utils\ImportCSV сохранён для внешних new ImportCSV($modx) до следующего major.

Split the 999-line ImportCSV monolith into focused collaborators (reader,
row mapper/processor, upserter, options, gallery, events) with a thin facade
under 200 LOC. Preserves CSV contract, returnedValues events, and OptionSync
path for option.* columns.

Refs #344
@Ibochkarev Ibochkarev added priority: medium Средний приоритет enhancement New feature or request tech-debt Maintainability / refactor / architecture debt labels Aug 2, 2026
- Add ImportCsvPathGuard for CSV and gallery path traversal checks
- Re-validate CSV path after msOnBeforeImport returnedValues
- Remove unused encoding passthroughs from ImportCSV facade
- Extend unit tests for path guard, missing column mapping

Refs #344
Use print_r(..., true), modX path options instead of MODX_* constants,
string select() for xPDO query, modResource return annotation, and
widen EventBridge array types for list-shaped gallery payloads.

Refs #344
Centralize returnedValues parsing in Utils\EventGate and delegate
Utils::invokeEvent through it. Migrate ImportCSV, notifications,
ProductDataService and ms3_products; remove ImportCsvEventBridge.
@Ibochkarev Ibochkarev changed the title refactor(import): декомпозиция ImportCSV (#344) refactor(import): декомпозиция ImportCSV Aug 2, 2026
Add EventGate::invokeRaw for direct invokeEvent call sites, extract
invokeProductModifier in ProductDataService, migrate ms3_products,
and move EventGate tests to PHPUnit under tests/Unit/Utils.
Register ms3_product_import in ServiceRegistry; processors and scheduler
task use DI. Utils\ImportCSV remains a deprecated BC wrapper.
Check BC wrapper via file path instead of loading deprecated class.
@Ibochkarev Ibochkarev changed the title refactor(import): декомпозиция ImportCSV refactor(import): декомпозиция ImportCSV, EventGate и ProductImportService Aug 2, 2026
@Ibochkarev
Ibochkarev requested a review from biz87 August 2, 2026 02:57
Align anonymous modX::lexicon overrides with ModxStub signature so
integration tests pass on PHP 8.2+ when typed lexicon is present.
Anonymous subclasses must not redeclare parent properties with types
when ModxStub uses untyped $services (PHP 8.2 fatal).
Same PHP 8.2 rule as CartFacadeDraftStoreTest: anonymous modX
subclasses must assign $services in ctor without retyping.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancement New feature or request priority: medium Средний приоритет tech-debt Maintainability / refactor / architecture debt

Projects

None yet

1 participant