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} */ 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} */ 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} */ 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} */ 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} */ 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();