https://github.com/devstackq/avito-task
Микросервис для работы с балансом пользователей.
https://github.com/devstackq/avito-task
Last synced: 7 months ago
JSON representation
Микросервис для работы с балансом пользователей.
- Host: GitHub
- URL: https://github.com/devstackq/avito-task
- Owner: devstackq
- Created: 2022-03-01T09:56:27.000Z (over 4 years ago)
- Default Branch: main
- Last Pushed: 2022-03-02T15:26:43.000Z (over 4 years ago)
- Last Synced: 2024-12-28T07:43:24.161Z (over 1 year ago)
- Language: Go
- Homepage:
- Size: 37.1 KB
- Stars: 0
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
# avito-task# Тестовое задание на позицию стажера-бекендера
## Микросервис для работы с балансом пользователей.
**Проблема:**
В нашей компании есть много различных микросервисов. Многие из них так или иначе хотят взаимодействовать с балансом пользователя. На архитектурном комитете приняли решение централизовать работу с балансом пользователя в отдельный сервис.
**Задача:**
Необходимо реализовать микросервис для работы с балансом пользователей (зачисление средств, списание средств, перевод средств от пользователя к пользователю, а также метод получения баланса пользователя). Сервис должен предоставлять HTTP API и принимать/отдавать запросы/ответы в формате JSON.
**Сценарии использования:**
Далее описаны несколько упрощенных кейсов приближенных к реальности.
1. Сервис биллинга с помощью внешних мерчантов (аля через visa/mastercard) обработал зачисление денег на наш счет. Теперь биллингу нужно добавить эти деньги на баланс пользователя.
2. Пользователь хочет купить у нас какую-то услугу. Для этого у нас есть специальный сервис управления услугами, который перед применением услуги проверяет баланс и потом списывает необходимую сумму.
3. В ближайшем будущем планируется дать пользователям возможность перечислять деньги друг-другу внутри нашей платформы. Мы решили заранее предусмотреть такую возможность и заложить ее в архитектуру нашего сервиса.
**Требования к коду:**
1. Язык разработки: Go. Мы готовы рассматривать решения на PHP/Python/другом языке, но приоритетом для нас является именно golang.
2. Фреймворки и библиотеки можно использовать любые
3. Реляционная СУБД: MySQL или PostgreSQL
4. Весь код должен быть выложен на Github с Readme файлом с инструкцией по запуску и примерами запросов/ответов (можно просто описать в Readme методы, можно через Postman, можно в Readme curl запросы скопировать, вы поняли идею...)
5. Если есть потребность, можно подключить кеши(Redis) и/или очереди(RabbitMQ, Kafka)
6. При возникновении вопросов по ТЗ оставляем принятие решения за кандидатом (в таком случае Readme файле к проекту должен быть указан список вопросов с которыми кандидат столкнулся и каким образом он их решил)
7. Разработка интерфейса в браузере НЕ ТРЕБУЕТСЯ. Взаимодействие с АПИ предполагается посредством запросов из кода другого сервиса. Для тестирования можно использовать любой удобный инструмент. Например: в терминале через curl или Postman.
**Будет плюсом:**
1. Использование docker и docker-compose для поднятия и развертывания dev-среды.
2. Методы АПИ возвращают человеко-читабельные описания ошибок и соответвующие статус коды при их возникновении.
3. Все реализовано на GO, все-же мы собеседуем на GO разработчика. HINT: На собеседовании так или иначе будут вопросы по Go. Кто прочитал, тот молодец :)
4. Написаны unit/интеграционные тесты.
**Основное задание (минимум):**
Метод начисления средств на баланс. Принимает id пользователя и сколько средств зачислить.
Метод списания средств с баланса. Принимает id пользователя и сколько средств списать.
Метод перевода средств от пользователя к пользователю. Принимает id пользователя с которого нужно списать средства, id пользователя которому должны зачислить средства, а также сумму.
Метод получения текущего баланса пользователя. Принимает id пользователя. Баланс всегда в рублях.
**Детали по заданию:**
1. Методы начисления и списания можно объединить в один, если это позволяет общая архитектура.
2. По умолчанию сервис не содержит в себе никаких данных о балансах (пустая табличка в БД). Данные о балансе появляются при первом зачислении денег.
3. Валидацию данных и обработку ошибок оставляем на усмотрение кандидата.
4. Список полей к методам не фиксированный. Перечислен лишь необходимый минимум. В рамках выполнения доп. заданий возможны дополнительные поля.
5. Механизм миграции не нужен. Достаточно предоставить конечный SQL файл с созданием всех необходимых таблиц в БД.
6. Баланс пользователя - очень важные данные в которых недопустимы ошибки (фактически мы работаем тут с реальными деньгами). Необходимо всегда держать баланс в актуальном состоянии и не допускать ситуаций когда баланс может уйти в минус.
7. Валюта баланса по умолчанию всегда рубли.
**Дополнительные задания**
Далее перечислены доп. задания. Они не являются обязательными, но их выполнение даст существенный плюс перед другими кандидатами.
*Доп. задание 1:*
Эффективные менеджеры захотели добавить в наши приложения товары и услуги в различных от рубля валютах. Необходима возможность вывода баланса пользователя в отличной от рубля валюте.
Задача: добавить к методу получения баланса доп. параметр. Пример: ?currency=USD.
Если этот параметр присутствует, то мы должны конвертировать баланс пользователя с рубля на указанную валюту. Данные по текущему курсу валют можно взять отсюда https://exchangeratesapi.io/ или из любого другого открытого источника.
Примечание: напоминаем, что базовая валюта которая хранится на балансе у нас всегда рубль. В рамках этой задачи конвертация всегда происходит с базовой валюты.
*Доп. задание 2:*
Пользователи жалуются, что не понимают за что были списаны (или зачислены) средства.
Задача: необходимо предоставить метод получения списка транзакций с комментариями откуда и зачем были начислены/списаны средства с баланса. Необходимо предусмотреть пагинацию и сортировку по сумме и дате.
1 Добавить новую валюту; (для конвертации, еще и usd)
POST: /v1/currency
body : {currency_name : rub}
2 Добавить нового пользователя(автоматически открывается счет с валютой(рубль))
POST : /v1/user
{name:"Lora", email:"user@mail.ru", password:"123user"}
Проводить транзакции, пополнить, вычесть баланс по id пользователя
3.1 POST : /v1/account/add/:{id}, body : {wallet_amount: 100.0}
3.2 POST : /v1/account/debit/:{id} body : {wallet_amount: 100.0}
3.3 Перевод другому пользователю, по id, нужно создать 2 пользователей
POST : /v1/account/transfer/:{id}; body : {receiver_id : 2, wallet_amount: 100.0}
3.4 Проверка баланса по id
POST: /v1/account/balance/:{id}, body {currency_type:1}
3.5 Конвертация баланса rub-usd
3.5.1 Вначале надо создать новую валюту для юзера
POST :/v1/account/currency/:{user_id}
а после произвести конвертацию
POST :/v1/account/convert/:{currency}