CrazyParanoid / task-service

Сервис управления задачами

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

TASK-SERVICE

Микросервис управления задачами приложения SCRUM Project Management Software. При разработке использовались тактические и стратегические шаблоны DDD, паттерны GoF, принципы чистого кода, SOLID и гексагональной архитектуры. Ограниченный контекст микросервиса - модель задачи в методологии гибкой разработки SCRUM.

Описание агрегата Task

Основной элемент модели ограниченного контекста микросервиса - агрегат Task. Корень агрегата инкапсулирует набор объектов-значений:

  • taskId - уникальный идентификатор задачи. Создаётся статическим фабричным методом identifyTaskFrom класса TaskId;
  • assignee - исполнитель задачи. Содержит идентификатор члена команды TeammateId, назначенного для выполнения задачи. Создаётся статическим фабричным методом identifyTeammateFrom класса TeammateId;
  • sprintId - идентификатор спринта, в котором запланирована к выполнению задача.Создаётся статическим фабричным методом identifySprint класса SprintId;;
  • priority - приоритет задачи, возможные значения: LOW (низкий), MEDIUM(средний), HIGH(высокий);
  • workFlowStatus - статус задачи. Возможные значения: BACKLOG - задача находится в бэклоге и на неё еще не назначен иполнитель; TODO - назначен исполнитель и задачу можно взять в работу; IN_PROGRESS - задача выполняется исполнителем; DONE - выполнение задачи завершено;
  • summary - краткое описание задачи;
  • description - подробное описание задачи;
  • project - проект, к которому принадлежит задача;

Также агрегат Task содержит локальную сущность TimeTracker. Объект timeTracker отвечает за вычисление показателей затраченного на выполнение задачи времени. Сущность TimeTracker содержит следующие объекты-значения:

  • trackerId - уникальный идентификатор объекта timeTracker. Создаётся статическим фабричным методом identifyTracker класса TimeTracker;
  • startDate - дата начала выпонения задачи;
  • endDate - дата завершения выпонения задачи;
  • workHours - затраченные на выполнение задачи часы;

Объект timeTracker создаётся статическим фабричным методом create класса TimeTracker. Создание новой задачи контролирует фабрика TaskFactory. Метод createTask принимает в качестве параметров summary - краткое описание задачи, description - подробное описание задачи, projectKey - ключ проекта. Фабрика создаёт идентификатор задачи по следующему бизнес-правилу: "ключ проекта" + "-" + "последовательный порядковый номер задачи". Задача создаётся со статусом BACKLOG и приоритетом LOW. Кроме того, фабрика создает объекты timeTracker и project. В результате создания агрегата task генерируется и публикуется событие предметной области TaskCreated.

Для изменения приоритета задачи необходимо использовать функцию changePriority. Данная функция доступна при любом состоянии агрегата task.

Для указания спринта, в котором была запланирована к выполнению задача необходимо вызвать функцию scheduleToSprint. В качестве параметра функция принимает идентификатор спринта sprintId. Данный метод используется при обработке события агрегата sprint - при планировании задачи, агрегат sprint генерирует событие, публикуемое через MoM для агрегата task. Функция scheduleToSprint контролирует выполнение инварианта - выполненные задачи не могут быть добавлены в спринт.

Назначение задачи на иполнителя осуществляется вызовом функции assignTeammate. В качестве параметра функция принимает идентификатор члена команды TeammateId. Функция контролирует инвариант агрегата - только задачи из бэклога могут быть назначены к выполнению. Статус задачи после выполнения функции меняется на TODO - задачу можно начать выполнять.

Чтобы начать работу над задачей необходимо выполнить функцию startWork. Функция контролирует инвариант агрегата - только задачи с назначенным исполнителем можно начать выполнять. Статус задачи после выполнения функции меняется на IN_PROGRESS - задача находится в работе. В теле функции startWork осуществляется запуск учета затраченного времени - вызывается функция startTracking объекта timeTracker.

Чтобы отметить затраченное на выполнение задачи время в часах необходимо вызвать метод noteWorkHours. В качестве параметра метод принимает количесво затраченных на выполнение задачи часов. Функция контролирует инвариант агрегата - только для задачи, находящейся в работе, можно отметить время выполнения. Для подсчета затраченного времени в теле функции noteWorkHours вызывается функция increaseWorkHours объекта timeTracker, которая учитывает затраченное время.

Для завершения работы над задачей необходимо вызвать метод stopWork. Функция контролирует инвариант агрегата - только задачи, находящиеся в работе, можно завершить. Для остановки учета времени выполнения в теле функции stopWork вызывается функция stopTracking объекта timeTracker.

Корень агрегата task содержит ряд методов без побочных эффектов (например, workDays, startDate, priority и т.д.), раскрывающих внутреннюю структуру агрегата для сборщика DTO (TaskAssembler). Структура раскрывается ровно в той степени, в которой того требует уровень представления presentation. Практически все геттеры и сеттеры корня и объектов значений самоинкапсулированы и не позволяют получить доступ к внутренней структуре агрегата.

Хранилище TaskRepository

Хранилище объектов task выполнено в виде выделенного интерфейса TaskRepository на уровне предметной области (пакет domain). В соответсвии с принципами гексагональной архитектуры интерфейс хранилища является вторичным портом, адаптер к которому находится на уровне инфраструктуры (пакет infrastructure). Внедрение зависимости осуществляется по принципу DIP.

About

Сервис управления задачами


Languages

Language:Java 99.4%Language:Dockerfile 0.6%