Тестовое задание на позицию стажер-java в
СКБ Контур
Сокращатель ссылок
Необходимо разработать HTTP-сервис, который генерирует короткие ссылки.
Описание
В сервисе должна быть реализована следующая функциональность:
- Генератор ссылок
Ресурс /generate должен обрабатывать POST-запрос, содержащий оригинальную
ссылку, и генерировать короткую ссылку. Оригинальная ссылка передается в теле
POST-запроса в поле “original” JSON-объекта. Сгенерированная короткая ссылка
передается в теле ответа в поле “link” JSON-объекта. Сгенерированная короткая
ссылка должна иметь формат /l/{some-short-name}, то есть не должна содержать
адрес сервера, где some-short-name - идентификатор ссылки. Алгоритм генерации
этого идентификатора и его формат остается на усмотрение автора.
Пример запроса:
POST /generate
Пример тела запроса:
{
“original”: “https://some-server.com/some/url?some_param=1”
}
Пример ответа:
{
“link”: “/l/some-short-name”
}
- Редирект
Ресурс /l/{some-short-name} должен осуществлять редирект на оригинальный url.
Параметры пути запроса:
- some-short-name - идентификатор ссылки
Пример запроса:
GET /l/some-short-name
Предлагаем подумать, каким образом можно оптимизировать работу с ссылками, по
которым происходит много переходов.
- Статистика
3.1 Статистика по конкретным ссылкам
Ресурс /stats/{some-short-name} должен обрабатывать GET-запрос и возвращать
статистику переходов по конкретной ссылке.
Параметры пути запроса:
-
some-short-name - идентификатор ссылки
В ответе сервиса должен содержаться JSON-объект со следующими полями: -
link - сгенерированная короткая ссылка
-
original - оригинальная ссылка
-
rank - место ссылки в топе запросов
-
count - число запросов по короткой ссылке
Пример запроса:
GET /stats/some-short-name
Пример ответа:
{
“link”: “/l/some-short-name”,
“original”: “http://some-server.com/some/url”
“rank”: 1,
“count”: 100500
}
3.2 Рейтинг ссылок
Ресурс /stats должен обрабатывать GET-запрос и возвращать статистику запросов с
сортировкой по частоте запросов по убыванию и возможностью постраничного
отображения.
Параметры строки запроса:
-
page - номер страницы
-
count - число записей, отображаемых на странице, максимальное возможное
значение 100 (включительно)
В ответе сервиса должен содержаться массив из JSON-объектов, описанных в
разделе 3.1 Статистика по конкретным ссылкам.
Пример запроса:
GET /stats?page=1&count=2
Пример ответа:
[
{
“link”: “/l/some-short-name”,
“original”: “http://some-server.com/some/url”
“rank”: 1,
“count”: 100500
},
{
“link”: “/l/some-another-short-name”,
“original”: “http://another-server.com/some/url”
“rank”: 2,
“count”: 40000
}
]
Требования к сервису
-
При создании сервиса можно воспользоваться любым из указанных
фреймворков: Spring Framework, Spring Boot, Undertow, или написать
приложение на чистой Java. -
Сервис должен запускаться как standalone-приложение (java -jar service.jar).
-
Необходимо покрыть сервис Unit-тестами. Полнота покрытия остается на
усмотрение автора решения. -
Приложение должно собираться с использованием Apache Maven.
-
По возможности необходимо придерживаться REST-архитектуры.
-
Не использовать отдельно устанавливаемые базы данных, кэши и т.п. Можно
использовать embedded базы данных (например, H2 в режиме встроенной БД).
Прочие требования
-
Язык программирования: Java 8.
-
Оформление кода должно соответствовать общепринятым нормам
(например, https://google.github.io/styleguide/javaguide.html) -
Исходники необходимо упаковать в ZIP-архив вместе с кратким описанием
решения и инструкцией по сборке и запуску. Архив необходимо загрузить на
файлообменник, и отправить ссылку на архив в заявке на стажировку -
Проверка решения будет осуществляться в автоматизированном режиме
(функциональные и нагрузочные тесты), поэтому важно соблюдение
указанных в задании требований. -
Всё, что явно не указано в условиях, остаётся на усмотрение автора решения.