203 lines
6.9 KiB
JavaScript
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();
|