! В реальных условиях я бы просил уточнения требований, но так как
во-первых, это тестовое задание
во-вторых, писал на выходных и получение уточнений могло затянуться
я позволил себе пофантазировать, прошу отнестись с пониманием, если ожидалось получить от меня какие-то вопросы.
Реализовать REST АПИ и интерфейс оператора для системы парковки в торговом центре.
АПИ нужно для «открытия шлагбаумов» на въезд и выезд.
На входе номер автомобиля, на выходе можно или нет открывать шлагбаум.
В интерфейсе оператора – увидеть сколько мест на парковке сейчас занято.
Также необходимо иметь историю «посещений» для дальнейшей аналитики.
Реализовал два API
- простое
- rest
Зачем: потому что предполагаю, что шлагбаум не должен быть слишком "умным". И исходя из требования АПИ нужно для «открытия шлагбаумов» на въезд и выезд.
, делаю вывод что должно быть возможно
- получить разрешение на открытие
- зафиксировать заезд/выезд (полагаю что шлагбаум может открыться, но автомобиль все-таки не заехал - развернулся, сломался и т.д.)
методы
GET permission/:type/:vehicleNumber
(ожидаемые статусы: 200
)
получить разрешение на открытие, где
:type
- тип действия (in
- заезд, out
- выезд)
:vehicleNumber
- гос номер автомобиля
POST action/:type/:vehicleNumber
(ожидаемые статусы: 200
, 403
если ТС не должно выполнить действие)
получить разрешение на открытие, где
:type
- тип действия (in
- заезд, out
- выезд)
:vehicleNumber
- гос номер автомобиля
Зачем: слово REST в требованиях все-таки может быть не просто так, поэтому создал несколько методов для доступа к ресурсам.
GET /vehicles
200, 204
Получить список авторизованных ТС.
Примерный ответ:
{
"payload": [
{
"id": 102,
"number": "y000yy777",
"isActive": true,
"visits": []
},
{
"id": 103,
"number": "y001yy777",
"isActive": false,
"visits": []
},
{
"id": 104,
"number": "y002yy777",
"isActive": true,
"visits": [
{
"id": 98,
"vehicle": 104,
"createdAt": "2020-10-04T00:19:50+00:00",
"closedAt": null
}
]
}
]
}
GET /vehicle/:vehicleNumber
200, 404
Получить информацию по определенному ТС по его гос. номеру, где
:vehicleNumber
- гос номер автомобиля
Примерный ответ:
{
"payload": {
"id": 105,
"number": "y003yy777",
"isActive": true,
"visits": [
{
"id": 99,
"vehicle": 105,
"createdAt": "2020-10-04T00:19:50+00:00",
"closedAt": "2020-10-04T00:19:50+00:00"
}
]
}
}
GET /vehicle/:vehicleNumber/visits
200, 204
Получение списка "посещения" конкретного ТС, где
:vehicleNumber
- гос номер автомобиля
{
"payload": [
{
"id": 99,
"vehicle": {
"id": 105,
"number": "y003yy777",
"isActive": true,
"visits": [
99
]
},
"createdAt": "2020-10-04T00:19:50+00:00",
"closedAt": "2020-10-04T00:19:50+00:00"
}
]
}
POST /vehicle/:vehicleNumber/visits
200, 404
Сохранение "посещения", тело запроса может содержать только один параметр closed_at
в формате Y-m-d H:i:s
:
{
"payload": {
"id": 99,
"vehicle": {
"id": 105,
"number": "y003yy777",
"isActive": true,
"visits": [
99
]
},
"createdAt": "2020-10-04T00:19:50+00:00",
"closedAt": "2020-10-04T00:19:50+00:00"
}
}
POST /vehicle/:vehicleNumber/visit/:visitId
200, 404
Изменение "посещения", тело запроса может содержать только один параметр closed_at
в формате Y-m-d H:i:s
. (Можно было сделать запрос PUT, PATCH, думаю не критично)
{
"payload": {
"id": 99,
"vehicle": {
"id": 105,
"number": "y003yy777",
"isActive": true,
"visits": [
99
]
},
"createdAt": "2020-10-04T00:19:50+00:00",
"closedAt": "2020-10-04T00:19:50+00:00"
}
}
POST /vehicle/:vehicleNumber/last-visit
200, 404
Получение последнего посещения ТС.
{
"payload": {
"id": 99,
"vehicle": {
"id": 105,
"number": "y003yy777",
"isActive": true,
"visits": [
99
]
},
"createdAt": "2020-10-04T00:19:50+00:00",
"closedAt": "2020-10-04T00:19:50+00:00"
}
}
Реализован полноценный CRUD для ТС и их "посещений". Например:
Число занятых мест вывел под заголовком списка всех посещений /visit/
Добавил список посещений конкретного ТС на страницу детальной информации этого ТС.