https://github.com/davydovanton/ruby-job-task
Тестовое задание на позицию ruby разработчика
https://github.com/davydovanton/ruby-job-task
Last synced: 2 months ago
JSON representation
Тестовое задание на позицию ruby разработчика
- Host: GitHub
- URL: https://github.com/davydovanton/ruby-job-task
- Owner: davydovanton
- Created: 2021-04-15T11:23:43.000Z (about 4 years ago)
- Default Branch: master
- Last Pushed: 2021-04-26T18:17:26.000Z (about 4 years ago)
- Last Synced: 2025-03-29T06:01:30.537Z (3 months ago)
- Language: Ruby
- Size: 11.7 KB
- Stars: 6
- Watchers: 4
- Forks: 5
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
# Тестовое задание
## Контекст
Мы — кружок программистов, которые любят котиков. Чтобы дешевле закупать корм для своих питомцев, мы арендовали небольшой склад, и оптом возим туда корм из Китая. Чтобы не путаться, мы накодили себе небольшую автоматизацию — сервис склада.
### Что необходимо сделать
Мы окончили курсы бизнес-молодости и решили запилить себе интернет-магазин. Надо сделать эндпоинты, которые позволят нашему складу взаимодействовать с ним.
1. Создание пользователей в магазине:
- Необходимо создавать пользователя с именем и уникальным id, никаких авторизаций и аутентификаций делать не нужно. Только создание пользователя по `POST api/user`.
2. Логика работы магазина.
- Отображение всех активных товаров со склада. Т.е. по `GET /api/items` необходимо показать все активные товары, которые есть на данный момент на складе.
- checkout flow (покупка). Покупка должна происходить по вызову `/api/checkout` эндпоинта со списком item ids, которые окажутся в покупке + id пользователя который существует в системе.
- Во время выполнения checkout необходимо проверить пользователя и items на наличие. А также проверить, что пользователь выбрал 1+ item.
- Работа магазина должна быть независима от состояния склада. Т.е. если склад не работает - магазин должен обрабатывать заказы
3. 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`