552 lines
12 KiB
Markdown
552 lines
12 KiB
Markdown
# API Документация для Фронтенда
|
|
|
|
Данная документация описывает все доступные API эндпоинты для фронтенда системы управления социальными сетями Konturai.
|
|
|
|
## Базовый URL
|
|
|
|
```
|
|
https://api.konturai.kz/api/smm
|
|
```
|
|
|
|
## Аутентификация
|
|
|
|
Все запросы требуют аутентификации. Используйте Bearer токен в заголовке Authorization:
|
|
|
|
```
|
|
Authorization: Bearer <your-jwt-token>
|
|
```
|
|
|
|
---
|
|
|
|
## 1. CampaignController - Управление кампаниями
|
|
|
|
**Базовый путь:** `/api/smm/campaigns`
|
|
|
|
### 1.1 Получить все кампании
|
|
|
|
```http
|
|
GET /api/smm/campaigns
|
|
```
|
|
|
|
**Ответ:**
|
|
|
|
```json
|
|
[
|
|
{
|
|
"id": "550e8400-e29b-41d4-a716-446655440000",
|
|
"name": "Новогодняя кампания",
|
|
"goal": "Увеличение продаж на 20%",
|
|
"budget": 100000.0,
|
|
"startAt": "2024-01-01T00:00:00Z",
|
|
"endAt": "2024-01-31T23:59:59Z",
|
|
"status": "ACTIVE"
|
|
}
|
|
]
|
|
```
|
|
|
|
### 1.2 Получить кампанию по ID
|
|
|
|
```http
|
|
GET /api/smm/campaigns/{id}
|
|
```
|
|
|
|
**Параметры:**
|
|
|
|
- `id` (UUID) - ID кампании
|
|
|
|
**Ответ:** Объект CampaignDto
|
|
|
|
### 1.3 Создать кампанию
|
|
|
|
```http
|
|
POST /api/smm/campaigns
|
|
Content-Type: application/json
|
|
```
|
|
|
|
**Тело запроса:**
|
|
|
|
```json
|
|
{
|
|
"name": "Новогодняя кампания",
|
|
"goal": "Увеличение продаж на 20%",
|
|
"budget": 100000.0,
|
|
"startAt": "2024-01-01T00:00:00Z",
|
|
"endAt": "2024-01-31T23:59:59Z",
|
|
"status": "PLANNED"
|
|
}
|
|
```
|
|
|
|
**Валидация:**
|
|
|
|
- `name` - обязательное поле, не пустое
|
|
- `budget` - должно быть >= 0
|
|
- `startAt` - дата должна быть в будущем или настоящем
|
|
- `endAt` - дата должна быть в будущем
|
|
|
|
**Ответ:** 201 Created, объект CampaignDto
|
|
|
|
### 1.4 Обновить кампанию
|
|
|
|
```http
|
|
PUT /api/smm/campaigns/{id}
|
|
Content-Type: application/json
|
|
```
|
|
|
|
**Параметры:**
|
|
|
|
- `id` (UUID) - ID кампании
|
|
|
|
**Тело запроса:** То же, что и при создании
|
|
|
|
**Ответ:** Объект CampaignDto
|
|
|
|
### 1.5 Удалить кампанию
|
|
|
|
```http
|
|
DELETE /api/smm/campaigns/{id}
|
|
```
|
|
|
|
**Параметры:**
|
|
|
|
- `id` (UUID) - ID кампании
|
|
|
|
**Ответ:** 204 No Content
|
|
|
|
---
|
|
|
|
## 2. ChannelController - Управление каналами
|
|
|
|
**Базовый путь:** `/api/smm/channels`
|
|
|
|
### 2.1 Получить все каналы
|
|
|
|
```http
|
|
GET /api/smm/channels
|
|
```
|
|
|
|
**Ответ:**
|
|
|
|
```json
|
|
[
|
|
{
|
|
"id": "550e8400-e29b-41d4-a716-446655440001",
|
|
"name": "Основной Telegram канал",
|
|
"type": "TELEGRAM",
|
|
"isActive": true
|
|
}
|
|
]
|
|
```
|
|
|
|
### 2.2 Получить канал по ID
|
|
|
|
```http
|
|
GET /api/smm/channels/{id}
|
|
```
|
|
|
|
**Параметры:**
|
|
|
|
- `id` (UUID) - ID канала
|
|
|
|
**Ответ:** Объект ChannelDto
|
|
|
|
### 2.3 Создать канал
|
|
|
|
```http
|
|
POST /api/smm/channels
|
|
Content-Type: application/json
|
|
```
|
|
|
|
**Тело запроса:**
|
|
|
|
```json
|
|
{
|
|
"name": "Основной Telegram канал",
|
|
"type": "TELEGRAM",
|
|
"apiKeyRef": "telegram_bot_token",
|
|
"isActive": true
|
|
}
|
|
```
|
|
|
|
**Валидация:**
|
|
|
|
- `name` - обязательное поле, не пустое
|
|
- `type` - обязательное поле, один из: TELEGRAM, VK, INSTAGRAM
|
|
- `apiKeyRef` - обязательное поле, не пустое
|
|
|
|
**Ответ:** 201 Created, объект ChannelDto
|
|
|
|
### 2.4 Обновить канал
|
|
|
|
```http
|
|
PUT /api/smm/channels/{id}
|
|
Content-Type: application/json
|
|
```
|
|
|
|
**Параметры:**
|
|
|
|
- `id` (UUID) - ID канала
|
|
|
|
**Тело запроса:** То же, что и при создании
|
|
|
|
**Ответ:** Объект ChannelDto
|
|
|
|
### 2.5 Удалить канал
|
|
|
|
```http
|
|
DELETE /api/smm/channels/{id}
|
|
```
|
|
|
|
**Параметры:**
|
|
|
|
- `id` (UUID) - ID канала
|
|
|
|
**Ответ:** 204 No Content
|
|
|
|
---
|
|
|
|
## 3. ContentController - Управление контентом
|
|
|
|
**Базовый путь:** `/api/smm/content`
|
|
|
|
### 3.1 Получить весь контент
|
|
|
|
```http
|
|
GET /api/smm/content
|
|
```
|
|
|
|
**Ответ:**
|
|
|
|
```json
|
|
[
|
|
{
|
|
"id": "550e8400-e29b-41d4-a716-446655440002",
|
|
"campaignId": "550e8400-e29b-41d4-a716-446655440000",
|
|
"locale": "ru",
|
|
"topic": "Новогодние скидки",
|
|
"postDraft": "Специальное предложение на новогодние праздники!",
|
|
"assetsRefs": "image1.jpg,image2.jpg",
|
|
"scheduledAt": "2024-01-15T10:00:00Z",
|
|
"priority": 1,
|
|
"status": "PENDING_APPROVAL"
|
|
}
|
|
]
|
|
```
|
|
|
|
### 3.2 Получить контент по ID
|
|
|
|
```http
|
|
GET /api/smm/content/{id}
|
|
```
|
|
|
|
**Параметры:**
|
|
|
|
- `id` (UUID) - ID контента
|
|
|
|
**Ответ:** Объект ContentQueueDto
|
|
|
|
### 3.3 Создать контент
|
|
|
|
```http
|
|
POST /api/smm/content
|
|
Content-Type: application/json
|
|
```
|
|
|
|
**Тело запроса:**
|
|
|
|
```json
|
|
{
|
|
"campaignId": "550e8400-e29b-41d4-a716-446655440000",
|
|
"locale": "ru",
|
|
"topic": "Новогодние скидки",
|
|
"postDraft": "Специальное предложение на новогодние праздники!",
|
|
"assetsRefs": "image1.jpg,image2.jpg",
|
|
"scheduledAt": "2024-01-15T10:00:00Z",
|
|
"priority": 1
|
|
}
|
|
```
|
|
|
|
**Валидация:**
|
|
|
|
- `campaignId` - обязательное поле, должен существовать
|
|
- `locale` - обязательное поле, не пустое
|
|
- `topic` - обязательное поле, не пустое
|
|
|
|
**Ответ:** 201 Created, объект ContentQueueDto
|
|
|
|
### 3.4 Обновить контент
|
|
|
|
```http
|
|
PUT /api/smm/content/{id}
|
|
Content-Type: application/json
|
|
```
|
|
|
|
**Параметры:**
|
|
|
|
- `id` (UUID) - ID контента
|
|
|
|
**Тело запроса:** То же, что и при создании
|
|
|
|
**Ответ:** Объект ContentQueueDto
|
|
|
|
### 3.5 Удалить контент
|
|
|
|
```http
|
|
DELETE /api/smm/content/{id}
|
|
```
|
|
|
|
**Параметры:**
|
|
|
|
- `id` (UUID) - ID контента
|
|
|
|
**Ответ:** 204 No Content
|
|
|
|
### 3.6 Одобрить контент
|
|
|
|
```http
|
|
POST /api/smm/content/{id}/approve
|
|
```
|
|
|
|
**Параметры:**
|
|
|
|
- `id` (UUID) - ID контента
|
|
|
|
**Ответ:** Объект ContentQueueDto со статусом APPROVED
|
|
|
|
### 3.7 Получить сообщения контента
|
|
|
|
```http
|
|
GET /api/smm/content/{id}/messages
|
|
```
|
|
|
|
**Параметры:**
|
|
|
|
- `id` (UUID) - ID контента
|
|
|
|
**Ответ:**
|
|
|
|
```json
|
|
[
|
|
{
|
|
"id": "550e8400-e29b-41d4-a716-446655440003",
|
|
"channelId": "550e8400-e29b-41d4-a716-446655440001",
|
|
"contentId": "550e8400-e29b-41d4-a716-446655440002",
|
|
"externalId": "12345",
|
|
"url": "https://t.me/channel/12345",
|
|
"postedAt": "2024-01-15T10:00:00Z"
|
|
}
|
|
]
|
|
```
|
|
|
|
---
|
|
|
|
## 4. PublishingController - Публикация контента
|
|
|
|
**Базовый путь:** `/api/smm/publishing`
|
|
|
|
### 4.1 Опубликовать контент
|
|
|
|
```http
|
|
POST /api/smm/publishing/post/{contentId}
|
|
```
|
|
|
|
**Параметры:**
|
|
|
|
- `contentId` (UUID) - ID контента для публикации
|
|
|
|
**Ответ:**
|
|
|
|
```json
|
|
{
|
|
"success": true,
|
|
"message": "Пост успешно опубликован",
|
|
"data": {
|
|
"messageId": "550e8400-e29b-41d4-a716-446655440003",
|
|
"externalUrl": "https://t.me/channel/12345"
|
|
}
|
|
}
|
|
```
|
|
|
|
**Примечание:** Контент должен быть в статусе APPROVED для публикации.
|
|
|
|
---
|
|
|
|
## 5. AnalyticsController - Аналитика
|
|
|
|
**Базовый путь:** `/api/smm/analytics`
|
|
|
|
### 5.1 Запустить сбор аналитики
|
|
|
|
```http
|
|
POST /api/smm/analytics/collect-now
|
|
```
|
|
|
|
**Ответ:**
|
|
|
|
```json
|
|
{
|
|
"success": true,
|
|
"message": "Сбор аналитики запущен."
|
|
}
|
|
```
|
|
|
|
**Примечание:** Этот эндпоинт предназначен для администраторов и отладки. Обычно аналитика собирается автоматически по расписанию.
|
|
|
|
---
|
|
|
|
## Типы данных
|
|
|
|
### CampaignStatus
|
|
|
|
```typescript
|
|
enum CampaignStatus {
|
|
PLANNED = 'PLANNED',
|
|
ACTIVE = 'ACTIVE',
|
|
COMPLETED = 'COMPLETED'
|
|
}
|
|
```
|
|
|
|
### ChannelType
|
|
|
|
```typescript
|
|
enum ChannelType {
|
|
TELEGRAM = 'TELEGRAM',
|
|
VK = 'VK',
|
|
INSTAGRAM = 'INSTAGRAM'
|
|
}
|
|
```
|
|
|
|
### ContentStatus
|
|
|
|
```typescript
|
|
enum ContentStatus {
|
|
DRAFT = 'DRAFT',
|
|
PENDING_APPROVAL = 'PENDING_APPROVAL',
|
|
APPROVED = 'APPROVED',
|
|
PUBLISHED = 'PUBLISHED',
|
|
FAILED = 'FAILED'
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
## Обработка ошибок
|
|
|
|
### Стандартные HTTP коды ответов:
|
|
|
|
- `200 OK` - Успешный запрос
|
|
- `201 Created` - Ресурс создан
|
|
- `204 No Content` - Успешное удаление
|
|
- `400 Bad Request` - Ошибка валидации
|
|
- `401 Unauthorized` - Не авторизован
|
|
- `403 Forbidden` - Нет доступа
|
|
- `404 Not Found` - Ресурс не найден
|
|
- `500 Internal Server Error` - Внутренняя ошибка сервера
|
|
|
|
### Формат ошибки:
|
|
|
|
```json
|
|
{
|
|
"timestamp": "2024-01-15T10:00:00Z",
|
|
"status": 400,
|
|
"error": "Bad Request",
|
|
"message": "Validation failed",
|
|
"path": "/api/smm/campaigns"
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
## Примеры использования
|
|
|
|
### Создание полного workflow:
|
|
|
|
1. **Создать кампанию:**
|
|
|
|
```javascript
|
|
const campaign = await fetch('/api/smm/campaigns', {
|
|
method: 'POST',
|
|
headers: {
|
|
'Content-Type': 'application/json',
|
|
Authorization: 'Bearer ' + token
|
|
},
|
|
body: JSON.stringify({
|
|
name: 'Новогодняя кампания',
|
|
goal: 'Увеличение продаж',
|
|
budget: 100000,
|
|
startAt: '2024-01-01T00:00:00Z',
|
|
endAt: '2024-01-31T23:59:59Z',
|
|
status: 'PLANNED'
|
|
})
|
|
});
|
|
```
|
|
|
|
2. **Создать канал:**
|
|
|
|
```javascript
|
|
const channel = await fetch('/api/smm/channels', {
|
|
method: 'POST',
|
|
headers: {
|
|
'Content-Type': 'application/json',
|
|
Authorization: 'Bearer ' + token
|
|
},
|
|
body: JSON.stringify({
|
|
name: 'Основной канал',
|
|
type: 'TELEGRAM',
|
|
apiKeyRef: 'telegram_bot_token',
|
|
isActive: true
|
|
})
|
|
});
|
|
```
|
|
|
|
3. **Создать контент:**
|
|
|
|
```javascript
|
|
const content = await fetch('/api/smm/content', {
|
|
method: 'POST',
|
|
headers: {
|
|
'Content-Type': 'application/json',
|
|
Authorization: 'Bearer ' + token
|
|
},
|
|
body: JSON.stringify({
|
|
campaignId: campaign.id,
|
|
locale: 'ru',
|
|
topic: 'Новогодние скидки',
|
|
postDraft: 'Специальное предложение!',
|
|
scheduledAt: '2024-01-15T10:00:00Z',
|
|
priority: 1
|
|
})
|
|
});
|
|
```
|
|
|
|
4. **Одобрить контент:**
|
|
|
|
```javascript
|
|
await fetch(`/api/smm/content/${content.id}/approve`, {
|
|
method: 'POST',
|
|
headers: {
|
|
Authorization: 'Bearer ' + token
|
|
}
|
|
});
|
|
```
|
|
|
|
5. **Опубликовать контент:**
|
|
|
|
```javascript
|
|
const publishResult = await fetch(`/api/smm/publishing/post/${content.id}`, {
|
|
method: 'POST',
|
|
headers: {
|
|
Authorization: 'Bearer ' + token
|
|
}
|
|
});
|
|
```
|
|
|
|
---
|
|
|
|
## Примечания
|
|
|
|
- Все даты передаются в формате ISO 8601 с UTC временной зоной
|
|
- UUID используются для всех идентификаторов
|
|
- Все запросы требуют аутентификации через JWT токен
|
|
- Система автоматически публикует контент по расписанию (если `scheduledAt` указан)
|
|
- Аналитика собирается автоматически каждый час
|