# Изменения в API маркетингового анализа ## Обзор изменений Проведен рефакторинг метода генерации JSON-анализа для повышения детализации данных. Структура ответа API для фронтенда **осталась прежней**, но изменилась внутренняя структура данных в `chartsData`. ## Структура ответа API (без изменений) Ответ API остается прежним: ```json { "analysisId": "string", "status": "completed", "createdAt": "2024-01-01T00:00:00", "completedAt": "2024-01-01T00:05:00", "report": { "summary": "string", "fullAnalysis": "string", "chartsData": { /* ← ИЗМЕНЕНИЯ ЗДЕСЬ */ }, "targetAudience": { "description": "string", "channels": ["Instagram", "Telegram"] }, "recommendations": ["string"], "strategy": { "duration": "2 недели", "channels": ["Instagram", "Telegram"], "contentTypes": ["посты", "сторис"] }, "pdfUrl": "/api/marketing/analysis/{id}/download" } } ``` ## Изменения в `chartsData` ### 1. Анализ аудитории (`audienceSegmentation`) **Было:** ```json { "audienceSegmentation": { "ageGroups": [{ "label": "25-34", "value": "40" }], "genders": [{ "label": "Женщины", "value": "60" }], "segments": [{ "label": "Сегмент 1", "value": "35" }] } } ``` **Стало (расширенная структура):** ```json { "audienceSegmentation": { "ageGroups": [ { "label": "18-24", "value": "15" }, { "label": "25-34", "value": "40" }, { "label": "35-44", "value": "30" }, { "label": "45+", "value": "15" } ], "genders": [ { "label": "Женщины", "value": "60" }, { "label": "Мужчины", "value": "40" } ], "segments": [ { "label": "Молодые профессионалы", "value": "35" } ], "segmentsChannelMatrix": [ // ← НОВОЕ { "segmentName": "Молодые профи", "instagram": "high", "telegram": "medium", "youtube": "low" } ], "keyTakeaways": [ // ← НОВОЕ "Вывод 1", "Вывод 2", "Вывод 3" ] } } ``` **Что изменилось:** - ✅ Структура `ageGroups`, `genders`, `segments` осталась прежней - ➕ Добавлено поле `segmentsChannelMatrix` — матрица соответствия сегментов и каналов (heatmap) - ➕ Добавлено поле `keyTakeaways` — ключевые выводы по аудитории ### 2. Анализ конкурентов (`competitors`) **Было:** ```json { "competitors": [ { "name": "Конкурент А", "reach": 50000, "activity": 85, "reviews": 1200, "strengths": "Не указано", "weaknesses": "Не указано" } ] } ``` **Стало (расширенная структура):** ```json { "marketShareChart": [ // ← НОВОЕ { "name": "Наш бренд", "value": 25 }, { "name": "Конкурент А", "value": 30 }, { "name": "Конкурент B", "value": 20 }, { "name": "Другие", "value": 25 } ], "competitors": [ { "name": "Конкурент А", "reach": 50000, "followers": 12000, // ← НОВОЕ "activity": 85, "priceStrategy": "Высокая", // ← НОВОЕ "channelsHeatmap": { // ← НОВОЕ "Instagram": 90, "TikTok": 20, "Telegram": 70, "YouTube": 40 } } ], "comparisonTable": [ // ← НОВОЕ { "feature": "Ценовая политика", "us": "Средняя", "compA": "Высокая", "compB": "Низкая" } ], "swotCompetitors": { // ← НОВОЕ "strengths": ["..."], "weaknesses": ["..."] } } ``` **Что изменилось:** - ✅ Массив `competitors` остался, но с дополнительными полями - ➕ Добавлено поле `marketShareChart` — доли рынка для графика - ➕ Добавлено поле `comparisonTable` — сравнительная таблица характеристик - ➕ Добавлено поле `swotCompetitors` — SWOT-анализ по рынку - ➕ В объектах конкурентов добавлены: `followers`, `priceStrategy`, `channelsHeatmap` ### 3. Сезонность (`seasonality`) **Без изменений:** ```json { "seasonality": { "Январь": 45, "Февраль": 50, "Март": 60 // ... остальные месяцы } } ``` ### 4. Рынок (`market`) — НОВОЕ **Добавлено:** ```json { "market": { "size": "средний", "growthRate": "растущий", "trends": ["Тренд 1", "Тренд 2"], "opportunities": ["Возможность 1"], "threats": ["Угроза 1"] } } ``` ## Обратная совместимость Для обеспечения обратной совместимости, следующие поля могут присутствовать в `chartsData` (если использовалась старая структура): - `channelsPotential` — каналы продвижения - `conversionFunnel` — воронка конверсии - `swot` — SWOT-анализ **Рекомендация:** Используйте новые поля, но проверяйте наличие старых для обратной совместимости. ## Миграция фронтенда ### Шаг 1: Обновите обработку `audienceSegmentation` ```typescript // Было const ageGroups = chartsData.audienceSegmentation?.ageGroups || []; const genders = chartsData.audienceSegmentation?.genders || []; const segments = chartsData.audienceSegmentation?.segments || []; // Стало (добавьте новые поля) const ageGroups = chartsData.audienceSegmentation?.ageGroups || []; const genders = chartsData.audienceSegmentation?.genders || []; const segments = chartsData.audienceSegmentation?.segments || []; const segmentsChannelMatrix = chartsData.audienceSegmentation?.segmentsChannelMatrix || []; // НОВОЕ const keyTakeaways = chartsData.audienceSegmentation?.keyTakeaways || []; // НОВОЕ ``` ### Шаг 2: Обновите обработку конкурентов ```typescript // Было const competitors = chartsData.competitors || []; // Стало (добавьте новые поля) const marketShareChart = chartsData.marketShareChart || []; // НОВОЕ const competitors = chartsData.competitors || []; const comparisonTable = chartsData.comparisonTable || []; // НОВОЕ const swotCompetitors = chartsData.swotCompetitors || {}; // НОВОЕ // Обновите обработку объектов конкурентов competitors.forEach((comp) => { const followers = comp.followers; // НОВОЕ const priceStrategy = comp.priceStrategy; // НОВОЕ const channelsHeatmap = comp.channelsHeatmap; // НОВОЕ }); ``` ### Шаг 3: Добавьте обработку рынка ```typescript // НОВОЕ const market = chartsData.market || {}; const marketSize = market.size; const growthRate = market.growthRate; const trends = market.trends || []; const opportunities = market.opportunities || []; const threats = market.threats || []; ``` ## Примеры использования новых данных ### 1. Heatmap сегментов и каналов ```typescript const segmentsChannelMatrix = chartsData.audienceSegmentation?.segmentsChannelMatrix || []; // Отображение heatmap segmentsChannelMatrix.forEach((row) => { const segmentName = row.segmentName; const instagram = row.instagram; // "high" | "medium" | "low" const telegram = row.telegram; const youtube = row.youtube; // ... отрисовка heatmap }); ``` ### 2. График долей рынка ```typescript const marketShareChart = chartsData.marketShareChart || []; // Отображение pie chart marketShareChart.forEach((item) => { const name = item.name; // "Наш бренд", "Конкурент А", etc. const value = item.value; // процент доли рынка // ... отрисовка графика }); ``` ### 3. Сравнительная таблица ```typescript const comparisonTable = chartsData.comparisonTable || []; // Отображение таблицы comparisonTable.forEach((row) => { const feature = row.feature; // "Ценовая политика", "УТП", etc. const us = row.us; const compA = row.compA; const compB = row.compB; // ... отрисовка таблицы }); ``` ## Резюме изменений | Поле | Статус | Описание | | --------------------------------- | ---------------- | -------------------------------------------------------------- | | `chartsData.audienceSegmentation` | ✅ Расширено | Добавлены `segmentsChannelMatrix` и `keyTakeaways` | | `chartsData.competitors` | ✅ Расширено | Добавлены поля `followers`, `priceStrategy`, `channelsHeatmap` | | `chartsData.marketShareChart` | ➕ Новое | График долей рынка | | `chartsData.comparisonTable` | ➕ Новое | Сравнительная таблица | | `chartsData.swotCompetitors` | ➕ Новое | SWOT-анализ по рынку | | `chartsData.market` | ➕ Новое | Данные о рынке | | `chartsData.seasonality` | ✅ Без изменений | Осталось прежним | ## Вопросы? Если возникнут вопросы по миграции, обращайтесь к бэкенд-команде.