100 lines
3.1 KiB
TypeScript
100 lines
3.1 KiB
TypeScript
import api from './api';
|
||
|
||
// Типы данных
|
||
export interface AnalyticsLog {
|
||
id: number;
|
||
event_type: string;
|
||
user_id?: number;
|
||
session_id: string;
|
||
data: Record<string, any>;
|
||
created_at: string;
|
||
}
|
||
|
||
export interface AnalyticsLogCreate {
|
||
event_type: string;
|
||
session_id: string;
|
||
data: Record<string, any>;
|
||
}
|
||
|
||
export interface AnalyticsReport {
|
||
report_type: string;
|
||
data: Record<string, any>;
|
||
start_date?: string;
|
||
end_date?: string;
|
||
}
|
||
|
||
// Сервис для работы с аналитикой
|
||
export const analyticsService = {
|
||
// Логирование события аналитики
|
||
logEvent: async (event: AnalyticsLogCreate): Promise<AnalyticsLog> => {
|
||
const response = await api.post('/analytics/log', event);
|
||
return response.data;
|
||
},
|
||
|
||
// Получить логи аналитики (только для админов)
|
||
getLogs: async (params?: {
|
||
event_type?: string;
|
||
start_date?: string;
|
||
end_date?: string;
|
||
skip?: number;
|
||
limit?: number;
|
||
}): Promise<{ logs: AnalyticsLog[], total: number }> => {
|
||
const response = await api.get('/analytics/logs', { params });
|
||
return response.data;
|
||
},
|
||
|
||
// Получить отчет по аналитике (только для админов)
|
||
getReport: async (reportType: string, params?: {
|
||
start_date?: string;
|
||
end_date?: string;
|
||
}): Promise<AnalyticsReport> => {
|
||
const response = await api.get(`/analytics/report`, {
|
||
params: {
|
||
report_type: reportType,
|
||
...params
|
||
}
|
||
});
|
||
return response.data;
|
||
},
|
||
|
||
// Инициализация отслеживания сессии
|
||
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> => {
|
||
const sessionId = analyticsService.initTracking();
|
||
await analyticsService.logEvent({
|
||
event_type: 'page_view',
|
||
session_id: sessionId,
|
||
data: { path }
|
||
});
|
||
},
|
||
|
||
// Отслеживание просмотра товара
|
||
trackProductView: async (productId: number, productName: string): Promise<void> => {
|
||
const sessionId = analyticsService.initTracking();
|
||
await analyticsService.logEvent({
|
||
event_type: 'product_view',
|
||
session_id: sessionId,
|
||
data: { product_id: productId, product_name: productName }
|
||
});
|
||
},
|
||
|
||
// Отслеживание добавления товара в корзину
|
||
trackAddToCart: async (productId: number, productName: string, quantity: number): Promise<void> => {
|
||
const sessionId = analyticsService.initTracking();
|
||
await analyticsService.logEvent({
|
||
event_type: 'add_to_cart',
|
||
session_id: sessionId,
|
||
data: { product_id: productId, product_name: productName, quantity }
|
||
});
|
||
}
|
||
};
|