Coder Social home page Coder Social logo

test-task's Introduction

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 и т.д.).

Example Run Test-Task

git pull privdim/dins-test-task
docker run -p 8080:8080 --env EXT_API_IP=172.17.0.1 --env EXT_API_PORT=8084 --rm -d privdim/dins-test-task

P.S. Изначально я пробовал дописать деплой приложения в docker-compose.yml, указав depends_on: api. Но данный способ не сработал. Я считаю, что проблема возникла в том, что api стартует и дает право далее стартовать test-task. Но так как test-task по времени конфигурируется меньше - возникает проблема, что на старте для инициализации данных оно обращается к api, которое еще не до конца стартовало.

test-task's People

Contributors

orlovdiga avatar

Watchers

James Cloos avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.