Вам необходимо симулировать банковский счет, поддерживающий операции открытия, закрытия, зачисления (снятия) средств и получение баланса. Остерегайтесь конкуррентных транзакций!
Доступ к банковскому счету может быть получен различными способами. Клиенты могут зачислять и снимать средства, используя интернет, мобильные телефоны, и т.д.
Создайте счет, к которому можно получать доступ из нескольких вычислительных потоков/процессов.
Должна быть возможность закрыть счет; операции со счетом после его закрытия должны завершаться с ошибкой.
Дополнительные подробности задания содержатся в файле с тестами.
Запустите файл с тестами, и добейтесь, чтобы все тесты проходили успешно.
Помните, что успешные тесты - это только первый шаг. Ваша цель - написать максимально читабельный и выразительный код.
Чтобы запустить тесты, выполните команду go test
из директории с заданием.
Чтобы вместе с тестами также выполнить бенчмарки, вы можете запустить их с
опциями --bench
и --benchmem
:
go test -v --bench . --benchmem
После того, как реализация банковского счета будет готова, опубликуйте ее в виде RESTful веб-сервиса, который предоставляет операции открытия и закрытия счета, зачисления (снятия) средств и получение баланса:
- Создание нового счета
POST /account
{
"initialAmount": 100 // Начальная сумма
}
- Зачисление (снятие) средств на счет
PUT /account
{
"amount": 50 // Сумма к зачислению, может быть отрицательной
}
- Получение баланса
GET /account
Возвращает:
{
"amount": 50 // Сумма на счете
}
- Закрытие счета
DELETE /account
Позаботьтесь о том, чтобы сервис успешно отрабатывал все ошибочные случаи, устанавливал корректные HTTP-заголовки (напр., Content-Type) и т.д. Пример работы с API:
==> GET /account
<== HTTP 400 Bad request
{ "error": "Account is not created" }
==> POST /account
{ "initialAmount": 120 }
<== HTTP 200 OK
==> PUT /account
{ "amount": -30 }
<== HTTP 200 OK
==> PUT /account
{ "amount": -100 }
<== HTTP 400 Bad request
{ "error": "Not enough money" }
==> GET /account
<== HTTP 200 OK
{ "amount": 90 }
==> DELETE /account
<== HTTP 200 OK
==> GET /account
<== HTTP 400 Bad request
{ "error": "Account is closed" }
Веб-сервис нужно распространять в виде Docker-контейнера. Напишите Dockerfile для сборки образа контейнера.
Исходный код решения должен быть размещен в отдельном проекте на любом публичном хостинге исходного кода (Github, Bitbucket, Gitlab и проч.). Ссылку на проект необходимо отправить лицу, выдавшему вам задание.
docker-compose up -d