Метод | URL | Описание |
GET | /api/v1/recipes | Список с пагинацией, 12 фильтров, сортировка |
POST | /api/v1/recipes | Создать рецепт (auth) |
GET | /api/v1/recipes/{id} | Детальный просмотр |
PUT | /api/v1/recipes/{id} | Обновить (автор) |
DELETE | /api/v1/recipes/{id} | Удалить (автор) |
GET | /api/v1/recipes/top | Топ-100 по рейтингу |
GET | /api/v1/recipes/trending | Трендовые за 7 дней |
GET | /api/v1/recipes/seasonal | Сезонные по месяцу |
GET | /api/v1/recipes/random | Случайный рецепт |
GET | /api/v1/recipes/autocomplete | Elasticsearch автодополнение |
POST | /api/v1/recipes/{id}/adapt | AI-адаптация под предпочтения |
POST | /api/v1/recipes/{id}/ask | Вопрос к рецепту (AI-ассистент) |
GET | /api/v1/recipes/{id}/similar | Похожие рецепты |
POST | /api/v1/recipes/{id}/favorite | Добавить/убрать из избранного |
POST | /api/v1/recipes/{id}/rate | Оценить рецепт |
Метод | URL | Описание |
POST | /api/v1/users/register | Регистрация (5/min rate limit) |
POST | /api/v1/users/login | Вход (10/min rate limit) |
POST | /api/v1/users/refresh | Обновление JWT токена |
GET | /api/v1/users/me | Профиль текущего пользователя |
POST | /api/v1/users/request-verification | Запросить письмо верификации |
GET | /api/v1/users/verify-email | Подтвердить email по токену |
POST | /api/v1/users/forgot-password | Запросить сброс пароля (3/min) |
POST | /api/v1/users/reset-password | Установить новый пароль |
GET | /api/v1/users/me/achievements | Мои достижения |
GET | /api/v1/users/me/favorites | Избранные рецепты |
Метод | URL | Описание |
POST | /api/v1/payments/create-checkout | Stripe Checkout Session |
POST | /api/v1/payments/webhook | Stripe webhook с проверкой подписи |
POST | /api/v1/meal-plan/generate | Генерация недельного плана (PRO) |
GET | /api/v1/meal-plan/my | Мои планы питания |
Модуль | Количество | Описание |
Категории | 3 | CRUD категорий |
Специи | 5 | База специй, поиск, комбо |
Дуэли | 5 | Активная дуэль, голосование, история |
Дневник здоровья | 6 | Логирование, аналитика, сканер холодильника |
Импорт | 1 | Импорт из TikTok/YouTube через yt-dlp + Whisper |
Карта мира | 1 | Кухни мира с геоданными |
Достижение | Условие |
🌱 Первый шаг | Добавить первый рецепт в избранное |
❤️ Коллекционер | 10 рецептов в избранном |
🏆 Гурман | 50 рецептов в избранном |
⭐ Критик | Оценить первый рецепт |
🎯 Эксперт | Оценить 20 рецептов |
📔 Начало пути | Первая запись в дневнике здоровья |
🔥 Неделя здоровья | 7 дней подряд в дневнике |
💪 Месяц здоровья | 30 дней подряд в дневнике |
Команда | Описание |
/start | Приветствие и главное меню |
/random | Случайный рецепт |
/search <запрос> | Поиск рецептов |
/top | Топ-10 рецептов |
/trending | Трендовые рецепты |
/seasonal | Сезонные рецепты |
/categories | Список категорий |
/duel | Текущая дуэль |
/vote <id> | Проголосовать в дуэли |
/log <блюдо> | Записать приём пищи |
/mylog | Мой дневник за сегодня |
/plan | Недельный план (PRO) |
/pro | Информация о PRO-подписке |
/favorites | Мои избранные рецепты |
/achievements | Мои достижения |
/help | Справка по командам |
Метрика | Значение |
Рецептов в seed-данных | 1 000 |
API endpoints | 52 |
Страниц (Web) | 15 |
Экранов (Mobile) | 12 |
Команд (Bot) | 16 |
Моделей БД | 14 |
Сервисов в docker-compose | 9 |
Строк кода (est.) | ~12 000 |
# | File | Fix |
1 | config.py | Hardcoded SECRET_KEY = "dev-secret-key» — now raises ValueError on startup in production |
2 | routes/duels.py | Unlimited vote stuffing — voting now requires auth and blocks duplicate votes per user |
3 | routes/duels.py | Duel creation was open to anonymous users — now requires authentication |
4 | services/recipe_importer.py | SSRF via user-supplied URL — added strict urlparse validation + RFC1918 IP blocklist |
5 | services/recipe_importer.py | Blocking subprocess.run in async context — replaced with asyncio.create_subprocess_exec |
6 | workers/tasks.py | create_engine called on every Celery task — moved to module level with connection pool |
7 | routes/recipes.py | PUT /recipes/{id} returned 404 for author's own drafts (is_published=False) |
8 | routes/recipes.py | PUT /recipes/{id} silently ignored ingredients and steps — now replaces them correctly |
9 | routes/recipes.py | Pagination total was wrong — count_query now applies all the same filters as the main query |