#API: Сервис поиска ближайших машин для перевозки грузов.
🔥 Необходимо разработать REST API сервиc для поиска ближайших машин к грузам.◼Стек и требования:
- Python (Django Rest Framework / FastAPI) на выбор.
- DB - Стандартный PostgreSQL.
- Приложение должно запускаться в docker-compose без дополнительных доработок.
- Порт - 8000.
- БД по умолчанию должна быть заполнена 20 машинами.
- Груз обязательно должен содержать следующие характеристики:
- локация pick-up;
- локация delivery;
- вес (1-1000);
- описание.
- Машина обязательно должна в себя включать следующие характеристики:
- уникальный номер (цифра от 1000 до 9999 + случайная заглавная буква английского алфавита в конце, пример: " 1234A", "2534B", "9999Z")
- текущая локация;
- грузоподъемность (1-1000).
- Локация должна содержать в себе следующие характеристики:
- город;
- штат;
- почтовый индекс (zip);
- широта;
- долгота.
Список уникальных локаций представлен в прикрепленном csv файле "uszips.csv".
Необходимо осуществить выгрузку списка в базу данных Postgres при запуске приложения.
- При создании машин по умолчанию локация каждой машины заполняется случайным образом;
- Расчет и отображение расстояния осуществляется в милях;
- Расчет расстояния должен осуществляться с помощью библиотеки geopy. help(geopy.distance). Маршруты не учитывать, использовать расстояние от точки до точки.
Сервис должен поддерживать следующие базовые функции:
- Создание нового груза (характеристики локаций pick-up, delivery определяются по введенному zip-коду);
- Получение списка грузов (локации pick-up, delivery, количество ближайших машин до груза ( =< 450 миль));
- Получение информации о конкретном грузе по ID (локации pick-up, delivery, вес, описание, список номеров ВСЕХ машин с расстоянием до выбранного груза);
- Редактирование машины по ID (локация (определяется по введенному zip-коду));
- Редактирование груза по ID (вес, описание);
- Удаление груза по ID.
Все что в уровне 1 + дополнительные функции:
- Фильтр списка грузов (вес, мили ближайших машин до грузов);
- Автоматическое обновление локаций всех машин раз в 3 минуты (локация меняется на другую случайную).
- Адекватность архитектуры приложения;
- Оптимизация работы приложения.
DB_NAME=postgres
POSTGRES_USER=postgres
POSTGRES_PASSWORD=postgres
DB_HOST=db
DB_PORT=5432
docker compose up --build
GET - http://localhost/api/cargos/
{
"id": 1,
"pick_up_location": {
"city": "Coamo",
"state": "Puerto Rico",
"zip_code": "00769",
"latitude": 18.09459,
"longitude": -66.3607
},
"delivery_location": {
"city": "Las Piedras",
"state": "Puerto Rico",
"zip_code": "00771",
"latitude": 18.18797,
"longitude": -65.86916
},
"weight": 124,
"description": "Груз 1",
"nearest_cars_count": 2
}
POST - http://localhost/api/cargos/
{
"pick_up_location": "99705",
"delivery_location": "01079",
"weight": 156,
"description": "Описание"
}
{
"pick_up_location": "99705",
"delivery_location": "01079",
"weight": 156,
"description": "Описание"
}
GET - http://localhost/api/cargos/<id>/
{
"id": 1,
"pick_up_location": {
"city": "Coamo",
"state": "Puerto Rico",
"zip_code": "00769",
"latitude": 18.09459,
"longitude": -66.3607
},
"delivery_location": {
"city": "Las Piedras",
"state": "Puerto Rico",
"zip_code": "00771",
"latitude": 18.18797,
"longitude": -65.86916
},
"weight": 124,
"description": "Описание груза",
"car_distances": [
{
"car_number": "2391N",
"distance": 1741.7072000898597
},
{
"car_number": "9021L",
"distance": 3038.160193413027
}
]
}
PATCH - http://localhost/api/cargos/<id>/
{
"weight": 500,
"description": "Новое описание"
}
{
"weight": 500,
"description": "Новое описание"
}
DELETE - http://localhost/api/cargos/<id>/
PATCH - http://localhost/api/cars/<id>/
{
"number": "7689N",
"load_capacity": 124,
"current_location": 11560
}
{
"id": 1,
"number": "7689N",
"load_capacity": 124,
"current_location": 11560
}