76 lines
2.9 KiB
TypeScript
76 lines
2.9 KiB
TypeScript
import { NextRequest, NextResponse } from 'next/server';
|
|
import type { ApiResponse, EventsQueryParams, EventType } from '@/lib/types';
|
|
import { getEvents } from '@/lib/analytics';
|
|
|
|
// 获取事件列表
|
|
export async function GET(request: NextRequest) {
|
|
try {
|
|
const searchParams = request.nextUrl.searchParams;
|
|
|
|
// 构建查询参数,所有参数都是可选的
|
|
const params: Partial<EventsQueryParams> = {
|
|
// 时间范围参数现在是可选的
|
|
...(searchParams.has('startTime') && { startTime: searchParams.get('startTime')! }),
|
|
...(searchParams.has('endTime') && { endTime: searchParams.get('endTime')! }),
|
|
|
|
// 其他过滤参数
|
|
...(searchParams.has('eventType') && { eventType: searchParams.get('eventType') as EventType }),
|
|
...(searchParams.has('linkId') && { linkId: searchParams.get('linkId')! }),
|
|
...(searchParams.has('linkSlug') && { linkSlug: searchParams.get('linkSlug')! }),
|
|
...(searchParams.has('userId') && { userId: searchParams.get('userId')! }),
|
|
...(searchParams.has('teamId') && { teamId: searchParams.get('teamId')! }),
|
|
...(searchParams.has('projectId') && { projectId: searchParams.get('projectId')! }),
|
|
...(searchParams.has('tags') && {
|
|
tags: searchParams.get('tags')!.split(',').filter(Boolean)
|
|
}),
|
|
...(searchParams.has('searchSlug') && { searchSlug: searchParams.get('searchSlug')! }),
|
|
|
|
// 分页和排序参数,设置默认值
|
|
page: searchParams.has('page') ? parseInt(searchParams.get('page')!, 10) : 1,
|
|
pageSize: searchParams.has('pageSize') ? parseInt(searchParams.get('pageSize')!, 10) : 20,
|
|
...(searchParams.has('sortBy') && { sortBy: searchParams.get('sortBy')! }),
|
|
...(searchParams.has('sortOrder') && {
|
|
sortOrder: searchParams.get('sortOrder') as 'asc' | 'desc'
|
|
})
|
|
};
|
|
|
|
// 验证 tags 参数
|
|
if (params.tags?.some(tag => !tag.trim())) {
|
|
return NextResponse.json({
|
|
success: false,
|
|
error: 'Invalid tags format'
|
|
}, { status: 400 });
|
|
}
|
|
|
|
// 获取事件数据
|
|
const { events, total } = await getEvents(params);
|
|
|
|
// 构建响应
|
|
const response: ApiResponse<typeof events> = {
|
|
success: true,
|
|
data: events,
|
|
meta: {
|
|
total,
|
|
page: params.page || 1,
|
|
pageSize: params.pageSize || 20,
|
|
filters: {
|
|
startTime: params.startTime,
|
|
endTime: params.endTime,
|
|
tags: params.tags,
|
|
teamId: params.teamId,
|
|
projectId: params.projectId,
|
|
searchSlug: params.searchSlug
|
|
}
|
|
}
|
|
};
|
|
|
|
return NextResponse.json(response);
|
|
} catch (error) {
|
|
console.error('Error in GET /events:', error);
|
|
const response: ApiResponse<null> = {
|
|
success: false,
|
|
error: error instanceof Error ? error.message : 'Unknown error occurred'
|
|
};
|
|
return NextResponse.json(response, { status: 500 });
|
|
}
|
|
}
|