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

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


Проблема:



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



Задача:



Необходимо реализовать микросервис для работы с балансом пользователей (зачисление средств, списание средств, перевод средств от пользователя к пользователю, а также метод получения баланса пользователя). Сервис должен предоставлять HTTP API и принимать/отдавать запросы/ответы в формате JSON.



Сценарии использования:



Далее описаны несколько упрощенных кейсов приближенных к реальности.



1. Сервис биллинга с помощью внешних мерчантов (аля через visa/mastercard) обработал зачисление денег на наш счет. Теперь биллингу нужно добавить эти деньги на баланс пользователя.



2. Пользователь хочет купить у нас какую-то услугу. Для этого у нас есть специальный сервис управления услугами, который перед применением услуги резервирует деньги на отдельном счете и потом списывает в доход компании.



3.Бухгалтерия раз в месяц хочет получить сводный отчет по всем пользователям в разрезе каждой услуги.



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



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.

Реализовать сценарий разрезервирования денег, если услугу применить не удалось.

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



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



Детали по заданию:



- По умолчанию сервис не содержит в себе никаких данных о балансах (пустая табличка в БД). Данные о балансе появляются при первом зачислении денег.

- Валидацию данных и обработку ошибок оставляем на усмотрение кандидата.

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

- Механизм миграции не нужен. Достаточно предоставить конечный SQL файл с созданием всех необходимых таблиц в БД.

- Баланс пользователя - очень важные данные в которых недопустимы ошибки (фактически мы работаем тут с реальными деньгами). Необходимо всегда держать баланс в актуальном состоянии и не допускать ситуаций когда баланс может уйти в минус.

- Мультивалютность реализовывать не требуется.

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



Далее перечислены дополнительные задания. Они не являются обязательными, но их выполнение даст существенный плюс перед другими кандидатами.



@golang_interview