Программа представляет бэкенд учебного трекера задач. Он предназначен для регистрации, обновления, удаления задач, для их описания, отслеживания состояния, а также для обеспечения интерфейса к задачам, и их хранения.
Модель данных представлена следующими типами задач:
- обычные задачи (представлена классом SimpleTask);
- эпики (представлены классом EpicTask);
- подзадачи (представлены классом Subtask).
Каждая задача обладает следующими свойствами:
- Название, - кратко описывает суть задачи.
- Описание, в котором раскрываются детали.
- Уникальный идентификационный номер задачи, по которому ее можно найти в трекере.
- Статус, отображающий прогресс ее выполнения (содержатся в классе TaskStatus),
- NEW - задача только создана, к ее выполнению еще не преступили;
- IN_PROGRESS - над задачей ведется работа;
- DONE - задача выполнена.
Свойства задач содержатся в классе Task, наследниками которого являются классы SimpleTask, EpicTask, Subtask. Эпики представляют большие задачи, которые делятся на подзадачи. Для каждой подзадачи известно, в рамках какого эпика она выполняется, и каждый эпик знает какие подзадачи в него входят. Эпик считается завершенным, когда завершены все подзадачи эпика.
Управляют задачами объекты-менеджеры, которые реализуют следующие функции:
- Обеспечивают хранение задач всех типов.
- Содержат методы для каждого типа задач (задача/эпик/подзадача), позволяющие:
- получать список всех соответствующих задач;
- удалять все соответствующие задачи;
- получать соответствующую задачу по идентификатору;
- создавать задачу-объект, переданный в качестве параметра;
- обновлять задачу-объект, переданный в качестве параметра;
- удалять задачу по идентификатору.
- Предоставляют список всех подзадач определенного эпика.
- Управляют статусами задачи:
- для обычных задач и подзадач используются статусы, полученные вместе с информацией о самой задаче;
- для эпиков выполняется расчет статуса с учетом следующего:
- если у эпика нет подзадач или все они имеют статус NEW, статус эпика должен быть NEW;
- если все подзадачи имеют статус DONE, то эпик считается завершенным со статусом DONE;
- во всех остальных случаях статус должен быть IN_PROGRESS;
- пользователь не имеет возможности поменять статус эпика самостоятельно;
- когда меняется статус любой позадачи в эпике, проверяется необходимость изменения статуса самого эпика.
Базовым менеджером является класс InMemoryTaskManager, который реализует интерфейс TaskManager. Он хранит информацию в оперативной памяти и выполняет обработку задач с использованием хэшированных списков.
Для обеспечения сохранности информации между завершением и запуском программы может использоваться менеджер задач, реализованный в классе FileBackedTaskManager, который является наследником класса InMemoryTaskManager. Методы класса FileBackedTaskManager вызывают соответствующие методы родительского класса и дополнительно выполняют сохранение информации в файле, а также обеспечивают загрузку информации из файла. Для обеспечения возможности сохранности задач в сети может применяться версия менеджера задач HttpTaskManager, которая обеспечивает передачу и загрузку информации по сети, взаимодействуя с KV-сервером.
История просмотров задач — это упорядоченный набор элементов, для хранения которых используется двусвязанный список (класс CustomLinkedList) в менеджере истории просмотров задач (класс InMemoryHistoryManager). Реализация списка CustomLinkedList() позволяет вставлять и удалять элементы списка с константным временем исполнения (использованием HashMap), а также сохранить с использованием двусвязного списка порядок доступа к задачам в менеджере задач.
Список истории просмотров задач обновляется в методах getSimpleTask(), getSubtask() и getEpic() менеджера задач — просмотренные задачи добавляются в конец списка. Если какая-либо задача просматривалась несколько раз, в истории должен отобразиться только последний просмотр. Предыдущий просмотр удаляется сразу же после появления нового.
Доступ к методам менеджера задач осуществляется через HTTP-запросы. Эндпойнты реализованного API соответствуют вызовам базовых методов интерфейса TaskManager. Класс HttpTaskServer слушает порт 8080 и принимает запросы. В него добавлена с использованием утилитного класса Managers реализация HttpTaskManager.
Все запросы по пути /tasks/<ресурсы> приходят в интерфейс TaskManager. Путь для обычных задач — /tasks/task, для подзадач — /tasks/subtask, для эпиков — /tasks/epic. Получить все задачи сразу можно по пути /tasks/, а историю просмотренных задач по пути /tasks/history. Для получения данных должны направляться GET-запросы, для создания и изменения — POST-запросы, для удаления — DELETE-запросы. Задачи передаются в теле запроса в формате JSON. Идентификатор (id) задачи следует передавать параметром запроса (через вопросительный знак).
Для тестирования работоспособности приложения использована библиотека JUnit5.