Стек проекта: Kotlin, Spring Boot, Gradle (Kotlin DSL).
- Проблема: При попытке вызвать существующий эндпоинт
GET /api/delivery/assign?deliveryId=1приложение падает с ошибкой в консоли и не возвращает результат. - Что нужно сделать: Локализуй проблему, пойми причину падения и исправь дефект так, чтобы запрос отрабатывал успешно.
- Что мы оцениваем: Умение читать логи ошибок, пользоваться дебаггером и способность находить/устранять некорректные связи между компонентами Spring.
- Проблема: В классе
ru.mvideo.test.delivery.service.CourierAssignmentServiceнайди методfindBestCourier. Сейчас он написан в уродливом, нечитаемом императивном стиле с кучей вложенных циклов и условий. - Что нужно сделать: Перепиши этот алгоритм, используя возможности Kotlin. Код должен стать лаконичным и легко читаемым.
- Что мы оцениваем: Понимание концепций функционального программирования, знание стандартной библиотеки Kotlin и умение писать чистый код без лишних мутаций данных (
var).
- Что нужно сделать: Добавь в проект возможность управлять жизненным циклом доставки. Для этого реализуй эндпоинт
PUT /api/delivery/{id}/status, который меняет статус доставки (CREATED->IN_TRANSIT->DELIVERED). - Требования к фиче:
- Реализуй валидацию переходов бизнес-логики: например, нельзя перевести доставку из статуса
CREATEDсразу вDELIVERED, минуя стадиюIN_TRANSIT. - Если логика перевода статуса нарушена (или доставка с таким
idне найдена), сервис должен возвращать понятную ошибку с корректным HTTP-статусом (например,400 Bad Requestили404 Not Found), а не падать с500 Internal Server Error. - Напиши 2–3 Unit-теста на слой валидации этих статусов.
- Реализуй валидацию переходов бизнес-логики: например, нельзя перевести доставку из статуса
- Что мы оцениваем: Правильное разделение кода по слоям (Controller -> Service -> Repository), умение обрабатывать кастомные исключения в Spring Boot и базовую культуру написания тестов.
- Что нужно сделать: Оформи результат выполнения задания в виде Pull Request (PR) на GitHub.
- Склонируй репозиторий.
- Проверь, что проект успешно собирается локально:
./gradlew clean build