Repository navigation
[Feature] Tracker: архитектурная декомпозиция (god-classes → thin layers) #361
Copy link
Copy link
Closed
Labels
enhancementNew feature or requestNew feature or requestpriority: highВажно исправить в ближайшее времяВажно исправить в ближайшее времяtech-debtMaintainability / refactor / architecture debtMaintainability / refactor / architecture debt
Description
Описание функции
Единый 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 с копипастой каркаса
ImportCSV999 в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 в этом треке
- Поведение и JSON-контракты mgr/web без breaking (или явный migration note).
- Не traits «разрезать файл на куски» без смены ownership.
- Новые сервисы — в
ServiceRegistry, неnewв контроллере. - Gate:
php -l/npm run lintпо затронутому; ручной smoke в PR.
Альтернативные варианты
- Править точечно без трекера — долг растёт быстрее merges.
- Big-bang rewrite менеджера — out of scope.
Примеры использования
Maintainer открывает этот issue как dashboard: закрытие child-issue = фаза done.
Критерии приёмки
- Phase 1 ([Feature] Распилить OrdersController: thin controller + сервисы (<1000 LOC) #338+[Feature] Распилить OrderView.vue и крупные mgr-экраны (>1000 LOC) #339): оба файла < 1000 LOC.
- Phase 2–3: пилотные гриды на composables; импорт не Utils-монолит ([Feature] Декомпозировать ImportCSV (<1000 LOC soft-limit) #344+[Feature] ImportCSV: перенос из Utils в Services/Product (после split) #368).
- Phase 4 ([Feature] Cart/Customer: thin facade по образцу Order (Events + managers) #362+[Feature] DI: OptionSync/Loader + ManagerOrderCostRecalculator в ServiceRegistry #363+[Feature] Унифицировать cost: checkout calculator ↔ manager recalculator #366): facades + DI + cost core.
- Phase 5 ([Feature] ModelFieldsController → ModelField(Section)Service (<800 LOC controller) #364+[Feature] Split god-services: GridConfig / OptionLoader / ProductData #365): ModelFields + god-services split.
- [Feature] Boundary: Domain facades vs Controllers/Api (naming + AGENTS) #367: documented boundary.
- Нет нового god-файла >1000 без waive в PR.
Дополнительный контекст
Связанные: #337 CI, #353 Orders getList, #356 Deliveries/Payments, #358 EventGate, #291 (импорт extra fields — после #344/#368).
Metadata
Metadata
Assignees
Labels
enhancementNew feature or requestNew feature or requestpriority: highВажно исправить в ближайшее времяВажно исправить в ближайшее времяtech-debtMaintainability / refactor / architecture debtMaintainability / refactor / architecture debt
Activity
Ibochkarev commentedon Jul 15, 2026
Латентные баги вне tech-debt (заведены отдельно): #369–#381. Tracker декомпозиции их не чинит — нужны bugfix PR.
Ibochkarev commentedon Jul 15, 2026
Bug tracker (не tech-debt): #389 (#369–#388).
Ibochkarev commentedon Aug 13, 2026
Критерии трекера закрыты. Child-issues фаз 1–6, docs и parallel — CLOSED.
Phase 1 на
beta:OrdersController.php412 строк,OrderView.vue250 (оба < 1000). Импорт:Utils/ImportCSV.php66 строк, логика вServices/Product/Import/.Связанный контекст из описания (#337 #353 #356 #358 #291) тоже CLOSED. Латентные баги #369–#381 / tracker #389 в этот issue не входят.
Закрываю как dashboard, фазы done.