Billing app
Приложение можно запустить с помошью Docker-compose Для этого достаточно выполнить в корне проекта
docker-compose up
В этом случае произойдет сборка контейнера, запустится postgresql, и приложение на порту 8080
Можно использовать virtualenv/poetry для запуска и тестирования приложения. В системе дожны быть установлены poetry, python 3.7.5 (pyenv)
Для запуска приложения сначала нужно установить зависимости в виртуальное окружения
poetry install
Запустить базу даных
make deps
Затем
make run # или poetry run python main.py
Для конфигурирования приложения используется dynaconf Настройки хрянятся в .secrets.toml (Так сделано только для удобства режима demo !) Makefile и docker-compose.yml - соотвествуют дефолтным настройкам. Если планируется менять .secrets.toml, то и Makefile, docker-compose.yml - следует тоже изменить.
После установки и конфигурирования приложения, предпологается что запущен сервис на 127.0.0.1:8080
Создадим два пользователя (currency_user1 = EUR, currency_user2 = CNY):
curl -X POST "http://127.0.0.1:8080/v1/user_register" -H "accept: application/json" -H "Content-Type: application/json" -d "{ \"country\": \"country1\", \"city\": \"city1\", \"name\": \"user1\", \"balance\": 100, \"currency\": \"EUR\"}"
curl -X POST "http://127.0.0.1:8080/v1/user_register" -H "accept: application/json" -H "Content-Type: application/json" -d "{ \"country\": \"country2\", \"city\": \"city2\", \"name\": \"user2\", \"balance\": 100, \"currency\": \"CNY\"}"
Их user_id и wallet_id буду равны (1, 1), (2, 2) cоотвественно
Посмотрм информцию первого пользователя
curl -X POST "http://127.0.0.1:8080/v1/user_info" -H "accept: application/json" -H "Content-Type: application/json" -d "{ \"user_id\": 1}"
Добавим первому пользователю денег на кошелек
curl -X POST "http://127.0.0.1:8080/v1/wallet_top_up" -H "accept: application/json" -H "Content-Type: application/json" -d "{ \"wallet_id\": 1, \"amount\": 10}"
Переведем с кошелька второго пользователя на кошелек первого 10 CNY
curl -X POST "http://127.0.0.1:8080/v1/transaction_between_wallets" -H "accept: application/json" -H "Content-Type: application/json" -d "{ \"to_wallet_id\": 1, \"from_wallet_id\": 2, \"amount\": 10}"
Создалась транзакция. Но она не происходит мгновенно. В данном демо эмулируется задерка получения accuracy rate к USD
Подожем секунд 5-10
curl -X POST "http://127.0.0.1:8080/v1/transactions_history" -H "accept: application/json" -H "Content-Type: application/json" -d "{ \"wallet_id\": 1}"
Можно запускать данный запрос c параметрами start, end для фильтрации транзакций.
Попробуем теперь перевести с кошелька второго пользователя на кошелек первого 1000 CNY. Данная транзакция не должна пройти..
curl -X POST "http://127.0.0.1:8080/v1/transaction_between_wallets" -H "accept: application/json" -H "Content-Type: application/json" -d "{ \"to_wallet_id\": 1, \"from_wallet_id\": 2, \"amount\": 1000}"
curl -X POST "http://127.0.0.1:8080/v1/transactions_history" -H "accept: application/json" -H "Content-Type: application/json" -d "{ \"wallet_id\": 1}"
Видим, что в результатах появилась Failed транзакция
Можно посмотерть транзакции относительно другого кошелька. В результате данного запроса поле new_balace будет пересчитываться относильно данного кошелькаю.
curl -X POST "http://127.0.0.1:8080/v1/transactions_history" -H "accept: application/json" -H "Content-Type: application/json" -d "{ \"wallet_id\": 2}"
Ну и на последок, можно узнать информацию про этапы конкретной транзакции
curl -X GET "http://127.0.0.1:8080/v1/transaction_logs/1" -H "accept: application/json"
Swager.json хранится по адресу http://127.0.0.1:8080/api/docs/swagger.json Swagger doc хранится по адресу http://127.0.0.1:8080/api/docs