Skip to content

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

Closed

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).

Activity

  1. added
    priority: highВажно исправить в ближайшее время
    enhancementNew feature or request
    tech-debtMaintainability / refactor / architecture debt
    on Jul 15, 2026
  2. Ibochkarev commented on Jul 15, 2026

    @Ibochkarev
    MemberAuthor

    Латентные баги вне tech-debt (заведены отдельно): #369–#381. Tracker декомпозиции их не чинит — нужны bugfix PR.

  3. Ibochkarev commented on Jul 15, 2026

    @Ibochkarev
    MemberAuthor

    Bug tracker (не tech-debt): #389 (#369–#388).

  4. self-assigned this
    on Aug 10, 2026
  5. Ibochkarev commented on Aug 13, 2026

    @Ibochkarev
    MemberAuthor

    Критерии трекера закрыты. Child-issues фаз 1–6, docs и parallel — CLOSED.

    Фаза Issue Статус
    1 #338 OrdersController CLOSED
    1b #339 OrderView CLOSED
    2 #354 grid composables CLOSED
    3 #344 → #368 ImportCSV CLOSED
    4 / 4b / 4c #362 #363 #366 CLOSED
    5 / 5b #364 #365 CLOSED
    6 #345 + #341 CLOSED
    docs #367 CLOSED
    parallel #350 #346 CLOSED

    Phase 1 на beta: OrdersController.php 412 строк, OrderView.vue 250 (оба < 1000). Импорт: Utils/ImportCSV.php 66 строк, логика в Services/Product/Import/.

    Связанный контекст из описания (#337 #353 #356 #358 #291) тоже CLOSED. Латентные баги #369–#381 / tracker #389 в этот issue не входят.

    Закрываю как dashboard, фазы done.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

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