Skip to content

[Feature] Tracker: архитектурная декомпозиция (god-classes → thin layers) #361

Description

@Ibochkarev

Описание функции

Единый tracker по результатам архитектурного аудита (Jul 2026): вынести бизнес-логику из god-контроллеров/SFC, дожать domain facades, убрать ETL из Utils, выровнять DI.

Поведение магазина не менять без отдельного product-issue. Цель — cost of change и файлы < 1000 LOC.

Проблема, которую решает

Аудит зафиксировал системный долг, а не один файл:

  • OrdersController ~1861 + OrderView ~2517 (пара HTTP ↔ UI)
  • 10+ mgr-гридов 800–1800 LOC с копипастой каркаса
  • ImportCSV 999 в Utils/ (потолок AGENTS.md)
  • Cart/Customer толще Order-facade; часть сервисов вне ServiceRegistry
  • Три поколения UI/API (Processors/ExtJS, Manager REST, Vue) без явного freeze-плана для legacy

Без трекера issues расходятся, порядок разреза теряется.

Предлагаемое решение

Порядок фаз (code judo)

Фаза Issue Суть
1 #338 OrdersController → thin + Services
1b #339 OrderView → shell + секции (<1000)
2 #354 Узкие grid composables (не magic framework)
3 #344#368 ImportCSV split, затем перенос Utils → Services
4 #362 Cart/Customer thin facade по образцу Order
4b #363 DI: OptionSync/Loader, ManagerOrderCostRecalculator
4c #366 Унификация cost checkout ↔ manager
5 #364 ModelFieldsController → service
5b #365 Split GridConfig / OptionLoader / ProductData
6 #345 + #341 ServiceRegistry factory map; Response envelope
docs #367 Boundary naming Domain vs Api
parallel #350 #346 ExtJS→Vue; dual Settings API

Правила для PR в этом треке

  1. Поведение и JSON-контракты mgr/web без breaking (или явный migration note).
  2. Не traits «разрезать файл на куски» без смены ownership.
  3. Новые сервисы — в ServiceRegistry, не new в контроллере.
  4. Gate: php -l / npm run lint по затронутому; ручной smoke в PR.

Альтернативные варианты

  • Править точечно без трекера — долг растёт быстрее merges.
  • Big-bang rewrite менеджера — out of scope.

Примеры использования

Maintainer открывает этот issue как dashboard: закрытие child-issue = фаза done.

Критерии приёмки

Дополнительный контекст

Связанные: #337 CI, #353 Orders getList, #356 Deliveries/Payments, #358 EventGate, #291 (импорт extra fields — после #344/#368).

Metadata

Metadata

Assignees

Labels

enhancementNew feature or requestpriority: highВажно исправить в ближайшее времяtech-debtMaintainability / refactor / architecture debt

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions