- Пользователь – репрезентация пользователей в приложении. Должны быть обычные и админ пользователи (админ назначается руками в базе или создаётся на старте приложения)
- Товар – Состоит из заголовка, описания и цены
- Счёт – Имеет идентификатор счёта и баланс. Привязан к пользователю. У пользователя может быть несколько счетов
- Транзакция – история зачисления на счёт, хранит сумму зачисления и идентификатор счёта
Весь описываемый ниже функционал должен быть осуществлён в формате REST API. Работа с шаблонами, HTML или фронтендом в любой форме не предусматривается. Пользователь может:
-
Регистрация (по паролю и логину, возвращает ссылку активации) -
Логин -
Просмотр списка товаров -
Покупка товара, просто списывает с баланса стоимость товара, при условии наличия на балансе счёта достаточного количества средств -
Просмотр баланса всех счетов и историю транзакций -
Зачисление средств на счёт, выполняется с помощью эндпоинта [POST] /payment/webhook симулирует начисление со стороннего сервиса.
Пример тела вебхука, с транзакцией (формат json): { "signature":"70e224ace9d3859aca84ffb88edf593acec92dbb", "transaction_id":1234567, "user_id":1, "bill_id":123456, "amount":100 } Сигнатура формируются по правилу:
from Crypto.Hash import SHA1
signature = SHA1.new()
.update(f'{private_key}:{transaction_id}:{user_id}:{bill_id}:{amount}'.encode())
.hexdigest()
Где private_key – приватный ключ, задаётся в свойствах приложения, transaction_id – уникальный идентификатор транзакции, user_id – пользователь на чеё счёт произойдёт зачисление, bill_id – идентификатор счёта (если счёта с таким айди не существует, то но должен быть создан), amount – сумма транзакции.
-
Видеть все товары -
Видеть всех пользователей и их счета -
Включать/отключать пользователей -
Создавать/редактировать/удалять товары
-
Логины пользователей уникальны -
После регистрации пользователь создаётся в не активном состоянии. Становится активным переходя по ссылке полученной с регистрации -
Авторизация должна быть сделана через JWT. Защищённые эндпоинты должны получать токен в заголовке Authorization в Bearer формате
Время выполнения задачи желательно не более 7 дней. Выполнить задачу с учётом особенностей асинхронной обработки данных. В особенности это касается обработки транзакций, приложение должно быть способно обработать сравнительно большой объём параллельных запросов (с поправкой на технические характеристики сервера).
- язык программирования: Python 3.10
- Фреймворк: Sanic 22
- База данных: PostgreSQL 15
Впервые использовал Sanic и Tortoise ORM.
-
Tortoise ORM. Хоть и довольно популярная библиотека - обнаружены замечательные "фичи", но всё же достаточно удобная. Также встроенные методы для дружбы с pydantic неочевидны, сложны и неполны. Потому не стал ими пользоваться.
-
Pydantic. Популярная библиотека, но почему-то споткнулась на некоторых значениях в ".env" файле. Спасла python-decouple.
-
Sanic. По бенчмаркам считается самым быстрым питоновским бэкенд-фреймворком, в общем-то несложный.