ИП

Python Django FastAPI DRF Celery Redis PostgreSQL Git Swagger

🧪 Тестовое задание: API-платформа наград пользователям

Цель: реализовать backend-приложение для управления пользователями, начислением наград и отложенными задачами.

📚 Стек технологий

  • Django REST Framework
  • PostgreSQL
  • Celery
  • Redis (как брокер для Celery)
  • JWT
  • CORS и CSRF (по стандартам безопасности)

🧱 Функциональность

🔐 Аутентификация

  • Настроить авторизацию по JWT
  • Эндпоинты:
  • POST /api/token/ — получение access/refresh токенов
  • POST /api/token/refresh/ — обновление токена
  • POST /api/token/verify/ — валидация токена
  • Настроить CORS для доступа с фронта (например, localhost:3000)
  • Настроить CSRF для админки (по желанию)

👤 Пользовательская модель

  • Расширить AbstractUser
  • Добавить поле:
  • coins: IntegerField (по умолчанию 0)

⚙️ Админка

  • Возможность:
  • Создавать пользователей
  • Создавать награды (см. ниже)

🧾 API: Получение информации о себе

  • GET /api/profile/
  • Только для авторизованных пользователей
  • Ответ: username, email, coins

🎯 Модель: ScheduledReward

  • Поля:
  • user (ForeignKey)
  • amount (IntegerField)
  • execute_at (DateTimeField)
  • Назначение: запланировать выдачу награды в будущем

⏰ Celery: обработка ScheduledReward

  • Настроить Celery + Redis
  • При создании ScheduledReward — планируется задача
  • В момент execute_at:
  • Пользователю начисляется coins
  • Создаётся запись в RewardLog

📝 Модель: RewardLog

  • Поля:
  • user
  • amount
  • given_at

📋 API: Список наград

  • GET /api/rewards/
  • Возвращает список всех выданных наград пользователю

➕ (Дополнительно) Запрос награды

  • POST /api/rewards/request/
  • Пользователь может сам запросить награду
  • Ограничение: 1 раз в сутки
  • При успешном запросе:
  • создаётся ScheduledReward, которая выполнится через 5 минут

✅ Требования к выполнению

  • Использование Docker или docker-compose
  • README с описанием команд запуска и миграций
  • Swagger для документации

📤 Формат сдачи

  • Ссылка на открытый GitHub-репозиторий
  • .env файл, если требуется