Тестовое задание на позицию стажёра-бэкендера

Микросервис для работы с балансом пользователей

Основное задание (минимум):

Метод начисления средств на баланс. Принимает id пользователя и сколько средств зачислить. Метод резервирования средств с основного баланса на отдельном счете. Принимает id пользователя, ИД услуги, ИД заказа, стоимость. Метод признания выручки – списывает из резерва деньги, добавляет данные в отчет для бухгалтерии. Принимает id пользователя, ИД услуги, ИД заказа, сумму. Метод получения баланса пользователя. Принимает id пользователя.

Требования к сервису:

  1. Сервис должен предоставлять HTTP API с форматом JSON как при отправке запроса, так и при получении результата.
  2. Язык разработки: Golang.
  3. Фреймворки и библиотеки можно использовать любые.
  4. Реляционная СУБД: MySQL или PostgreSQL.
  5. Использование docker и docker-compose для поднятия и развертывания dev-среды.
  6. Весь код должен быть выложен на Github с README файлом с инструкцией по запуску и примерами запросов/ответов (можно просто описать в Readme методы, можно через Postman, можно в Readme curl запросы скопировать, и так далее).
  7. Если есть потребность в асинхронных сценариях, то использование любых систем очередей - допускается.
  8. При возникновении вопросов по ТЗ оставляем принятие решения за кандидатом (в таком случае Readme файле к проекту должен быть указан список вопросов с которыми кандидат столкнулся и каким образом он их решил).
  9. Разработка интерфейса в браузере НЕ ТРЕБУЕТСЯ. Взаимодействие с API предполагается посредством запросов из кода другого сервиса. Для тестирования можно использовать любой удобный инструмент. Например: в терминале через curl или Postman.

Будет плюсом:

  • Покрытие кода тестами.
  • Swagger файл для вашего API.
  • Реализовать сценарий разрезервирования денег, если услугу применить не удалось.

Дополнительные задания:

  • Доп. задание 1:
    Бухгалтерия раз в месяц просит предоставить сводный отчет по всем пользователем, с указанием сумм выручки по каждой из предоставленной услуги для расчета и уплаты налогов.
    Задача: реализовать метод для получения месячного отчета. На вход: год-месяц. На выходе ссылка на CSV файл.
    Пример отчета:
    название услуги 1;общая сумма выручки за отчетный период
    название услуги 2;общая сумма выручки за отчетный период 
  • Доп. задание 2:
    Пользователи жалуются, что не понимают за что были списаны (или зачислены) средства.
    Задача: необходимо предоставить метод получения списка транзакций с комментариями откуда и зачем были начислены/списаны средства с баланса. Необходимо предусмотреть пагинацию и сортировку по сумме и дате.

Запуск

  1. Склонировать репозиторий на локальную машину
    git clone https://github.com/fdddfdfs/avito_test.git
    cd avito_test
  2. Запустить сервисы в Docker
    docker-compose up -d
  3. Swagger документация доступна по адресу (по умолчанию)
    localhost:3200

Примеры запросов

  1. Получить баланс пользователя с userID = 1
    curl -X 'GET' \
    'http://localhost/balance/1' \
    -H 'accept: application/json'
  2. Начислить 1000 пользователю с userID = 10
    curl -X 'PUT' \
    'http://localhost/balance' \
    -H 'accept: application/json' \
    -H 'Content-Type: application/json' \
    -d '{
    "userID": 10,
    "balance": 1000
    }'
  3. Зарезервировать 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
    }'
  4. Признать выручку 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
    }'
  5. Разрезервировать 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
    }'
  6. Получить отчет для бухгалтерии для 2022 года 11 месяца
    curl -X 'GET' \
    'http://localhost/report/2022/11' \
    -H 'accept: application/json'
  7. Получить 1 страницу списка транзакций пользователя с userID = 10, отсортировав по сумме в порядке убывания
    curl -X 'GET' \
    'http://localhost/report/transaction/10/1/pd' \
    -H 'accept: application/json'