Технический долг (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 теперь диспатчатся и логируются.