Skip to content

Задачи

Задачи — основной рабочий элемент в Planner. Они поддерживают полный жизненный цикл с workflow статусов, приоритетами, назначениями, сроками, подзадачами, комментариями с ветвлением, историей изменений и отдельным чатом задачи.

Модель

Task
├── title, description
├── status: todo | in_progress | in_review | done | cancelled | overdue
├── priority: low | medium | high | urgent
├── assigneeId?, dueDate?
├── parentId? (подзадачи)
├── projectId (обязательно, каскадное удаление)
├── comments (с ветвлением и ответами)
├── history (журнал аудита)
└── chat (создание или получение беседы задачи)

API Endpoints

CRUD задач (/projects/:id/tasks)

МетодПутьОписание
GET/api/projects/:id/tasksСписок задач проекта
POST/api/projects/:id/tasksСоздать задачу
GET/api/projects/:id/tasks/:taskIdПолучить задачу с деталями
PATCH/api/projects/:id/tasks/:taskIdОбновить задачу
PATCH/api/projects/:id/tasks/:taskId/statusОбновить только статус
DELETE/api/projects/:id/tasks/:taskIdУдалить задачу

Мои задачи

МетодПутьОписание
GET/api/tasks/myЗадачи, назначенные текущему пользователю (дашборд)
GET/api/tasks/my/calendarЗадачи в диапазоне дат (?from=&to=)

Доска задач команды

МетодПутьОписание
GET/api/teams/by-slug/:teamSlug/tasksУдобный эндпоинт команды

Комментарии к задачам (/projects/:id/tasks/:taskId/comments)

МетодПутьОписание
GET/api/projects/:id/tasks/:taskId/commentsСписок комментариев (плоский, с parentId для ветвления)
POST/api/projects/:id/tasks/:taskId/commentsСоздать комментарий (опциональный parentId для ответа)
PATCH/api/projects/:id/tasks/:taskId/comments/:commentIdРедактировать комментарий
DELETE/api/projects/:id/tasks/:taskId/comments/:commentIdУдалить комментарий (заблокировано, если есть ответы)

История задач (/projects/:id/tasks/:taskId/history)

МетодПутьОписание
GET/api/projects/:id/tasks/:taskId/historyПолучить журнал аудита задачи

Чат задачи

МетодПутьОписание
POST/api/chats/task/:taskIdСоздать или получить беседу задачи

Вложения

МетодПутьОписание
POST/api/projects/:id/tasks/:taskId/attachmentsЗагрузить вложения к задаче (до 50MB)
POST/api/projects/:id/tasks/:taskId/attachments/removeУдалить вложение
POST/api/projects/:id/tasks/:taskId/comments/attachmentsЗагрузить вложения к комментарию

Переупорядочивание и массовые операции

МетодПутьОписание
POST/api/projects/:id/tasks/reorderПереупорядочить задачи (drag-and-drop)
POST/api/projects/:id/tasks/bulkМассовые операции (статус, назначение, удаление, приоритет)

Зависимости задач (/tasks/:taskId/dependencies)

МетодПутьОписание
GET/api/tasks/:taskId/dependenciesСписок зависимостей задачи
POST/api/tasks/:taskId/dependenciesСоздать зависимость (dependsOnId, type?: blocks | relates_to)
DELETE/api/tasks/:taskId/dependencies/:idУдалить зависимость

Теги (/tags)

МетодПутьОписание
GET/api/orgs/:orgId/tagsСписок тегов организации
GET/api/teams/:teamId/tagsСписок тегов команды
GET/api/tasks/:taskId/tagsСписок тегов задачи
POST/api/tagsСоздать тег (name, color?, orgId?, teamId?)
PATCH/api/tags/:idОбновить тег
DELETE/api/tags/:idУдалить тег
POST/api/tasks/:taskId/tagsНазначить теги задаче (tagIds: string[])

Workflow статусов

todo ──► in_progress ──► in_review ──► done
  │                        │
  └────────────────────────┘
       cancelled

overdue (автоматически, при просрочке срока)

История задач (журнал аудита)

Каждое изменение автоматически логируется:

ДействиеТриггерДанные
CREATEDСоздание задачиКто создал, когда
UPDATEDИзменение поляИмя поля, старое значение, новое значение
STATUS_CHANGEDОбновление статусаСтарый статус, новый статус
ASSIGNEDИзменение исполнителяСтарый исполнитель, новый исполнитель
DELETEDУдаление задачиСнимок удалённой задачи

История отображается в виде временной шкалы с цветовой кодировкой.

Комментарии с ветвлением

Комментарии поддерживают ответы через поле parentId:

  • Комментарий верхнего уровня: parentId равен null
  • Ответ: parentId ссылается на родительский комментарий
  • Вложенность: Без ограничений (отображается с отступами)
  • Удаление: Нельзя удалить комментарий, у которого есть ответы — сначала удалите ответы
  • Уведомления: Ответ на комментарий уведомляет автора родительского комментария

Компонент фронтенда

Компонент TaskComments.vue строит дерево комментариев из плоского API-ответа и рекурсивно отображает его через CommentNode.vue. Каждый комментарий имеет:

  • Кнопку ответа (открывает встроенную форму)
  • Кнопку редактирования (только свои комментарии)
  • Кнопку удаления (только свои комментарии, скрыта если есть ответы)

Store фронтенда

Store задач

typescript
const store = useTasksStore()
const { tasks, currentTask } = storeToRefs(store)

await store.fetchTasks(projectId)
await store.createTask(projectId, { title, status, priority, assigneeId, dueDate, parentId })
await store.updateTask(projectId, taskId, { title, status, priority, assigneeId, dueDate })
await store.updateTaskStatus(projectId, taskId, status)
await store.deleteTask(projectId, taskId)

Store комментариев

typescript
const store = useCommentsStore()
const { comments } = storeToRefs(store)

await store.fetchComments(projectId, taskId)
await store.createComment(projectId, taskId, { body, parentId, attachments })
await store.updateComment(projectId, taskId, commentId, { body })
await store.deleteComment(projectId, taskId, commentId)
await store.uploadAttachments(projectId, taskId, files)

Store истории задач

typescript
const store = useTaskHistoryStore()
const { history, loading } = storeToRefs(store)

await store.fetchHistory(projectId, taskId)

Ключевые детали реализации

  • Чат задачи отделён от комментариев — используйте POST /api/chats/task/:taskId для создания или получения беседы
  • Чат автоматически добавляет запрашивающего пользователя как участника
  • История задач обслуживается отдельным TaskHistoryController (не встроена в ответ задачи)
  • Вложения загружаются до создания комментария, затем ссылаются по URL в комментарии
  • Теги привязаны к организациям или командам — назначение через POST /api/tasks/:taskId/tags с { tagIds: [] }
  • Зависимости задач используют тип blocks по умолчанию — блокирующая задача не позволяет зависимой перейти в статус done
  • Элементы переупорядочивания используют пары { taskId, position } для сохранения drag-and-drop
  • Массовые операции поддерживают действия: status, assignee, delete, priority