167 lines
5.1 KiB
TypeScript
167 lines
5.1 KiB
TypeScript
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<string, any>;
|
||
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<string, any>;
|
||
user_id?: number;
|
||
}
|
||
|
||
export interface AnalyticsReport {
|
||
report_type: string;
|
||
data: Record<string, any>;
|
||
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<AnalyticsLog | null> => {
|
||
try {
|
||
const response = await api.post<AnalyticsLog>('/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<AnalyticsLog[]> => {
|
||
try {
|
||
const response = await api.get<AnalyticsLog[]>('/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<any> => {
|
||
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<UserReport[] | null> => {
|
||
try {
|
||
const response = await api.get<UserReport[]>('/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<void> => {
|
||
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<void> => {
|
||
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<string, any>): Promise<void> => {
|
||
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;
|