для развертывания проекта выполняем команду
docker compose up -d --build
и необходимо подождать 1-2 минуты для установки зависимостей и выполнения миграций
далее приложение принимает запросы по http://localhost
после завершение тестирования выполнить
docker compose down --remove-orphans
для чистки
Основной стек: php 8.2 Symfony 6.2 Postgres 15 Nginx 1.24
Реализованный функционал:
Пользователь:
POST /api/user/register
{"username", "password"} - регистрация пользователя, после которой выдается access token, необходимый для взаимодействия с кошельком
POST /api/user/get-access-token
{"username", "password"} - логин пользователя, для повторного получения токена
Данные два урла являются открытыми и к ним могут обращаться без наличия токена
Кошелек:
POST /api/wallet/create
{"currency"} - создание кошелька пользователя, если он еще не создан
GET /api/wallet/{id}/balance
- получение баланса кошелька (в тз говорилось об обязательном наличии Id кошелька как параметра, поэтому он был добавлен, хотя можно получить соответствующий кошелек по токену пользователя)
POST /api/wallet/{id}/balance
{"type", "amount", "currency", "reason"} - метод изменения баланса кошелька, помимо основных требований был добавлен Lock компонент, который исключает возможное состояние гонки, следующий запрос не может приступить к выполнению пока не закончен предыдущий
Для вызова данных эндпоинтов необходимо добавить полученный токен пользователя в Authorization Bearer
Команды:
Чистый SQL запрос для получения суммы по refund за последние 7 дней был обернут в команду для удобства вывода
app:get-sum-for-refund-transactions
также можно изменить период выдачи передав опции --for-days="" необходимое значение в днях, по дефолту выставлено 7 дней
Команда для обновления курсов обмена валют
С помощью миграции при развертывании проекта, в бд будут автоматически добавлены две записи для курсов обмена usd -> rub
и rub->usd
Далее их можно будет обновить этой командой или создать новые
app:update-exchange-rate
имеет обязательные опции --from --to --rate
Тесты:
Также был добавлен unit тест для сервиса AmountConverter, запуск тестов - php vendor/phpunit/phpunit/phpunit
Общие примечания:
Все суммы и курсы хранятся в int умноженное на 100 (хранение в малом разряде - центах, копейках и тд) для более точных вычислений
Для подключения через админку к БД ис-ся следующие креды
POSTGRES_DB: test
POSTGRES_PASSWORD: password
POSTGRES_USER: test