f213 / ruby-job-task

Тестовое задание на позицию ruby разработчика

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Тестовое задание

Контекст

Мы — кружок программистов, которые любят котиков. Чтобы дешевле закупать корм для своих питомцев, мы арендовали небольшой склад, и оптом возим туда корм из Китая. Чтобы не путаться, мы накодили себе небольшую автоматизацию — сервис склада.

Что необходимо сделать

Мы окончили курсы бизнес-молодости и решили запилить себе интернет-магазин. Надо сделать эндпоинты, которые позволят нашему складу взаимодействовать с ним.

  1. Создание пользователей в магазине:
  • Необходимо создавать пользователя с именем и уникальным id, никаких авторизаций и аутентификаций делать не нужно. Только создание пользователя по POST api/user.
  1. Логика работы магазина.
  • Отображение всех активных товаров со склада. Т.е. по GET /api/items необходимо показать все активные товары, которые есть на данный момент на складе.
  • checkout flow (покупка). Покупка должна происходить по вызову /api/checkout эндпоинта со списком item ids, которые окажутся в покупке + id пользователя который существует в системе.
  • Во время выполнения checkout необходимо проверить пользователя и items на наличие. А также проверить, что пользователь выбрал 1+ item.
  • Работа магазина должна быть независима от состояния склада. Т.е. если склад не работает - магазин должен обрабатывать заказы
  1. Payment flow
  • Для оплаты необходимо знать две вещи: user id + цена ордера из checkout.
  • Никаких интеграций не нужно - достаточно вывести в консоль, что оплата для такого пользователя прошла.
  • Оплата должна быть изолирована от магазина, т.е. при упавшем магазине - оплата работает. И наоборот, при упавшей оплате - checkout работает.

Технические требования

  • Необходимо сделать самую простую реализацию из всех возможных
  • Никакой аутентификации и авторизации в системе не нужно
  • Технолоигии:
    • ruby + любой фреймворк и база данных, которую считаете нужными. Нагрузка на проект минимальна
    • message broker: так как система уже шлет событие из inventory сервиса - вам придется выбрать любую из технологий и реализовать транспорт для события.
  • Магазин + оплата должны быть покрыты тестами

Требование по реализации

  • Проект должен быть сделан в приватном форке.
  • Все части системы должны быть в одном репозитории.
  • Поправьте нашу ошибку с ценами, они должны храниться в копейках.

Реализацию можно улучшать бесконечно, поэтому постарайтесь не тратить на работу больше 3 часов чистого времени.

Inventory service

В сервисе склада реализованно 3 эндпоинта: создание товара и список всех товаров, а также изменение статуса товара по id. В момент создания товара отправляется событие которое слушается другими частями системы.

Как запустить

cd inventory-serivce
bundle
bundle exec rackup

HTTP API documentation

  • 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

About

Тестовое задание на позицию ruby разработчика


Languages

Language:Ruby 100.0%