usachev71 / book24-api

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Задание 4.

Реализовать 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": "Недостаточно средств для перевода"
}

Проблемы, возможные при использовании эндпоинта на реальном проекте

  1. Отсутствие идентификации и права пользователя на совершение транзакций. На данный момент любой пользователь может проводить транзакции по всей базе пользователей, если он знает их данные.
  2. Отсутствие подтверждение транзакции отправителем по email или sms.
  3. Отсутствие логирование событий.

About


Languages

Language:PHP 90.7%Language:Shell 5.2%Language:Makefile 2.5%Language:Dockerfile 1.6%