Rest api on Spring Boot. Testing task to Java Developer position for SeverGroup Company.
Technical assignment:
Создать REST-сервис книжного магазина по поиску, добавлению и удалению книг из реестра
Хранилище магазина представляет собой набор стеллажей, с тремя уровнями, на каждом уровне выставлены книги в случайном порядке
Требуется написать следующий API:
-
Получение книги по ее id
-
Получение списка книг по id cтеллажа, либо по номеру уровня, либо по обоим параметрам одновременно
-
Добавление книги на определенный стеллаж и уровень
-
Удаление книги по id
-
Обновление информации по id книги
-
Поиск книги в хранилище по ее названию
Требуется покрыть тестами API, и компоненты сервиса.
Используемые технологии: Java 8+, Spring Boot, Maven/Gradle (на выбор кандидата), JUnit
Хранилище - in memory
- Бонус: использовать реальную БД для реализации хранилища
To use this repository, you need to download it. Next, you need to create an application.yml in src/main/resource/ and add the following configuration there:
Application.yml
spring:
jpa:
database: POSTGRESQL
show-sql: true
hibernate:
ddl-auto: create-drop
#ddl-auto: update
datasource:
platform: postgres
url: jdbc:postgresql://localhost:5432/DATABASE_NAME
username: USERNAME
password: PASSWORD
driver-class-name: org.postgresql.Driver
P.S. Fully uppercase values are not allowed, you need to replace them with existing values.
This application has multiple entry points:
- GET /bookStore/books/{bookId} - returns book by id.
- GET /bookStore/books/rack/{rackId} - returns books by rackId..
- GET /bookStore/books/level/{number} - returns books by shelf level.
- GET /bookStore/books/rack/{rackId}/level/{number} - returns books by rackId and shelf level.
- POST /bookStore/books - add book.
- DELETE /bookStore/books/{bookId} - delete book by id.
- PUT /bookStore/books/{bookId}/update - update book by id.
- POST /bookStore/books/sarch - search book by name.
Request examples:
GET
response
{
"id": "2"
"name": "Morphine",
"author": "Bulgakov Mikhail"
"rackId": "2",
"levelNumber": "SECOND",
}
GET
response
[
{
"id": "2"
"name": "Morphine",
"author": "Bulgakov Mikhail"
"rackId": "2",
"levelNumber": "SECOND",
},
{
"id": "1",
"name": "The Master and Margarita",
"author": "Bulgakov Mikhail"
"rackId": "2",
"levelNumber": "SECOND",
}
]
GET
response
[
{
"id": "4"
"name": "Count of Monte Cristo",
"author": "Alexandre Dumas"
"rackId": "1",
"levelNumber": "FIRST",
},
{
"id": "5"
"name": "Time doesn't wait",
"author": "Jack London"
"rackId": "1",
"levelNumber": "FIRST",
},
{
"name": "Morphine",
"author": "Bulgakov Mikhail"
"rackId": "2",
"levelNumber": "FIRST",
}
]
GET
response
[
{
"id": "4"
"name": "Count of Monte Cristo",
"author": "Alexandre Dumas"
"rackId": "1",
"levelNumber": "FIRST",
},
{
"id": "5"
"name": "Time doesn't wait",
"author": "Jack London"
"rackId": "1",
"levelNumber": "FIRST",
}
]
POST
request
{
"name": "Morphine",
"author": "Bulgakov Mikhail"
"rackId": "2",
"levelNumber": "FIRST",
}
response
{
"id": "2"
"name": "Morphine",
"author": "Bulgakov Mikhail"
"rackId": "2",
"levelNumber": "SECOND",
}
DELETE
This request and response haven't body.
PUT
request
{
"name": "Morphine",
"author": "Bulgakov Mikhail"
"rackId": "2",
"levelNumber": "THIRD",
}
response
{
"id": "2"
"name": "Morphine",
"author": "Bulgakov Mikhail"
"rackId": "2",
"levelNumber": "THIRD",
}
POST
request
{
"name": "The Master and Margarita"
}
response
{
"id": "1",
"name": "The Master and Margarita",
"author": "Bulgakov Mikhail"
"rackId": "2",
"levelNumber": "SECOND",
}