Мы — кружок программистов, которые любят котиков. Чтобы дешевле закупать корм для своих питомцев, мы арендовали небольшой склад, и оптом возим туда корм из Китая. Чтобы не путаться, мы накодили себе небольшую автоматизацию — сервис склада.
Мы окончили курсы бизнес-молодости и решили запилить себе интернет-магазин. Надо сделать эндпоинты, которые позволят нашему складу взаимодействовать с ним.
- Создание пользователей в магазине:
- Необходимо создавать пользователя с именем и уникальным id, никаких авторизаций и аутентификаций делать не нужно. Только создание пользователя по
POST api/user
.
- Логика работы магазина.
- Отображение всех активных товаров со склада. Т.е. по
GET /api/items
необходимо показать все активные товары, которые есть на данный момент на складе. - checkout flow (покупка). Покупка должна происходить по вызову
/api/checkout
эндпоинта со списком item ids, которые окажутся в покупке + id пользователя который существует в системе. - Во время выполнения checkout необходимо проверить пользователя и items на наличие. А также проверить, что пользователь выбрал 1+ item.
- Работа магазина должна быть независима от состояния склада. Т.е. если склад не работает - магазин должен обрабатывать заказы
- Payment flow
- Для оплаты необходимо знать две вещи: user id + цена ордера из checkout.
- Никаких интеграций не нужно - достаточно вывести в консоль, что оплата для такого пользователя прошла.
- Оплата должна быть изолирована от магазина, т.е. при упавшем магазине - оплата работает. И наоборот, при упавшей оплате - checkout работает.
- Необходимо сделать самую простую реализацию из всех возможных
- Никакой аутентификации и авторизации в системе не нужно
- Технолоигии:
- ruby + любой фреймворк и база данных, которую считаете нужными. Нагрузка на проект минимальна
- message broker: так как система уже шлет событие из inventory сервиса - вам придется выбрать любую из технологий и реализовать транспорт для события.
- Магазин + оплата должны быть покрыты тестами
- Проект должен быть сделан в приватном форке.
- Все части системы должны быть в одном репозитории.
- Поправьте нашу ошибку с ценами, они должны храниться в копейках.
Реализацию можно улучшать бесконечно, поэтому постарайтесь не тратить на работу больше 3 часов чистого времени.
В сервисе склада реализованно 3 эндпоинта: создание товара и список всех товаров, а также изменение статуса товара по id. В момент создания товара отправляется событие которое слушается другими частями системы.
cd inventory-serivce
bundle
bundle exec rackup
GET /api/items
- возвращает список всех items которые есть на складеPOST /api/item
- Создает новый активный айтем в системе- параметры:
{ "item": { "name": String, "price": Int } }
- пример body:
{ "item": { "name": "New item", "price": 4000 } }
- параметры:
PUT /api/items/:id/toggle_status
- меняет статус айтема на противоположный, возвращаетok