Уровень сложности: Intermediat (Средний)
Стэк: Python + Sanic Framework
БД: Postgres SQL

Модель базы данных


Пользователь – репрезентация пользователей в приложении. Должны быть обычные и
админ пользователи (админ назначается руками в базе или создаётся на старте
приложения)
Товар – Состоит из заголовка, описания и цены
Счёт – Имеет идентификатор счёта и баланс. Привязан к пользователю. У пользователя
может быть несколько счетов
Транзакция – история зачисления на счёт, хранит сумму зачисления и идентификатор
счёта


Функциональные критерии


Весь описываемый ниже функционал должен быть осуществлён в формате REST API.
Работа с шаблонами, HTML или фронтендом в любой форме не предусматривается.

Пользователь может:

  • Регистрация (по паролю и логину, возвращает ссылку активации)
  • Логин
  • Просмотр списка товаров
  • Покупка товара, просто списывает с баланса стоимость товара, при условии
    наличия на балансе счёта достаточного количества средств
  • Просмотр баланса всех счетов и историю транзакций
  • Зачисление средств на счёт, выполняется с помощью эндпоинта [POST]
    /payment/webhook симулирует начисление со стороннего сервиса.

Пример тела вебхука, с транзакцией (формат json):

{
“signature”: “f4eae5b2881d8b6a1455f62502d08b2258d80084”,
“transaction_id”: 1234567,
“user_id”: 123456,
“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 – пользователь на чеq
счёт произойдёт зачисление, bill_id – идентификатор счёта (если счёта с таким айди не
существует, то но должен быть создан), amount – сумма транзакции

Возможности админа:

  1. Видеть все товары
  2. Видеть всех пользователей и их счета
  3. Включать/отключать пользователей
  4. Создавать/редактировать/удалять товары

Не функциональные критерии

  • Логины пользователей уникальны
  • После регистрации пользователь создаётся в не активном состоянии. Становится
    активным переходя по ссылке полученной с регистрации
  • Авторизация должна быть сделана через JWT. Защищённые эндпоинты должны
    получать токен в заголовке Authorization в Bearer формате
  • Время выполнения задачи желательно не более 7 дней.
  • Выполнить задачу с учётом особенностей асинхронной обработки данных. В
    особенности это касается обработки транзакций, приложение должно быть способно
    обработать сравнительно большой объём параллельных запросов (с поправкой на
    технические характеристики сервера).