Проект для Мегаолимпиады ИТМО (трек: промышленный бэкенд).
Сервис разработан на Spring Boot с использованием Java 17. Используется библиотека Jdbi для взаимодействия с базой данных, т.к. использование ORM на production чревато последствиями. Так, в проекте был показан навык "ручной" реализации работы с БД.
Для тестирования используется СУБД H2. Реализованы Unit-тесты классов с бизнес-логикой и тесты контроллеров.
Для сборки и запуска необходима JDK версии 17+, а также СУБД Postgres (учётные данные соответствуют заданию).
Команда для сборки проекта: ./gradlew build
.
Запустить проект можно при помощи команды ./gradlew bootRun
.
При ошибке валидации или внутренней ошибке сервиса возвращается тело формата:
{
"status": 400,
"reason": "movie.title: size must be between 0 and 100"
}
Реализованы, в т.ч., некоторые кастомные объекты исключений.
{
"movie": {
"id": "<int64>",
"title": "<string>",
"year": "<int32>",
"director": "<int32>",
"length": "<duration>",
"rating": "<int32>"
}
}
Для поля length
используется формат интервала из стандарта ISO-8601.
Поле director
принимает ID существующего директора.
{
"director": {
"id": "<int64>",
"fio": "<string>"
}
}
Возвращает список фильмов (код 200):
{
"list": [
{
"id": 3,
"title": "Example movie",
"year": 2018,
"director": 3,
"length": "PT51H4M",
"rating": 8
},
{
"id": 1,
"title": "Example movie",
"year": 2021,
"director": 3,
"length": "PT51H4M",
"rating": 8
}
]
}
Возвращает фильм по заданному ID:
{
"movie": {
"id": 3,
"title": "Example movie",
"year": 2018,
"director": 3,
"length": "PT51H4M",
"rating": 8
}
}
При отсутствии фильма возвращает код 404.
Принимает в качестве тела объект Movie:
{
"movie": {
"id": 3,
"title": "Example movie",
"year": 2018,
"director": 3,
"length": "PT51H4M",
"rating": 8
}
}
При передаче поля ID будет создан фильм c заданным ID, иначе он будет сгенерирован автоматически.
Возвращает объект фильма:
{
"movie": {
"id": 3,
"title": "Example movie",
"year": 2018,
"director": 3,
"length": "PT51H4M",
"rating": 8
}
}
Принимает в качестве тела объект Movie (без поля ID):
{
"movie": {
"title": "Example movie",
"year": 2018,
"director": 3,
"length": "PT51H4M",
"rating": 8
}
}
Если фильма не существует, будет возвращён код 404.
Возвращает объект фильма:
{
"movie": {
"id": 3,
"title": "Example movie",
"year": 2018,
"director": 3,
"length": "PT51H4M",
"rating": 8
}
}
Не принимает тело. Если фильма не существует, будет возвращён код 404. При успехе возвращает код 204 (Accepted).
Возвращает список директоров (код 200):
{
"list": [
{
"id": 3,
"fio": "Ivanov Ivan Ivanovich"
}
]
}
Возвращает директора по заданному ID:
{
"director": {
"id": 3,
"fio": "Ivanov Ivan Ivanovich"
}
}
При отсутствии директора возвращает код 404.
Принимает в качестве тела объект Director:
{
"director": {
"id": 3,
"fio": "Ivanov Ivan Ivanovich"
}
}
При передаче поля ID будет создан фильм c заданным ID, иначе он будет сгенерирован автоматически.
Возвращает объект директора:
{
"director": {
"id": 3,
"fio": "Ivanov Ivan Ivanovich"
}
}
Принимает в качестве тела объект Director (без поля ID):
{
"director": {
"id": 3,
"fio": "Ivanov Ivan Ivanovich"
}
}
Если директора не существует, будет возвращён код 404.
Возвращает объект директора:
{
"director": {
"id": 3,
"fio": "Ivanov Ivan Ivanovich"
}
}
Не принимает тело. Если директора не существует, будет возвращён код 404. При успехе возвращает код 204 (Accepted).