FORTECH.DEV

menu-icon
telegram-icon

Написать в Telegram

telegram-icon

СИМ Ёж - маркетплейс с оплатой за просмотры социальной рекламы

Мобильное приложение, где товары покупаются за баллы от просмотра соцрекламы. Разработали Backend на Django: внедрили JWT-авторизацию, систему достижений и 3 вида Push-уведомлений через Celery и Firebase. Стек: Python, DRF, Redis, Docker.

О проекте

СИМ ЁЖ — социальный интернет-магазин, где пользователи зарабатывают баллы за просмотр социальной рекламы и обменивают их на товары с маркетплейсов. Администратор таргетирует рекламу по группам пользователей, система начисляет баллы, а накопленные средства конвертируются в реальные покупки с доставкой в пункты выдачи. Это не благотворительность — это модель монетизации внимания пользователей через социально значимый контент. Команда Fortech вошла в проект на этапе доработки backend-части мобильного приложения. Нужно было реализовать систему уведомлений, механику достижений, авторизацию через JWT и настроить асинхронную обработку задач. Работали в связке с мобильной командой заказчика, которая интегрировала API в iOS и Android клиенты.

Задачи

  • Спроектировать модели пользователей и регистрационный flow с JWT-аутентификацией через Django Rest Framework

  • Реализовать трёхуровневую систему уведомлений: push через Firebase Cloud Messaging, внутренние уведомления в приложении и периодические рассылки через Celery Beat

  • Интегрировать FCM Django для управления устройствами пользователей и отправки push-уведомлений из Django-админки

  • Разработать механику достижений с прогресс-баром и привязкой к просмотрам видео

  • Построить систему контент-ограничений для видео с фильтрацией по категориям пользователей и индивидуальным правам доступа

  • Настроить асинхронную обработку задач через Celery с использованием Redis в качестве брокера сообщений

Group 2131328817.png

Реализация

Начали с аудита существующей кодовой базы и выбора архитектуры для новых модулей.

  • Авторизация: использовали Django Rest Framework с JWT-токенами — стандартное решение для stateless API, где токен хранится на клиенте и валидируется при каждом запросе.
  • Базы данных и кэширование: Postgres выбран как основная БД для транзакционных данных (пользователи, достижения, история просмотров), Redis — для кэширования сессий и в качестве брокера для Celery.
  • Документация: DRF Spectacular подключили для автогенерации OpenAPI-схемы — мобильной команде нужна была актуальная документация без ручного сопровождения.

Главный технический вызов — трёхуровневая система уведомлений Разработчик впервые работал с Firebase Cloud Messaging, и задача оказалась нетривиальной:

  1. Push-уведомления отправляются через FCM Django на зарегистрированные устройства пользователей.
  2. Внутренние уведомления (попапы в приложении) хранятся в Postgres и отдаются через REST API при запросе.
  3. Периодические уведомления (например, напоминания о накопленных баллах) реализованы через Django Celery Beat — задачи регистрируются в расписании и выполняются асинхронно.

Пришлось разобраться с форматом FCM-токенов, логикой retry при недоступности устройства и синхронизацией состояния между типами уведомлений.

Django

Python

Docker

Итоговое решение: единая модель Notification с полем type, где бизнес-логика отправки зависит от типа — через FCM, сохранение в БД или постановку в очередь Celery.

Работа с контентом и механиками Для видео разработали модель с привязкой к категориям и группам пользователей. Ограничения реализованы через many-to-many связи в Django ORM: у каждого видео есть список allowed_categories и excluded_users. При запросе списка видео QuerySet фильтруется по правам текущего пользователя.

Достижения спроектированы с полем progress (IntegerField от 0 до 100), которое обновляется триггером при каждом засчитанном просмотре видео.

Инфраструктура Сериализаторы DRF автоматически преобразуют модели в JSON, схемы для Swagger генерируются через drf-spectacular без дублирования кода. Docker Compose связывает Django, Postgres, Redis и Celery в единую инфраструктуру — разработчик пишет код локально, но окружение идентично продакшену.

Group 2131328818.png

Ключевые задачи и решения

  • JWT-аутентификация — реализовали через djangorestframework-simplejwt с кастомными claims для хранения user_id и группы пользователя, токены обновляются через refresh endpoint
  • Push-уведомления — интегрировали FCM Django с моделью UserDevice (токен, платформа, timestamp), отправка из админки через custom action с выбором целевой аудитории
  • Периодические уведомления — настроили Django Celery Beat с хранением расписания в Postgres (DatabaseScheduler), задачи триггерятся по cron-выражениям и отправляют уведомления через Celery workers
  • Асинхронная обработка — подключили Celery с Redis-брокером, задачи на отправку уведомлений и пересчёт достижений выполняются в фоне без блокировки основного процесса Django
  • Система достижений — модель Achievement с полем target_views и методом calculate_progress(), который обновляет прогресс-бар при каждом POST-запросе на эндпоинт просмотра видео
  • Контент-ограничения — реализовали через prefetch_related() в QuerySet для оптимизации запросов и кастомный permission class в DRF, который проверяет доступ на уровне view
  • Документация API — настроили DRF Spectacular с аннотациями @extend_schema для автогенерации Swagger-схемы, мобильная команда получает актуальную спецификацию без ручного обновления

Результат

Бизнес получил масштабируемую backend-инфраструктуру на Django с асинхронной обработкой через Celery, готовую к росту нагрузки:

  1. Быстрое развёртывание: Docker Compose позволяет разворачивать окружение за минуты.
  2. Автоматизация: DRF Spectacular генерирует документацию автоматически.
  3. Производительность: Redis кэширует частые запросы.

Система готова к интеграции с маркетплейсами для обмена баллов на товары — API спроектирован с расчётом на расширение функционала.

Пользователи получили мобильное приложение с полноценной системой монетизации просмотров:

  • Безопасность: регистрация через JWT.
  • Персонализация: таргетированные видео с учётом категорий.
  • Геймификация: накопление баллов с визуализацией прогресса.
  • Удержание: три типа уведомлений (push, внутренние, периодические) для вовлечения.

Просмотры обрабатываются в реальном времени, достижения обновляются асинхронно, а администратор управляет контентом и рассылками из Django-админки.

Уже появились идеи?

или
Phone
0/1000 символов
Политикой конфиденциальности
ООО «Фортех»
ИНН / КПП
6154162274
/
616401001
ОГРН
1226100005922
ОКВЭД
62.01 Разработка компьютерного программного обеспечения
Код вида деятельности в области IT:1.01, 1.04, 1.05, 1.06
Аккредитованная IT-компания
Минцифры России
VKTelegramMaxYouTubeWorkspace

Позвать нас в тендер