Разработка URL shortener на Scala 2, используя функиональную парадигму
Необходимо создать небольшое веб-приложение, выполняющее роль URL shortener.
- Сокращенные URL живут вечно, проверка уникальности, увеличение длины ключа по мере исчерпания ключей. Проверка доступа до ресурса по сокращенному URL.
- Код должен быть написать на Scala 2 в функицональном стиле, присущем этому языку (implicits, Monoids, и пр.)
- Код должен быть читаемым и задокументирован
- Необходимо также написание тестов с помощью ScalaTest
- Сборка проекта должна происходить с помощью sbt.
- БД - PostgreSQL
- Готовый docker-compose с приложением и БД
- Короткий и ясный README.md про то, как задеплоить и запустить ваш проект, а также инструкции, как его использовать. Важно, чтобы мы могли задеплоить приложение на своей машине сразу же со всей необходимой для него инфраструктурой.
- Интерфейс не нужен, но необходима документация endpoints с помощью Swagger по ручке /docs.
- Деплоить приложение тоже не нужно, достаточно, чтобы инфраструктура разворачивалась локально.
Ограничения по code style:
- Переменные и функции должны иметь осмысленные названия;
- Тест классы именуются
<ClassName>Spec
, где<ClassName>
- класс к которому пишутся тесты; - Тест классы находятся в том же пакете, что и класс к которому пишутся тесты (например, класс
Fibonacci
находится в
пакетеfibonacci
в директорииsrc/main/scala/fibonacci
, значит его тест классFibonacciSpec
должен быть в том же
пакете в директорииsrc/test/scala/fibonacci
); - Каждый тест должен быть в отдельном test suite;
- Использовать java коллекции запрещается (Используйте
Scala
коллекции); - Использовать
mutable
коллекции запрещается; - Использовать
var
запрещается; - Использование
this
запрещается (используйтеself
, если надо); - Использование
return
запрещается; - Использование
System.exit
запрещается; - Касты или проверки на типы с помощью методов из Java вроде
asInstanceOf
запрещаются; - Использование циклов запрещается (используйте
for comprehension
,tailRec
, методыMonad
,fold
); - Использование не безопасных вызовов разрешено только в тестах (например
.get
уOption
); - Использование взятия и освобождения примитивов синхронизации: semaphore, mutex - из разных потоков запрещено;
- Использование require для ошибок запрещается