2023-06-10 21:11:21 +00:00
|
|
|
|
# Linkchecker
|
|
|
|
|
|
|
2023-06-11 00:14:30 +03:00
|
|
|
|
## Оригинальный текст задания
|
|
|
|
|
|
|
|
|
|
|
|
Разработать REST-сервис, проверяющий работоспособность любой последовательности узлов.
|
|
|
|
|
|
Каждый узел имеет уникальное имя, вероятность, с которой откажет при обращении к нему, и счетчик успешно выполненных запросов.
|
|
|
|
|
|
|
|
|
|
|
|
Сервис должен реализовывать два POST-метода:
|
|
|
|
|
|
|
|
|
|
|
|
1. setNodes устанавливает граф из узлов, описанных выше. Формат входных данных - JSON.
|
|
|
|
|
|
Программа должна исключать циклические связи узлов.
|
|
|
|
|
|
2. checkRoute принимает набор вершин (или их идентификаторов) в формате JSON
|
|
|
|
|
|
и проходит по этим вершинам, проверяя на каждом пройденном узле, не отказал ли он.
|
|
|
|
|
|
Если путь существует в графе и ни один из узлов пути не отказал, следует увеличить счетчик
|
|
|
|
|
|
в каждом из узлов пути. В противном случае отображать ошибку в ответе POST-метода (произвольный формат).
|
|
|
|
|
|
3. Узлы и связи должны храниться в базе данных.
|
|
|
|
|
|
|
|
|
|
|
|
## Изменённый вариант задания
|
|
|
|
|
|
|
|
|
|
|
|
После введённых корректировок, итоговый вид тестового задания выглядит следующим образом:
|
|
|
|
|
|
|
|
|
|
|
|
Разработать REST-сервис, проверяющий работоспособность любой последовательности узлов.
|
|
|
|
|
|
|
|
|
|
|
|
1. Каждый узел имеет уникальное имя и счетчик успешно выполненных запросов,
|
|
|
|
|
|
так же для хранения в базе данных есть уникальный идентификатор, который
|
|
|
|
|
|
присваивается автоматически при записи в БД. Был исключен элемент вероятность отказа узла.
|
|
|
|
|
|
Этот параметр перестал быть нужным, так как вероятность отказа узла стала случайным фактором,
|
|
|
|
|
|
возникающая автоматически, во время проверки последовательности узлов.
|
|
|
|
|
|
1. Граф в программе неориентированный, т.е. вершины графа связаны друг с другом рёбрами,
|
|
|
|
|
|
не имеющими направления. В базе данных, хранение графа осуществляется в двух таблицах.
|
|
|
|
|
|
В одной таблице осуществляется хранение набора узлов графа, в другой набор рёбер графа.
|
|
|
|
|
|
Более подробно смотрите запись в wiki [Описание данных](./../wikis/Описание%20данных)
|
|
|
|
|
|
1. Программа позволяет делать следующее:
|
|
|
|
|
|
1. Работать с графом обобщённо:
|
|
|
|
|
|
1. Создавать новый граф (при этом информация о прежнем графе будет удалена с БД)
|
|
|
|
|
|
1. Извлекать информацию о графе в заданном формате
|
|
|
|
|
|
1. Удалять целиком весь граф
|
|
|
|
|
|
1. Проверять работоспособность заданной последовательности узлов
|
|
|
|
|
|
(по условию задачи) выполнив соответствующий запрос.
|
|
|
|
|
|
1. Работать с узлами и ребрами по отдельности, т.е. добавлять, удалять,
|
|
|
|
|
|
искать информацию по заданным параметрам. Ручное изменение какой-либо информации о узле и ребре не предусмотрена,
|
|
|
|
|
|
т.е. возможно либо добавления узла или ребра в БД или удаление из БД)
|
|
|
|
|
|
|
|
|
|
|
|
Так как по условию задания, граф должен исключить все виды циклов
|
|
|
|
|
|
(т.е. граф должен быть ациклическим), то при любом запросе информации о графе целиком
|
|
|
|
|
|
или при проверки набора заданных узлов будет, происходить автоматический поиск
|
|
|
|
|
|
и удаление циклов из графа. Удаление циклов происходит при помощи удаления набора рёбер,
|
|
|
|
|
|
создающие циклы, поэтому в случае обнаружения циклов в графе, набор рёбер графа будет
|
|
|
|
|
|
изменён и данные изменения попадут в БД.
|
|
|
|
|
|
|
|
|
|
|
|
Автоматический поиск и удаление циклов не срабатывает, если происходит работа только
|
|
|
|
|
|
с набором данных рёбер графа в отдельности, т.е. можно добавлять в базу рёбра,
|
|
|
|
|
|
образующие циклы.
|
|
|
|
|
|
|
|
|
|
|
|
**Используемый стек** : **Spring Boot**, **Spring Data**, **ORM (Hibernate)**,
|
|
|
|
|
|
[**JGraphT**](https://jgrapht.org/) (для работы с графом),
|
|
|
|
|
|
**GSON** (используется вместо используемого по умолчанию Jackson для работы с json),
|
|
|
|
|
|
**Thymeleaf** и **Bootstrap** (используется для формирования стартовой информационной страницы),
|
|
|
|
|
|
**Mockito** (идёт вместе с Spring Boot),
|
|
|
|
|
|
**Powermock** (подключается отдельной библиотекой, используется в дополнении к mockito для тестов)
|
|
|
|
|
|
|
|
|
|
|
|
**Хранилище данных** : PostgeSQL (для production), H2 (для тестов)
|