API with cars characteristics
-
Download docker desktop for your OS
https://www.docker.com/products/docker-desktop
-
Run command from root of this project in terminal
docker-compose up -d
If you get an error Filesharing has been cancelled on Windows – you need to add project directory to Resources -> File Sharing in Docker Desktop. (see: https://stackoverflow.com/questions/60754297/docker-compose-failed-to-build-filesharing-has-been-cancelled)
-
You can check running containers with command
docker ps
-
API located at
http://localhost:8084
-
To stop all services use
docker-compose stop
Дано несовершенное API со следующеми эндпоинтами (инструкцию по запуску см. выше):
- GET /api/v1/cars
[
{
"id": 27,
"segment": "C-segment",
"brand_id": 17,
"model": "Golf",
"generation": "Mk8",
"modification": "1.5 TSI"
},
{
"id": 28,
"segment": "C-segment",
"brand_id": 17,
"model": "Golf",
"generation": "Mk7",
"modification": "2.0 TDI 4Motion"
},
...
]
- GET /api/v1/cars/{carId}
{
"id": 27,
"segment": "C-segment",
"brand_id": 17,
"model": "Golf",
"generation": "Mk8",
"modification": "1.5 TSI",
"year_range": "2019-present",
"engine_type": "GASOLINE",
"engine_cylinders": "L4",
"engine_displacement": 1498,
"engine_horsepower": 150,
"gearbox": "ROBOTIC",
"wheel_drive": "FWD",
"body_length": 4284,
"body_width": 1789,
"body_height": 1491,
"body_style": "Hatchback",
"acceleration": 8.5,
"max_speed": 224
}
- GET /api/v1/brands
[
{
"id": 1,
"title": "Audi",
"country": "Germany"
},
{
"id": 2,
"title": "Bentley",
"country": "England"
},
{
"id": 3,
"title": "BMW",
"country": "Germany"
},
...
]
Пусть характеристики двигателя это:
- engine_type
- engine_cylinders
- engine_displacement
- engine_horsepower,
а характеристики кузова:
- body_length
- body_width
- body_height
- body_style
Необходимо написать Spring Boot приложение, используя этот проект в качестве заготовки, которое:
-
При запуске парсит данные из API cars characteristics, сохраняет данные в памяти таким образом, что они гарантировано будут храниться в единственном экземпляре некоторой структуры. В качестве дополнительного плюса будет расценено, если парсинг будет производиться с эндпоинтов, которые оканчиваются на
/paged
(там используется Spring Pageable https://docs.spring.io/spring-data/rest/docs/2.0.0.M1/reference/html/paging-chapter.html). -
Содержит эндпоинт, выдающий массив автомобилей в формате JSON.
GET /api/cars
По каждому автомобилю в ответе необходимо вернуть следующие поля:
- идентификатор автомобиля (id)
- название сегмента (segment)
- название бренда (brand)
- название модели (model)
- наименование страны производителя (country)
- наименование поколения модели (generation)
- наименование модификации (modification).
В запросе могут присутствовать следующие параметры (если параметр указан не верно, приложение не должно "падать" или выдавать 500 код, должен возвращаться корректный ответ, например HTTP CODE 404, что ничего не найдено):
- country: если он задан, то должны выдаваться только автомобили, производимые указанной страной.
- segment: если он задан, то должны выдаваться только автомобили, принадлежащие указанному сегменту.
- minEngineDisplacement: если он задан, то должны выдаваться только автомобили, у которых рабочий объем двигателя выше или равен указанному значению (в случае неверного параметра, например если это не число, выдавать HTTP CODE 400).
- minEngineHorsepower: если он задан, то должны выдаваться только автомобили, мощность которых выше или равна указанному значению (в случае неверного параметра, например если это не число, выдавать HTTP CODE 400).
- minMaxSpeed: если он задан, то должны выдаваться только автомобили, максимальная скорость которых выше или равна указанному значению (в случае неверного параметра, например если это не число, выдавать HTTP CODE 400).
- search: если он задан, то проводится поиск по следующим полям: по названию модели, поколению и названию модификации.
- isFull: принимает true/false, если он true, то по автомобилю должна выдаваться полная информация: должны быть добавлены характеристики двигателя и кузова в отдельные объекты engine и body.
- (дополнительный плюс) year: если он задан, то выдаются только автомобили, которые выпускались в заданный год (в случае неверного параметра, например если это не число, выдавать HTTP CODE 400).
- (дополнительный плюс) bodyStyle: если он задан, то выдаются только автомобили, у которых есть этот тип кузова.
Фильтрация по всем параметрам сразу не является обязательной, но будет рассматриваться как дополнительный плюс.
Пример запроса:
http://localhost:8080/api/cars?country=Germany&segment=E-segment&minEngineDisplacement=4.0&minEngineHorsepower=250&minMaxSpeed=200&search=5
-
Содержит эндпоинты со следующими словарями, на основе только тех данных, которые получены из внешней API:
- всех возможных типов топлива
GET /api/fuel-types
- всех возможных типов кузова
GET /api/body-styles
- всех возможных типов двигателя
GET /api/engine-types
- всех возможных типов привода
GET /api/wheel-drives
- всех возможных типов коробок передач
GET /api/gearboxes
-
Содержит эндпоинт, выдающий значение средней максимальной скорости по бренду/модели (параметры в запросе brand/model). Если заданного бренда или модели нет – выдавать HTTP CODE 404. В случае если указаны одновременно оба параметра – выдавать HTTP CODE 400.
GET /api/max-speed
Пример запроса:
http://localhost:8080/api/max-speed?brand=BMW
Для проверки проект должен быть выложен в открытый доступ на какой-либо платформе (github, gitlab и т.д.).