Данный проект разрабатывался в рамках курса "Продвинутый Python" на ПМИ ФКН. Ссылка на презентацию. В репозитории присутствует две ветки
- master (Является dev веткой)
- prod (Является prod веткой)
Актуальной является prod ветка, так как dev ветка на данный момент отстает от prod.
Авторы проекта
- Даниэль Минкин (фронтенд + бд + DevOps), tg: @MinkinDD - автор идеи
- Олег Швецов (бэкенд), tg: @olezha223
-
Фронтенд:
- React
- Vite
- telegram-apps/telegram-ui (для интеграции с интерфейсом тг)
-
Бэкенд:
- python FastAPI (для создания API)
- SQLAlchemy (для данных пользователей)
- Celery (фоновые задачи)
- Redis (для распределения нагрузки на БД и бэк при записи польз. логов)
- aiobotocor (асинхронная S3 для изображений)
-
Базы данных:
- PostgreSQL (Основная БД)
- MongoDB (для меню ресторанов и их описания)
Внутри PostgreSQL будем использоавть pg_trim для быстрого поиска по похожим назавниям и postgis для быстрого поиска по ближайшим ресторанам
-
Контейнеризация через Docker Compose
-
python-telegram-bot для телеграм-бота
-
Api Яндекс карт для работы с географическими данными
-
Deploy через GitHub Actions
-
NGINX в качестве обратного прокси сервера
- фреймворк FastAPI для создания API
- SQLAlchemy и ORM для работы с PostgresSQL, подключение реализовано с помощью асинхронного контекстного менеджера
- Motor для работы с MongoDB, подключение также через асинхронный контекстный менеджер
- весь код протестирован на pytest
На бэкенде используется слоистая архитектура.
- Слой представления. В этом слое мы подготавливаем данные для представления на различных платформах, в нашем случае это будут тг бот и мини-приложение
- Слой сервиса. Подготовка данных для сохранения и дальнейшей обработки. Реализует инкапсуляцию бизнес-операций.
- Слой работы с данными. Мы абстрагируем работу с данными, что позволяет бизнес-логике не зависеть от конкретной реализации слоя работы с данными.
- api. В этой папке первая основная версия апи (v1), которая общается с продакшн базой данных. Каждый сервис, используемый в хендлерах прокидывается, как dependency injection (ну почти), для валидации данных используется Pydantic схемы
- app. Реализация кастомного FastAPI приложение, где подключается CORS и все роутеры
- auth. Функции для работы с JWT аутенфикацией: создание аксес и рефреш токенов, проверка, что запрос пришел из телеграм
- database. Асинхронные коннекторы для работы с базами данных MongoDB и PostgresSQL
- models. Делится на две части: DTO и ORM
- DTO - data transfer object. Просто наборы pydantic моделей для разных задач, которыми обмениваются слои при общении.
- ORM - ORM схемы для работы с PostgresSQL
- repository. Слой репозитория. В интерфейсе определен лишь session_getter - по умолчанию это коннектор к продакшн базе, но в тестах мы можем это подменить на другой, чтобы инкапсулировать тесты.
- service. Слой сервиса.
- Тесты на хендлеры. Используется асинхронный клиент из httpx вместе с веб-сервером uvicorn. Для тестов написан клон API, так как было бы очень плохой идеей делать основной API так, чтобы влиять на то, с какой базой данных будет производиться работа.
- Тесты на репозиторий и сервис. Они в целом очень похожи, но в целом это обычные интеграционные тесты, которые работают с тестовой базой данных
- Всего в проекте 190 тестов, и все проходят. Сейчас осталось протестировать только ручки на хендлеры и ручки, которые будут менять свойства ресторана
- понять, нужно ли допиливать jwt или все работает, как надо
- дописать хендлеры, которые будут по одному апдейтить свойства ресторана + тесты на них
- в целом в остальном тут все готово уже и можно
пить пиводелать лабу по матану2
Готова вся архитектура, однако по этой части не успеваем больше всего, из-за линейности тг ботов и как следствие необходимости прописывания каждого действия
Пока нет связки с бэком по запросам и стоят затычки. Также не готов процесс добавления ресторанов. Сейчас реализуется "наследование свойств ресторанов" при добавлении нового. Также нужно реализовать возможность редактировать рестораны, если совсем не будем успевать, опустим этот момент в пользу добавления новых, так как там интереснее функционал с точки зрения реализации. Также пока есть лишь интеграционные тесты на Storage
Подняли монгу, постгресс и редис. Добавили тестовую базу данных в постгрес для интеграционных тестов. Настроили Redis через .conf
Добавить аутентификацию в MongoDB, сейчас работает без нее, что unsafe
Создайте в корне проекта .env файл, согласно .env-example
Также создайте по образцу .env файл в директории databases и backend
Создайте приватный и публичный ключ для JWT аутенфикации:
cd backend
mkdir certs
cd certs
openssl genrsa -out jwt-private.pem 2048
openssl rsa -in jwt-private.pem -outform PEM -pubout -out jwt-public.pemТеперь можно запустить докер компоуз с нашими контейнерами
docker-compose upЗапустите базы данных
cd databases
docker-compose upcd ../backend/ # если были в папке databases
python3 -m venv venv
source venv/bin/activate
pip install -r requirements.txt
pytest -vcd ../bot/
python3 -m venv venv
source venv/bin/activate
pip install -r requirements.txt
pytest -vМы разрабатываем мини-приложение ТГ для удобной агрегации ресторанов рядом с пользователем. Весь интерфейс будет завязан на телеграм боте
- Получить ближайшие рестораны к пользователю по введенному адресу
- Возможность выбирать любимые рестораны/категории
- Агрегированная информация о ресторане из несколкьих источников
- Система рекомендаций от бота
- Добавить/удалить/редактировать свой ресторан через бота
- Возможность 'наследования' свойств ресторанов для быстрого добавления новых заведений
- Coming soon: Эффективное продвижение для бизнеса за счет отслеживания поведения пользоавтелей
Вся вериификация асболютно невидима для пользователя и осущесвляется единожды при входе в приложение, до заверешения сессии
Вид страницы:
-
Для нового пользователя
При входе на главную страницу сервис предложит вам выбрать адрес, в то время как будут показаны рестораны которые примерно близки к вашему текущему местоположению
-
Для старого пользователя
Ваш последний адрес будет сохранен и при следующем входе в приложение, будет отображена страница с ближайшими к нему ресторанами
На данной странице доступны выбор категорий и адреса, поиск и переход на страницы пользователя и ресторана Данная страница всегда кэшируется при переходе на другие, поэтому выбранные категеории, введенные поисковые запросы и.т.п сохраняются, также при возврате на страницу сохраняется положение пользоавтеля на ней
Выбранные категории сохраняются и применяются при поиске
Поиск осуществляется не по точным, а по наибольшим совпадениям, что позоляет искать рестораны максимально удобно для пользоавтеля
На данной странице будут продемонстрированы фотографии ресторана, его описание, ссылки на его сайт и на него в других источниках, также там будут показаны рейтинг ресторана на каждом из них, с количеством людей оставивших отзыв и агрегированный рейтинг на основе этих показателей.
Для каждого заведения будет показан список категорий к кооторому он принадлежит
Также для каждого ресторана в развертывающемся окошке будет доступно меню
У пользователя будет возможность добавить ресторан в избранное или убрать его оттуда
При наличии возможности, мы бы хотели ввести выкладку по отзывам со всех источников используя Api какой-либо LLM
Данная страница предназначена для управления всеми фишками мини-приложения
На ней можно будет добавить / удалить любимые категории / рестораны, сбросить предпочтения и.т.п
Дальнейший список функций будет расширяться
