route.ts 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. import { NextRequest, NextResponse } from 'next/server';
  2. import { auth } from '@/lib/auth';
  3. import { db } from '@/lib/db';
  4. import { userActivities, users } from '@/lib/schema';
  5. import { eq, desc } from 'drizzle-orm';
  6. export async function GET(request: NextRequest) {
  7. try {
  8. // 验证用户登录状态
  9. const session = await auth();
  10. if (!session?.user?.email) {
  11. return NextResponse.json(
  12. { error: '请先登录' },
  13. { status: 401 }
  14. );
  15. }
  16. // 获取用户ID
  17. const user = await db.query.users.findFirst({
  18. where: eq(users.email, session.user.email),
  19. });
  20. if (!user) {
  21. return NextResponse.json(
  22. { error: '用户不存在' },
  23. { status: 404 }
  24. );
  25. }
  26. // 获取查询参数
  27. const { searchParams } = new URL(request.url);
  28. const page = parseInt(searchParams.get('page') || '1');
  29. const limit = parseInt(searchParams.get('limit') || '20');
  30. const offset = (page - 1) * limit;
  31. // 查询用户活动记录
  32. const activities = await db
  33. .select()
  34. .from(userActivities)
  35. .where(eq(userActivities.userId, user.id))
  36. .orderBy(desc(userActivities.createdAt))
  37. .limit(limit)
  38. .offset(offset);
  39. // 格式化活动记录
  40. const formattedActivities = activities.map(activity => ({
  41. id: activity.id,
  42. type: activity.type,
  43. description: activity.description,
  44. creditAmount: activity.creditAmount,
  45. createdAt: activity.createdAt,
  46. metadata: activity.metadata ? JSON.parse(activity.metadata) : null
  47. }));
  48. return NextResponse.json({
  49. success: true,
  50. activities: formattedActivities,
  51. pagination: {
  52. page,
  53. limit,
  54. hasMore: activities.length === limit
  55. }
  56. });
  57. } catch (error) {
  58. console.error('获取活动记录失败:', error);
  59. return NextResponse.json(
  60. { error: '获取活动记录失败' },
  61. { status: 500 }
  62. );
  63. }
  64. }