Метод начисления средств на баланс. Принимает id пользователя и сколько средств зачислить. Метод резервирования средств с основного баланса на отдельном счете. Принимает id пользователя, ИД услуги, ИД заказа, стоимость. Метод признания выручки – списывает из резерва деньги, добавляет данные в отчет для бухгалтерии. Принимает id пользователя, ИД услуги, ИД заказа, сумму. Метод получения баланса пользователя. Принимает id пользователя.
- Сервис должен предоставлять HTTP API с форматом JSON как при отправке запроса, так и при получении результата.
- Язык разработки: Golang.
- Фреймворки и библиотеки можно использовать любые.
- Реляционная СУБД: MySQL или PostgreSQL.
- Использование docker и docker-compose для поднятия и развертывания dev-среды.
- Весь код должен быть выложен на Github с README файлом с инструкцией по запуску и примерами запросов/ответов (можно просто описать в Readme методы, можно через Postman, можно в Readme curl запросы скопировать, и так далее).
- Если есть потребность в асинхронных сценариях, то использование любых систем очередей - допускается.
- При возникновении вопросов по ТЗ оставляем принятие решения за кандидатом (в таком случае Readme файле к проекту должен быть указан список вопросов с которыми кандидат столкнулся и каким образом он их решил).
- Разработка интерфейса в браузере НЕ ТРЕБУЕТСЯ. Взаимодействие с API предполагается посредством запросов из кода другого сервиса. Для тестирования можно использовать любой удобный инструмент. Например: в терминале через curl или Postman.
- Покрытие кода тестами.
- Swagger файл для вашего API.
- Реализовать сценарий разрезервирования денег, если услугу применить не удалось.
- Доп. задание 1:
Бухгалтерия раз в месяц просит предоставить сводный отчет по всем пользователем, с указанием сумм выручки по каждой из предоставленной услуги для расчета и уплаты налогов.
Задача: реализовать метод для получения месячного отчета. На вход: год-месяц. На выходе ссылка на CSV файл.
Пример отчета:
название услуги 1;общая сумма выручки за отчетный период
название услуги 2;общая сумма выручки за отчетный период
- Доп. задание 2:
Пользователи жалуются, что не понимают за что были списаны (или зачислены) средства.
Задача: необходимо предоставить метод получения списка транзакций с комментариями откуда и зачем были начислены/списаны средства с баланса. Необходимо предусмотреть пагинацию и сортировку по сумме и дате.
- Склонировать репозиторий на локальную машину
git clone https://github.com/fdddfdfs/avito_test.git cd avito_test
- Запустить сервисы в Docker
docker-compose up -d
- Swagger документация доступна по адресу (по умолчанию)
localhost:3200
- Получить баланс пользователя с userID = 1
curl -X 'GET' \ 'http://localhost/balance/1' \ -H 'accept: application/json'
- Начислить 1000 пользователю с userID = 10
curl -X 'PUT' \ 'http://localhost/balance' \ -H 'accept: application/json' \ -H 'Content-Type: application/json' \ -d '{ "userID": 10, "balance": 1000 }'
- Зарезервировать 1000 для пользователя с userID = 10, для операции с serviceID = 7 и заказом orderID = 9
curl -X 'POST' \ 'http://localhost/reservation' \ -H 'accept: */*' \ -H 'Content-Type: application/json' \ -d '{ "userID": 10, "orderID": 9, "serviceID": 7, "price": 1000 }'
- Признать выручку 1000 для пользователя с userID = 10, для операции с serviceID = 7 и заказом orderID = 9
curl -X 'PUT' \ 'http://localhost/reservation/accept' \ -H 'accept: */*' \ -H 'Content-Type: application/json' \ -d '{ "userID": 10, "orderID": 9, "serviceID": 7, "price": 1000 }'
- Разрезервировать 1000 для пользователя с userID = 10, для операции с serviceID = 7 и заказом orderID = 9
curl -X 'PUT' \ 'http://localhost/reservation/cancel' \ -H 'accept: application/json' \ -H 'Content-Type: application/json' \ -d '{ "userID": 10, "orderID": 9, "serviceID": 7, "price": 1000 }'
- Получить отчет для бухгалтерии для 2022 года 11 месяца
curl -X 'GET' \ 'http://localhost/report/2022/11' \ -H 'accept: application/json'
- Получить 1 страницу списка транзакций пользователя с userID = 10, отсортировав по сумме в порядке убывания
curl -X 'GET' \ 'http://localhost/report/transaction/10/1/pd' \ -H 'accept: application/json'