Files
marketing/src/service/CampaignService.js
T
2025-09-24 10:10:42 +05:00

203 lines
6.9 KiB
JavaScript

import { API_CONFIG, DEFAULT_REQUEST_CONFIG } from '@/config/api.js';
import AuthService from '@/service/AuthService.js';
import { CampaignDto } from '@/types/smm.js';
/**
* CampaignService - Управление кампаниями
* Базовый путь: /api/smm/campaigns
*/
class CampaignService {
constructor() {
this.baseUrl = API_CONFIG.SMM_BASE_URL;
this.endpoints = {
campaigns: API_CONFIG.ENDPOINTS.CAMPAIGNS,
campaignById: API_CONFIG.ENDPOINTS.CAMPAIGN_BY_ID
};
}
/**
* Получить все кампании
* GET /api/smm/campaigns
* @returns {Promise<CampaignDto[]>}
*/
async getAllCampaigns() {
try {
const response = await AuthService.authFetch(`${this.baseUrl}${this.endpoints.campaigns}`, {
method: 'GET',
headers: {
...DEFAULT_REQUEST_CONFIG.headers
}
});
if (!response.ok) {
throw new Error(`HTTP error! status: ${response.status}`);
}
const data = await response.json();
return data.map((campaign) => new CampaignDto(campaign));
} catch (error) {
console.error('Error fetching campaigns:', error);
throw error;
}
}
/**
* Получить кампанию по ID
* GET /api/smm/campaigns/{id}
* @param {string} id - UUID кампании
* @returns {Promise<CampaignDto>}
*/
async getCampaignById(id) {
try {
const response = await AuthService.authFetch(`${this.baseUrl}${this.endpoints.campaignById}/${id}`, {
method: 'GET',
headers: {
...DEFAULT_REQUEST_CONFIG.headers
}
});
if (!response.ok) {
throw new Error(`HTTP error! status: ${response.status}`);
}
const data = await response.json();
return new CampaignDto(data);
} catch (error) {
console.error(`Error fetching campaign ${id}:`, error);
throw error;
}
}
/**
* Создать кампанию
* POST /api/smm/campaigns
* @param {Object} campaignData - Данные кампании
* @param {string} campaignData.name - Название кампании
* @param {string} campaignData.goal - Цель кампании
* @param {number} campaignData.budget - Бюджет кампании
* @param {string} campaignData.startAt - Дата начала (ISO 8601)
* @param {string} campaignData.endAt - Дата окончания (ISO 8601)
* @param {string} campaignData.status - Статус кампании
* @returns {Promise<CampaignDto>}
*/
async createCampaign(campaignData) {
try {
// Валидация
this.validateCampaignData(campaignData);
const response = await AuthService.authFetch(`${this.baseUrl}${this.endpoints.campaigns}`, {
method: 'POST',
headers: {
...DEFAULT_REQUEST_CONFIG.headers
},
body: JSON.stringify(campaignData)
});
if (!response.ok) {
const errorData = await response.json();
throw new Error(`HTTP error! status: ${response.status}, message: ${errorData.message || 'Unknown error'}`);
}
const data = await response.json();
return new CampaignDto(data);
} catch (error) {
console.error('Error creating campaign:', error);
throw error;
}
}
/**
* Обновить кампанию
* PUT /api/smm/campaigns/{id}
* @param {string} id - UUID кампании
* @param {Object} campaignData - Данные кампании
* @returns {Promise<CampaignDto>}
*/
async updateCampaign(id, campaignData) {
try {
// Валидация
this.validateCampaignData(campaignData);
const response = await AuthService.authFetch(`${this.baseUrl}${this.endpoints.campaignById}/${id}`, {
method: 'PUT',
headers: {
...DEFAULT_REQUEST_CONFIG.headers
},
body: JSON.stringify(campaignData)
});
if (!response.ok) {
const errorData = await response.json();
throw new Error(`HTTP error! status: ${response.status}, message: ${errorData.message || 'Unknown error'}`);
}
const data = await response.json();
return new CampaignDto(data);
} catch (error) {
console.error(`Error updating campaign ${id}:`, error);
throw error;
}
}
/**
* Удалить кампанию
* DELETE /api/smm/campaigns/{id}
* @param {string} id - UUID кампании
* @returns {Promise<void>}
*/
async deleteCampaign(id) {
try {
const response = await AuthService.authFetch(`${this.baseUrl}${this.endpoints.campaignById}/${id}`, {
method: 'DELETE'
});
if (!response.ok) {
throw new Error(`HTTP error! status: ${response.status}`);
}
} catch (error) {
console.error(`Error deleting campaign ${id}:`, error);
throw error;
}
}
/**
* Валидация данных кампании
* @param {Object} campaignData - Данные кампании
* @throws {Error} Если валидация не прошла
*/
validateCampaignData(campaignData) {
if (!campaignData.name || campaignData.name.trim() === '') {
throw new Error('Название кампании обязательно');
}
if (campaignData.budget !== undefined && campaignData.budget < 0) {
throw new Error('Бюджет должен быть >= 0');
}
if (campaignData.startAt) {
const startDate = new Date(campaignData.startAt);
if (isNaN(startDate.getTime())) {
throw new Error('Неверный формат даты начала');
}
}
if (campaignData.endAt) {
const endDate = new Date(campaignData.endAt);
if (isNaN(endDate.getTime())) {
throw new Error('Неверный формат даты окончания');
}
}
if (campaignData.startAt && campaignData.endAt) {
const startDate = new Date(campaignData.startAt);
const endDate = new Date(campaignData.endAt);
if (endDate <= startDate) {
throw new Error('Дата окончания должна быть позже даты начала');
}
}
}
}
// Экспорт singleton instance
export default new CampaignService();