Backend-система для сбора и анализа данных о релизах игр на следующий месяц из Steam. Проект демонстрирует полный цикл разработки - от парсинга данных до аналитики.
- Адаптивный парсинг каталога Steam
- Автоматическая обработка и хранение данных
- Аналитика релизов по месяцам и жанрам
- REST API с полной документацией (Swagger)
Готовность к запуску одной командой
Перед запуском контейнера сделайте еще одну копию .env.Example и переименуйте эту копию в .env
git clone https://github.com/TembulatC/Mira-Games-Backend.git
cd Mira-Games-Backend
# Используется Dockerfile для dev разработки, поэтому может грузиться от 1 до 5минут
docker-compose up -d --build
После запуска зайдите в Swagger и активируйте следующий ендпоинт - POST /Main/AddAndUpdateGamesData - он сделает загрузку данных по играм в БД(займет 1-2 минуты, можете понаблюдать за процессом в логах docker если будут отображаться).
Теперь можно работать!
- Основное API: http://localhost:5200
- Swagger документация: http://localhost:5200/swagger
- PostgreSQL: localhost:5434
- ClickHouse: localhost:8124
- Tabix UI: http://localhost:8125
Проект построен по принципам чистой архитектуры с модульной структурой:
Domain- зона где находится основной код модулей. У каждого модуля своя система слоев. ИмяDomainничего не значит, это просто указание, что там находится центральный кодInfrastructure- данный слой я вынес как отдельную зону. Там происходит реализация репозиториев модулей, регистрация базы данных в системе, миграции, скрипты инициализации и конфигурации таблицPresentation- основная зона для взаимодействия пользователя и приложения. Там регистрируются все зависимости, пространства имен, контроллеры, конфигурации, кэш JSON файлы и конфигурации
SteamIntegration- парсинг данных Steam и работа с APIDataProcessing- обработка и сохранение игровых данныхOrchestrator- Не имеет систему слоев. Все что он делает это координация процессов через Use CasesClickHouse- аналитика и статистика
Models- слой с доменными моделями данных. Есть в модулях -DataProcessingInterfaces- слой с доменными интерфейсами для репозиториев, пайплайнов и сервисов. Есть в модулях -SteamIntegration,DataProcessing,ClickHouseApplication- слой со всей бизнес логикой. Там находятся уже сами сервисы, пайплайны и DTOs. Есть в модулях -SteamIntegration,DataProcessing,ClickHouseInfrastructure- вынесен в отдельную внешнюю зону (см. выше). Относится к модулям -SteamIntegration,DataProcessing,ClickHouse
POST /Main/GetGames- сбор данных об играх из Steam и запись их в JSONPOST /Main/AddAndUpdateGamesData- обновление данных в БД
GET /Main/games?month=YYYY-MM- игры по месяцамGET /Main/games/calendar?month=YYYY-MM- статистика по дням месяцаGET /Main/games/filter?genre=...&supportPlatforms=...- фильтрация игр
GET /Main/games/popularGenres?month=YYYY-MM- популярные жанрыPOST /Main/statistics/addChangeDynamic- создание снимка статистикиGET /Main/statistics/getChangeDynamic?month=YYYY-MM- динамика изменений
- ASP.NET Core 8
- Entity Framework Core
- HttpClient + HtmlAgilityPack
- PostgreSQL - основное хранение данных
- ClickHouse - аналитика и статистика
- Docker + Docker Compose
- Swagger/OpenAPI документация
- Tabix - веб-интерфейс для ClickHouse
- Поток данных происхрдит следующим образом -
Intefaces -> Repository -> Service/Pipeline -> UseCase -> Controller - Некоторые UseCase и сервисы могут казаться избыточными из-за делегирования задач, что сделано преднамеренно для поддержания единого архитектурного стиля и обеспечения безопасного внедрения будущих функций
- Все задачи выполняются в фоновом процессе, но для удобства в Swagger также реализованы эндпоинты для ручного управления приложением
- При применении автомиграций во время запуска контейнера может выйти ошибка что какая-то из миграций не удалась. Не обращайте внимания, все миграции применились на самом деле, может быть докер пометил какой-то свой внутненний процесс как ошибку, но на работу приложения это не влияет.
- При регистрации в Tabix вводите следующие данные: Поле
Name-MiraGamesTest, полеHost(иногда может называться по другому) -localhost:8124, полеLogin-default, полеPassword-11y256o7