Технический долг (Tasks)

🔴 Критическое

  • Авто-таймер (AutoTimerListener) – определение активных колонок по имени (in_progress, review и т.д.) ненадёжно. Нужно использовать флаг is_active и is_final, которые уже есть в board_columns.
  • PlannedIntervalListener – при изменении planned_start не обновляет существующий интервал, если он уже был остановлен; может создавать дубликаты.
  • Отсутствует индексация для полей due_date, assigned_to, board_id в таблице tasks – что замедляет выборки.

🟡 Важное

  • BusyChartService – построение диаграммы работает только для завершённых интервалов, не учитывает пересечения с текущим днём (незавершённый таймер).
  • ListTasksHandler – фильтрация по доступным доскам выполняется в хендлере, а не в репозитории, что неэффективно при большом количестве задач (выборка всех задач и фильтрация в PHP).
  • TaskAccess – использует прямой вызов репозиториев, нет кэширования прав доступа.

🟢 Плановые улучшения

  • Перевести TaskAccess на использование кэша (списки доступных досок через Redis).
  • Добавить возможность прикреплять несколько исполнителей к задаче (сейчас assigned_to один).
  • Реализовать подзадачи с иерархией (сейчас есть parent_id, но нет ограничений на глубину и циклические ссылки).
  • Сделать отложенное обновление overdue через cron (сейчас флаг обновляется только при сохранении задачи).
  • Добавить полнотекстовый поиск по задачам (через PostgreSQL tsvector).

🟢 Исправленное

  • Добавлено логирование всех событий через TaskLoggerListener – теперь все ключевые действия (создание, обновление, перемещение, назначение, удаление, комментарии, стикеры, таймеры) записываются в лог.
  • Форвардинг событий в глобальную шину – теперь многие события модуля Tasks доступны для подписки из других модулей.
  • Добавлены недостающие событияTaskUpdatedEvent, TaskRestoredEvent, CommentAddedEvent, CommentUpdatedEvent, StickerAttachedToTaskEvent, TimerStartedEvent, TimerStoppedEvent, IntervalLoggedEvent теперь диспатчатся и логируются.