Необходимо реализовать асинхронное веб приложение в парадигме REST API.
Стек:
- База данных - PostgreSQL
- SQLalchemy - для работы с базой данных
- FastApi
- Docker Compose
Необходимо реализовать работу со следующими сущностями: Пользователь Администратор Счет - имеет баланс, привязан к пользователю Платеж(пополнение баланса) - хранит уникальный идентификатор и сумму пополнения счета пользователя
Пользователь должен иметь следующие возможности:
- Авторизоваться по email/password
- Получить данные о себе(id, email, full_name)
- Получить список своих счетов и балансов
- Получить список своих платежей
Администратор должен иметь следующие возможности: Авторизоваться по email/password Получить данные о себе (id, email, full_name) Создать/Удалить/Обновить пользователя Получить список пользователей и список его счетов с балансами
Для работы с платежами должен быть реализован роут эмулирующий обработку вебхука от сторонней платежной системы. Структура json-объекта для обработки вебхука должна состоять из следующих полей:
- transaction_id - уникальный идентификатор транзакции в “сторонней системе”
- account_id - уникальный идентификатор счета пользователя
- user_id - уникальный идентификатор счета пользователя
- amount - сумма пополнения счета пользователя
- signature - подпись объекта
signature должна формироваться через SHA256 хеш, для строки состоящей из конкатенации значений объекта в алфавитном порядке ключей и “секретного ключа” хранящегося в конфигурации проекта ({account_id}{amount}{transaction_id}{user_id}{secret_key}).
Пример, для secret_key gfdmhghif38yrf9ew0jkf32:
{
"transaction_id": "5eae174f-7cd0-472c-bd36-35660f00132b",
"user_id": 1,
"account_id": 1,
"amount": 100,
"signature": "7b47e41efe564a062029da3367bde8844bea0fb049f894687cee5d57f2858bc8"
}
При обработке вебхука необходимо:
- Проверить подпись объекта
- Проверить существует ли у пользователя такой счет - если нет, его необходимо создать
- Сохранить транзакцию в базе данных
- Начислить сумму транзакции на счет пользователя
Транзакции являются уникальными, начисление суммы с одним transaction_id должно производиться только один раз.
Для тестирования приложения в миграции должен быть создан:
- Тестовый пользователь
- Счет тестового пользователя
- Тестовый администратор
Для развертывания проекта необходимо реализовать docker compose конфигурацию состоящую из сервиса postgresql и сервиса приложения. К реализованному заданию должна прилагаться краткая инструкция по запуску проекта в двух вариантах - с использованием docker compose и без него. В инструкции также должны быть предоставлены email/password для пользователя и администратора по умолчанию созданных в миграции.