import api from './api'; // Типы данных для аналитики export interface AnalyticsLog { id: number; event_type: string; user_id?: number; page_url?: string; product_id?: number; category_id?: number; ip_address?: string; user_agent?: string; referrer?: string; additional_data?: Record; created_at: string; } export interface AnalyticsLogCreate { event_type: string; page_url?: string; product_id?: number; category_id?: number; ip_address?: string; user_agent?: string; referrer?: string; additional_data?: Record; user_id?: number; } export interface AnalyticsReport { report_type: string; data: Record; start_date?: string; end_date?: string; } export interface UserReport { id: number; email: string; name: string; orders: number; total_spent: number; average_order_value: number; last_order: string; first_order: string; } // Сервис для работы с аналитикой export const analyticsService = { // Логирование события аналитики logEvent: async (event: AnalyticsLogCreate): Promise => { try { const response = await api.post('/analytics/log', event); return response as AnalyticsLog; } catch (error) { console.error('Ошибка при логировании события:', error); return null; } }, // Получить логи аналитики (только для админов) getLogs: async (params?: { event_type?: string; start_date?: string; end_date?: string; skip?: number; limit?: number; }): Promise => { try { const response = await api.get('/analytics/logs', { params }); return response as AnalyticsLog[]; } catch (error) { console.error('Ошибка при получении логов аналитики:', error); return []; } }, // Получить отчет по аналитике (только для админов) getReport: async (reportType: string, params?: { start_date?: string; end_date?: string; }): Promise => { try { const queryParams = { report_type: reportType, ...params }; const response = await api.get('/analytics/report', { params: queryParams }); return response; } catch (error) { console.error('Ошибка при получении отчета:', error); return null; } }, // Получить отчет по пользователям (только для админов) getUsersReport: async (params?: { start_date?: string; end_date?: string; limit?: number; sort_by?: 'orders' | 'total_spent' | 'average_order_value'; order?: 'asc' | 'desc'; }): Promise => { try { const response = await api.get('/reports/users', { params }); return response as UserReport[]; } catch (error) { console.error('Ошибка при получении отчета по пользователям:', error); return null; } }, // Инициализация отслеживания сессии initTracking: (): string => { // Генерируем ID сессии, если его нет let sessionId = localStorage.getItem('session_id'); if (!sessionId) { sessionId = `session_${Date.now()}_${Math.random().toString(36).substring(2, 9)}`; localStorage.setItem('session_id', sessionId); } return sessionId; }, // Отслеживание просмотра страницы trackPageView: async (path: string): Promise => { try { await analyticsService.logEvent({ event_type: 'page_view', page_url: path, user_agent: navigator?.userAgent, referrer: document?.referrer, }); } catch (error) { console.error('Ошибка при отслеживании просмотра страницы:', error); } }, // Отслеживание просмотра товара trackProductView: async (productId: number): Promise => { try { await analyticsService.logEvent({ event_type: 'product_view', product_id: productId, user_agent: navigator?.userAgent, referrer: document?.referrer, }); } catch (error) { console.error('Ошибка при отслеживании просмотра товара:', error); } }, // Отслеживание добавления товара в корзину trackAddToCart: async (productId: number, additionalData?: Record): Promise => { try { await analyticsService.logEvent({ event_type: 'add_to_cart', product_id: productId, user_agent: navigator?.userAgent, additional_data: additionalData, }); } catch (error) { console.error('Ошибка при отслеживании добавления товара в корзину:', error); } } }; export default analyticsService;