Репозиторий для выполнения тестового задания в котором требуется разработать
API использую FastAPI
и PostgreSQL
.
Информация об оформлении коммитов
- feat: (новая функционал кода, БЕЗ учёта функционала для сборок)
- devops: (функционал для сборки, - добавление, удаление и исправление)
- fix: (исправление ошибок функционального кода)
- docs: (изменения в документации)
- style: (форматирование, отсутствующие точки с запятой и т.п., без изменения производственного кода)
- refactor: (рефакторинг производственного кода, например, переименование переменной)
- test: (добавление недостающих тестов, рефакторинг тестов; без изменения производственного кода)
- chore: (обновление рутинных задач и т. д.; без изменения производственного кода).
Formulation
Пользователь – репрезентация пользователей в приложении. Должны быть обычные и админ пользователи (админ назначается руками в базе или создаётся на старте приложения).
Товар – Состоит из заголовка, описания и цены.
Счёт – Имеет идентификатор счёта и баланс. Привязан к пользователю. У пользователя может быть несколько счетов.
Транзакция – история зачисления на счёт, хранит сумму зачисления и идентификатор счёта.
Весь описываемый ниже функционал должен быть осуществлён в формате 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
– пользователь на чей счёт произойдёт зачисление;bill_id
– идентификатор счёта (если счёта с таким айди не существует, то не должен быть создан);amount
– сумма транзакции.
- Видеть все товары
- Видеть всех пользователей и их счета
- Включать/отключать пользователей
- Создавать/редактировать/удалять товары
Не функциональные критерии
- Логины пользователей уникальны
- После регистрации пользователь создаётся в не активном состоянии. Становится активным переходя по ссылке полученной с регистрации
- Авторизация должна быть сделана через JWT. Защищённые эндпоинты должны получать токен в заголовке Authorization в Bearer форматеВремя выполнения задачи желательно не более 7 дней. Выполнить задачу с учётом особенностей асинхронной обработки данных. В особенности это касается обработки транзакций, приложение должно быть способно обработать сравнительно большой объём параллельных запросов (с поправкой на технические характеристики сервера).
- язык программирования: Python
- фреймворк: FasAPI
- база данных: PostgreSQL
Для запуска приложения необходимо:
- Переименовать шаблон-файл переменных окружения
.env.example
в.env
. - Ввести свои настройки в
.env
(с настройками по-умолчанию не безопасно).
При работе с приложением через docker нужно запустить команду на сборку образа:
docker-compose up --build --remove-orphans
Для сворачивания приложения нужно ввести следующую команду:
docker-compose down
Примечания:
- В контейнере поднимается и БД и само приложение.
- При сворачивании контейнера БД удаляется.
- Создаётся тестовый суперпользователь
admin
с паролемpassword
.
При работе с приложением через лаунчер всё взаимодействие производиться
через модуль launcher.py
в формате:
python launcher.py [COMMAND]
Для информирования о возможных командах нужно ввести:
python launcher.py --help
Команда create-superuser
позволяет создать в базе данных активированного
суперпользователя.
python launcher.py create-superuser -n [USERNAME ПОЛЬЗОВАТЕЛЯ]
- Оптимизировать сборку контейнера docker-compose.