Данный проект решает один из кейсов олимпиады PROOOD 2025 под названием BookIT. Это система для бронирования мест в коворкинге с системой уведомлений и удобной админской панелью.
Функциональные возможности проекта
- Регистрация и авторизация пользователя
- Ролевая система пользователей:
- Гость
- Сотрудник/студент
- Администратор
- Бронирование мест в коворкинге
- Просмотр собственных броней и их редактирование
- Верификация брони через QR-код
- Система администрирования:
- Просмотр всех бронирований
- Редактирование данных пользователей
- Подтверждение брони пользователей через QR-код
- Получение бизнесовой и технической статистики
- Получение уведомлений через телеграм и почту
- Возможность добавить бронь в календарь
Технические решения:
- JWT авторизация — безопасный способ аутентификации пользователей.
- Docker — использование
Dockerfileиdocker composeдля контейнеризации приложения. - Конфигурация — взаимодействие с переменными окружения через pydantic_settings.
- Типизирование — статическая проверка типизирования с использованием pyright.
- Форматирование кода — автоматическое форматирование с помощью ruff.
- Линтинг кода — проверка кода на соответствие стандартам с использованием ruff.
- Тестирование — написание и выполнение тестов с помощью pytest через docker.
Каждый бизнес-модуль отражает конкретную функциональность, такую как управление пользователями или аутентификация.
module
├── __init__.py # файл инициализации, импортирующий роутер
├── deps.py # настройки зависимостей бизнес-модуля
├── fields.py # переиспользуемые поля для схем
├── models.py # модели базы данных
├── routes.py # маршруты бизнес-модуля
├── schemas.py # схемы для валидации данных
└── service.py # сервисы с бизнес-логикой модуля
Импорты внутри модуля должны выглядеть следующим образом для избежания круговых зависимостей:
---
title: Структура бизнес-модуля "module"
---
graph LR;
module-->__init__.py;
__init__.py-->routes.py;
routes.py-->service.py;
routes.py-->deps.py;
routes.py-->schemas.py;
service.py-->models.py;
schemas.py-->fields.py;
При необходимости могут быть быстро введены собственные под-модули исходя из бизнес требований.
Подробнее со структурой БД можно ознакомиться в файле DATABASE.md.
Склонируйте репозиторий командой (предварительно настроив SSH-ключи):
git clone git@gitlab.com:prodcontest/template-backend.gitДля управления зависимостями в проекте используется пакетный менеджер pip.
Зависимости организованы следующим образом:
requirements
├── common.txt # общие зависимости
├── dev.txt # зависимости для разработки
└── prod.txt # зависимости для продакшена
Чтобы установить нужную группу зависимостей, выполните одну из команд ниже, предварительно перейдя в папку backend
командой cd backend:
pip install -r requirements/dev.txtpip install -r requirements/prod.txtДля запуска приложения через docker достаточно скопировать пример файла конфигурации окружения:
cp .env.example .envПосле выполнения этой команды у вас будет создан файл .env, который содержит все необходимые переменные окружения.
В проекте используется строгое статическое типизирование с помощью pyright, и для проверки типов необходимо выполнить:
pyrightДля поддержания единого код-стиля используйте форматер:
ruff formatЧтобы проверить код на соответствие стандартам проекта и автоматически исправить проблемы, выполните:
ruff check --fixТесты запускаются в докере для полной изоляции.
В проекте есть два вида тестов: unit-тесты и e2e-тесты
Покрытие Unit-тестами:
Они проверяют основной функционал сервисов с замокаными данными. Чтобы запустить контейнер с unit-тестами, выполните следующую команду:
docker compose --profile unit-test up --build --abort-on-container-exitДля удаления контейнеров с тестами используйте:
docker compose --profile tes t down -vПокрытие E2E-тестами:
e2e-тесты проверяют пользовательские пути, уже без замоканых данных и по созданию запросов к REST API. Они покрывают основные пользовательские пути: создание, получение, редактирование, удаление разных сущностей. Причём каждый блок тестов начинается с нуля, как если бы в это время регистрировался новый пользователь. Тесты покрывают модули с авторизацией, учётными записями, местами и бронированиями.
- Регистрация, включая использование неправильных данных и их валидацию
- Авторизация, включая использование неправильных данных и их валидацию
- Получение самого себя, редактирование своих параметров
- Получение пользователей (включая валидацию)
- Получение мест для бронирования и их редактирование
- Получение собственных бронирований
- Создание, редактирование бронирований
- Получение бронирований по местам
- Получение загруженности мест
- Получение текущих бронирований
Для запуска контейнера с e2e тестами выполните следующую команду:
docker compose --profile test up --build --abort-on-container-exitДля удаления контейнеров с тестами используйте:
docker compose --profile test down -vУ проекта есть два профиля: prod и dev.
На dev фронтенд запускается в режиме разработки, автоматически подтягивая изменения в браузере. Не запускаются grafana и
prometheus. nginx использует порт 8080 без SSL сертификатов.
Для запуска контейнера с приложением выполните следующую команду:
docker compose --profile prod up -d --buildДля остановки контейнера обязательно указывайте профиль:
docker compose --profile prod down -v



