andreysvyat / test_dins

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

API cars

API with cars characteristics

Run

  1. Download docker desktop for your OS

    https://www.docker.com/products/docker-desktop
    
  2. 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)

  1. You can check running containers with command

    docker ps
  2. API located at

    http://localhost:8084
    
  3. 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 приложение, используя этот проект в качестве заготовки, которое:

  1. При запуске парсит данные из API cars characteristics, сохраняет данные в памяти таким образом, что они гарантировано будут храниться в единственном экземпляре некоторой структуры. В качестве дополнительного плюса будет расценено, если парсинг будет производиться с эндпоинтов, которые оканчиваются на /paged (там используется Spring Pageable https://docs.spring.io/spring-data/rest/docs/2.0.0.M1/reference/html/paging-chapter.html).

  2. Содержит эндпоинт, выдающий массив автомобилей в формате JSON.

    GET /api/cars
    

    По каждому автомобилю в ответе необходимо вернуть следующие поля:

    • идентификатор автомобиля (id)
    • название сегмента (segment)
    • название бренда (brand)
    • название модели (model)
    • наименование страны производителя (country)
    • наименование поколения модели (generation)
    • наименование модификации (modification).

    В запросе могут присутствовать следующие параметры (если параметр указан не верно, приложение не должно "падать" или выдавать 500 код, должен возвращаться корректный ответ, например HTTP CODE 404, что ничего не найдено):

    1. country: если он задан, то должны выдаваться только автомобили, производимые указанной страной.
    2. segment: если он задан, то должны выдаваться только автомобили, принадлежащие указанному сегменту.
    3. minEngineDisplacement: если он задан, то должны выдаваться только автомобили, у которых рабочий объем двигателя выше или равен указанному значению (в случае неверного параметра, например если это не число, выдавать HTTP CODE 400).
    4. minEngineHorsepower: если он задан, то должны выдаваться только автомобили, мощность которых выше или равна указанному значению (в случае неверного параметра, например если это не число, выдавать HTTP CODE 400).
    5. minMaxSpeed: если он задан, то должны выдаваться только автомобили, максимальная скорость которых выше или равна указанному значению (в случае неверного параметра, например если это не число, выдавать HTTP CODE 400).
    6. search: если он задан, то проводится поиск по следующим полям: по названию модели, поколению и названию модификации.
    7. isFull: принимает true/false, если он true, то по автомобилю должна выдаваться полная информация: должны быть добавлены характеристики двигателя и кузова в отдельные объекты engine и body.
    8. (дополнительный плюс) year: если он задан, то выдаются только автомобили, которые выпускались в заданный год (в случае неверного параметра, например если это не число, выдавать HTTP CODE 400).
    9. (дополнительный плюс) bodyStyle: если он задан, то выдаются только автомобили, у которых есть этот тип кузова.

    Фильтрация по всем параметрам сразу не является обязательной, но будет рассматриваться как дополнительный плюс.

    Пример запроса:

    http://localhost:8080/api/cars?country=Germany&segment=E-segment&minEngineDisplacement=4.0&minEngineHorsepower=250&minMaxSpeed=200&search=5
    
  3. Содержит эндпоинты со следующими словарями, на основе только тех данных, которые получены из внешней API:

    • всех возможных типов топлива
    GET /api/fuel-types
    
    • всех возможных типов кузова
    GET /api/body-styles
    
    • всех возможных типов двигателя
    GET /api/engine-types
    
    • всех возможных типов привода
    GET /api/wheel-drives
    
    • всех возможных типов коробок передач
    GET /api/gearboxes
    
  4. Содержит эндпоинт, выдающий значение средней максимальной скорости по бренду/модели (параметры в запросе brand/model). Если заданного бренда или модели нет – выдавать HTTP CODE 404. В случае если указаны одновременно оба параметра – выдавать HTTP CODE 400.

    GET /api/max-speed
    

    Пример запроса:

    http://localhost:8080/api/max-speed?brand=BMW
    

Для проверки проект должен быть выложен в открытый доступ на какой-либо платформе (github, gitlab и т.д.).

About


Languages

Language:Java 100.0%