Реализовать Rest API эндпоинт для проведения транзакции начисления условных единиц (денег или баллов) от одного пользователя на счет другого. Баланс не может быть отрицательным. В БД проекта должно быть как минимум две обязательных таблицы: пользователи и транзакции.
В рамках этой задачи эндпоинт должен быть доступен без авторизации.
Написать интеграционные тесты, покрывающие как минимум два любых тесткейса (например успешную транзакцию и неуспешную).
Подумать, какие подводные камни могут возникнуть при использовании этого эндпоинта в реальном проекте.
Код должен быть оформлен по стандарту PSR-12. Использовать Php 7.4, Последнюю минорную версию Symfony 4/5, любую удобную реляционную СУБД. Для тестов использовать PhpUnit. Должна быть возможность развернуть проект локально и запустить тесты.
Окружение для запуска проекта реализовано с помощью docker и docker-compose. Управлять запуском можно через обертку make
make init
- Сборка контейнеров, их запуск, установка composer пакетов, запуск миграций и добавление фикстур
make up
- Запуск контейнеров
make down
- Остановка контейнеров
make restart
- Перезапуск контейнеров
make test
- Запуск unit тестов
При запуске проекта через команду make init
автоматически создаются 2 тестовых пользователя с e-mail (example1@example.com
и example2@example.com
) и c условными единицами на балансе равными 100 и 200 соответственно.
Чтобы провести запрос на перевод условных единиц необходимо осуществить POST
запрос по адресу http://localhost/transaction
с телом запроса
{
"from_user": "example1@example.com",
"to_user": "example2@example.com",
"amount": 10
}
где:
from_user
- email пользователя у которого списываются средства,
to_user
- email пользователя которому поступят средства,
amount
- сумма перевода.
Ответ на запрос будет следующим:
- В случае успешного перевода вернется статус 201 в заголовке и тело ответа:
{
"message": "Транзакция успешно создана"
}
- В случае ввода некорректных данных или неправильной суммы система вернет статус 400 и тело ответа с сообщением ошибки:
{
"message": "Недостаточно средств для перевода"
}
- Отсутствие идентификации и права пользователя на совершение транзакций. На данный момент любой пользователь может проводить транзакции по всей базе пользователей, если он знает их данные.
- Отсутствие подтверждение транзакции отправителем по email или sms.
- Отсутствие логирование событий.