152 lines
4.1 KiB
TypeScript
152 lines
4.1 KiB
TypeScript
import { Router } from 'express';
|
|
import type { Request, Response } from 'express';
|
|
import type { ApiResponse, EventsQueryParams } from '../lib/types';
|
|
import {
|
|
getEvents,
|
|
getEventsSummary,
|
|
getTimeSeriesData,
|
|
getGeoAnalytics,
|
|
getDeviceAnalytics
|
|
} from '../lib/analytics';
|
|
|
|
const router = Router();
|
|
|
|
// 获取事件列表
|
|
router.get('/', async (req: Request, res: Response) => {
|
|
try {
|
|
const params: EventsQueryParams = {
|
|
startTime: req.query.startTime as string,
|
|
endTime: req.query.endTime as string,
|
|
eventType: req.query.eventType as string,
|
|
linkId: req.query.linkId as string,
|
|
linkSlug: req.query.linkSlug as string,
|
|
userId: req.query.userId as string,
|
|
teamId: req.query.teamId as string,
|
|
projectId: req.query.projectId as string,
|
|
page: req.query.page ? parseInt(req.query.page as string, 10) : 1,
|
|
pageSize: req.query.pageSize ? parseInt(req.query.pageSize as string, 10) : 20,
|
|
sortBy: req.query.sortBy as string,
|
|
sortOrder: req.query.sortOrder as 'asc' | 'desc'
|
|
};
|
|
|
|
const { events, total } = await getEvents(params);
|
|
|
|
const response: ApiResponse<typeof events> = {
|
|
success: true,
|
|
data: events,
|
|
meta: {
|
|
total,
|
|
page: params.page,
|
|
pageSize: params.pageSize
|
|
}
|
|
};
|
|
|
|
res.json(response);
|
|
} catch (error) {
|
|
const response: ApiResponse<null> = {
|
|
success: false,
|
|
error: error instanceof Error ? error.message : 'Unknown error occurred'
|
|
};
|
|
res.status(500).json(response);
|
|
}
|
|
});
|
|
|
|
// 获取事件概览
|
|
router.get('/summary', async (req: Request, res: Response) => {
|
|
try {
|
|
const summary = await getEventsSummary({
|
|
startTime: req.query.startTime as string,
|
|
endTime: req.query.endTime as string,
|
|
linkId: req.query.linkId as string
|
|
});
|
|
|
|
const response: ApiResponse<typeof summary> = {
|
|
success: true,
|
|
data: summary
|
|
};
|
|
|
|
res.json(response);
|
|
} catch (error) {
|
|
const response: ApiResponse<null> = {
|
|
success: false,
|
|
error: error instanceof Error ? error.message : 'Unknown error occurred'
|
|
};
|
|
res.status(500).json(response);
|
|
}
|
|
});
|
|
|
|
// 获取时间序列数据
|
|
router.get('/time-series', async (req: Request, res: Response) => {
|
|
try {
|
|
const data = await getTimeSeriesData({
|
|
startTime: req.query.startTime as string,
|
|
endTime: req.query.endTime as string,
|
|
linkId: req.query.linkId as string,
|
|
granularity: (req.query.granularity || 'day') as 'hour' | 'day' | 'week' | 'month'
|
|
});
|
|
|
|
const response: ApiResponse<typeof data> = {
|
|
success: true,
|
|
data
|
|
};
|
|
|
|
res.json(response);
|
|
} catch (error) {
|
|
const response: ApiResponse<null> = {
|
|
success: false,
|
|
error: error instanceof Error ? error.message : 'Unknown error occurred'
|
|
};
|
|
res.status(500).json(response);
|
|
}
|
|
});
|
|
|
|
// 获取地理位置分析
|
|
router.get('/geo', async (req: Request, res: Response) => {
|
|
try {
|
|
const data = await getGeoAnalytics({
|
|
startTime: req.query.startTime as string,
|
|
endTime: req.query.endTime as string,
|
|
linkId: req.query.linkId as string,
|
|
groupBy: (req.query.groupBy || 'country') as 'country' | 'city'
|
|
});
|
|
|
|
const response: ApiResponse<typeof data> = {
|
|
success: true,
|
|
data
|
|
};
|
|
|
|
res.json(response);
|
|
} catch (error) {
|
|
const response: ApiResponse<null> = {
|
|
success: false,
|
|
error: error instanceof Error ? error.message : 'Unknown error occurred'
|
|
};
|
|
res.status(500).json(response);
|
|
}
|
|
});
|
|
|
|
// 获取设备分析
|
|
router.get('/devices', async (req: Request, res: Response) => {
|
|
try {
|
|
const data = await getDeviceAnalytics({
|
|
startTime: req.query.startTime as string,
|
|
endTime: req.query.endTime as string,
|
|
linkId: req.query.linkId as string
|
|
});
|
|
|
|
const response: ApiResponse<typeof data> = {
|
|
success: true,
|
|
data
|
|
};
|
|
|
|
res.json(response);
|
|
} catch (error) {
|
|
const response: ApiResponse<null> = {
|
|
success: false,
|
|
error: error instanceof Error ? error.message : 'Unknown error occurred'
|
|
};
|
|
res.status(500).json(response);
|
|
}
|
|
});
|
|
|
|
export default router;
|