### **Техническое задание: Модуль SMM-автоматизации**

**Версия 2.0**

Это ТЗ описывает разработку backend и frontend компонентов для модуля AI-продвижения в соцсетях. Оркестрация через n8n на данном этапе **не реализуется**, но архитектура закладывает основу для будущей интеграции. Управление процессами временно осуществляется через UI.

---

## Backend (Spring Boot)

Backend будет содержать всю бизнес-логику, модели данных и API для взаимодействия с frontend и внешними сервисами (соцсети, LLM).

### 1\. Модели данных (JPA Entities)

На основе схемы БД из первоначального ТЗ, создаем следующие JPA-сущности:

-   **`Channel`**: Каналы для постинга.
    ```java
    @Entity
    public class Channel {
        @Id @GeneratedValue
        private UUID id;
        private String name; // e.g., "Telegram Official"
        private String type; // ENUM: TELEGRAM, VK, INSTAGRAM, etc.
        private String apiKeyRef; // Ссылка на secret в Vault или аналоге
        private boolean isActive;
    }
    ```
-   **`Campaign`**: Маркетинговые кампании.
    ```java
    @Entity
    public class Campaign {
        @Id @GeneratedValue
        private UUID id;
        private String name;
        private String goal;
        private BigDecimal budget;
        private ZonedDateTime startAt;
        private ZonedDateTime endAt;
        private String status; // ENUM: PLANNED, ACTIVE, COMPLETED
    }
    ```
-   **`ContentQueue`**: Очередь контента для публикации.
    ```java
    @Entity
    public class ContentQueue {
        @Id @GeneratedValue
        private UUID id;
        @ManyToOne
        private Campaign campaign;
        private String locale; // ENUM: "ru", "kk"
        private String topic;
        @JdbcTypeCode(SqlTypes.JSON)
        private String postDraft; // JSON: { "title": "...", "body": "...", "hashtags": [...] }
        @JdbcTypeCode(SqlTypes.JSON)
        private String assetsRefs; // JSON: ["path/to/image1.jpg"]
        private ZonedDateTime scheduledAt;
        private int priority;
        private String status; // ENUM: DRAFT, PENDING_APPROVAL, APPROVED, PUBLISHED, FAILED
    }
    ```
-   **`Message`**: Опубликованные сообщения.
    ```java
    @Entity
    public class Message {
        @Id @GeneratedValue
        private UUID id;
        @ManyToOne
        private Channel channel;
        @OneToOne
        private ContentQueue content;
        private String externalId; // ID поста в соцсети
        private String url;
        private ZonedDateTime postedAt;
    }
    ```
-   **`KpiSnapshot`**: Срезы по ключевым метрикам для аналитики.
    ```java
    @Entity
    public class KpiSnapshot {
        @Id @GeneratedValue
        private UUID id;
        private LocalDate date;
        @ManyToOne
        private Channel channel;
        private String metric; // e.g., "CTR", "ER", "LEADS"
        private BigDecimal value;
    }
    ```

---

### 2\. API Endpoints (REST Controllers)

Создаем REST контроллеры для управления сущностями.

#### `CampaignController`

-   `GET /api/smm/campaigns` — получить список всех кампаний.
-   `GET /api/smm/campaigns/{id}` — получить детали одной кампании.
-   `POST /api/smm/campaigns` — создать новую кампанию.
    -   **Body**: `CampaignDto { name, goal, budget, startAt, endAt }`
-   `PUT /api/smm/campaigns/{id}` — обновить кампанию.

#### `ContentController`

-   `GET /api/smm/content` — получить очередь контента с фильтрами (по дате, статусу, кампании).
-   `GET /api/smm/content/{id}` — получить конкретный элемент из очереди.
-   `POST /api/smm/content/generate` — **(Ключевой метод)** запустить генерацию контента.
    -   **Body**: `GenerateRequestDto { topic, locale, channelType }`
    -   **Response**: `ContentQueue` в статусе `DRAFT`.
-   `PUT /api/smm/content/{id}` — обновить пост вручную (текст, картинки, время публикации).
-   `POST /api/smm/content/{id}/approve` — изменить статус на `APPROVED`.
-   `DELETE /api/smm/content/{id}` — удалить черновик.

#### `PublishingController`

-   `POST /api/smm/publishing/post/{contentId}` — принудительно опубликовать пост (для ручного управления).

#### `ChannelController`

-   `GET /api/smm/channels` — получить список подключенных каналов.
-   `POST /api/smm/channels` — подключить новый канал (сохранить токен).

---

### 3\. Сервисный слой (Business Logic)

Логика "AI-агентов" реализуется в сервисах.

-   **`CampaignService`**: CRUD-операции для кампаний.
-   **`ContentGenerationService`**:
    -   Интегрируется с API LLM (`Writer`, `Researcher`).
    -   Интегрируется с API для генерации изображений (`Designer`).
    -   Выполняет проверку на стоп-слова (`Compliance`).
    -   Создает запись в `ContentQueue` со статусом `DRAFT`.
-   **`PublishingService`**:
    -   Содержит логику для постинга в каждый конкретный канал (Telegram, VK и т.д.) через их API.
    -   Запускается по расписанию (`@Scheduled` в Spring) для постов со статусом `APPROVED` и подошедшим `scheduledAt`.
    -   После успешной публикации создает запись в `Message` и обновляет статус в `ContentQueue`.
-   **`AnalyticsService`**:
    -   По расписанию собирает статистику по опубликованным постам (`Message`).
    -   Сохраняет данные в `KpiSnapshot`.

### 4\. Placeholder для n8n

Для будущей интеграции создаем специальный контроллер.

#### `WorkflowTriggerController`

-   `POST /api/smm/workflows/start-weekly-planning` — этот эндпоинт будет вызывать n8n, чтобы запустить цепочку. Сейчас он не используется, но должен быть заложен в архитектуру. Пока что эту логику будет инициировать пользователь через UI.

---

## Frontend (Vue.js)

Frontend-модуль предоставляет пользовательский интерфейс для управления всем SMM-циклом вручную.

### 1\. Компоненты и страницы (Views & Components)

#### **Страница "Кампании" (`/smm/campaigns`)**

-   **Вид**: Таблица со списком всех кампаний (`id`, `name`, `status`, `period`).
-   **Функционал**:
    -   Кнопка "Создать кампанию", открывающая модальное окно с формой.
    -   Просмотр и редактирование существующих кампаний.

#### **Страница "Контент-план" (`/smm/content-plan`)**

-   **Вид**: Основной рабочий экран. Реализовать в виде календаря или Канбан-доски (колонки: "Черновик", "На согласовании", "Запланировано", "Опубликовано").
-   **Функционал**:
    -   Отображение карточек постов из `ContentQueue`. На карточке: тема, канал, дата.
    -   Кнопка "Сгенерировать идею/пост", которая вызывает `POST /api/smm/content/generate`.
    -   Drag-n-drop карточек для изменения даты публикации (`scheduledAt`).
    -   Клик на карточку открывает модальное окно редактора поста.

#### **Компонент "Редактор поста"**

-   **Вид**: Модальное окно или отдельная страница.
-   **Поля**:
    -   Редактируемый текст поста для RU и KZ версий (вкладки или два поля).
    -   Превью сгенерированного изображения. Возможность загрузить свое.
    -   Выбор даты и времени публикации.
    -   Статус поста.
-   **Кнопки**:
    -   "Сохранить" (`PUT /api/smm/content/{id}`).
    -   "Перегенерировать" (повторный вызов генерации для этого поста).
    -   "Согласовать" (`POST /api/smm/content/{id}/approve`).
    -   "Опубликовать сейчас" (`POST /api/smm/publishing/post/{contentId}`).
    -   "Удалить".

#### **Страница "Аналитика" (`/smm/analytics`)**

-   **Вид**: Дашборд с графиками и ключевыми метриками (CTR, ER, Лиды) из `KpiSnapshot`.
-   **Функционал**: Фильтры по дате, кампании, каналу.

#### **Страница "Настройки" (`/smm/settings`)**

-   **Вид**: Управление подключенными каналами (`Channel`).
-   **Функционал**: Добавление новых аккаунтов соцсетей (ввод токенов API), проверка статуса подключения.

### 2\. Взаимодействие с Backend

-   Использовать `axios` или аналогичный HTTP-клиент для всех запросов к API.
-   Для управления состоянием (списки кампаний, контента) использовать `Pinia`.
-   Обеспечить обработку ошибок API и отображение уведомлений для пользователя.

Этот подход позволит вам разработать и протестировать всю основную функциональность модуля независимо от n8n, а когда придет время, вы просто настроите n8n на вызов уже готовых и отлаженных API-эндпоинтов.
