Спринты
Спринты позволяют управлять гибкой (agile) разработкой внутри проектов. У каждого спринта есть временной диапазон, цель и набор задач из бэклога проекта.
Модель
Sprint
├── name, goal?
├── projectId (каскадное удаление)
├── startDate, endDate
├── status: planned | active | completed | cancelled
└── tasks (многие-ко-многим через Task.sprintId)API Эндпоинты
| Метод | Путь | Описание |
|---|---|---|
GET | /api/projects/:projectId/sprints | Список спринтов проекта |
GET | /api/projects/:projectId/sprints/velocity | Данные по velocity |
GET | /api/sprints/:id | Детали спринта |
POST | /api/sprints | Создать спринт |
PATCH | /api/sprints/:id | Обновить спринт |
DELETE | /api/sprints/:id | Удалить спринт |
POST | /api/sprints/:id/tasks | Добавить задачи в спринт |
DELETE | /api/sprints/:sprintId/tasks/:taskId | Убрать задачу из спринта |
Жизненный цикл спринта
planned ──► active ──► completed
│
└──► cancelled- planned — спринт определён, но ещё не начат
- active — текущий спринт в процессе
- completed — спринт завершён
- cancelled — спринт отменён
Фронтенд
Спринт-доска
Компонент SprintBoard.vue предоставляет доску в стиле Kanban:
- Бэклог — задачи, не назначенные ни на один спринт
- Активный спринт — задачи текущего спринта с drag-and-drop обновлением статуса
Спринт-бэклог
Компонент SprintBacklog.vue отображает задачи, доступные для назначения на спринт, с фильтрацией и массовым выбором.
Store спринтов
typescript
const store = useSprintsStore()
const { sprints, currentSprint } = storeToRefs(store)
await store.fetchByProject(projectId)
await store.create({ name, goal, projectId, startDate, endDate })
await store.update(id, { name, status, startDate, endDate })
await store.remove(id)
await store.addTasks(sprintId, taskIds)
await store.removeTask(sprintId, taskId)
await store.fetchVelocity(projectId)Ключевые детали
- В одном проекте должен быть только один спринт со статусом
active - Velocity рассчитывается на основе завершённых спринтов (очки или количество задач)
- Задача может принадлежать только одному спринту одновременно
- Даты спринтов не должны пересекаться в пределах одного проекта