Files
shorturl-analytics/api/events.ts
2025-03-25 17:26:04 +08:00

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;