route.ts 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. import { NextRequest, NextResponse } from 'next/server';
  2. import { db } from '@/lib/db';
  3. import { users, userActivities } from '@/lib/schema';
  4. import { eq, and, lt } from 'drizzle-orm';
  5. export async function POST(request: NextRequest) {
  6. try {
  7. console.log('检查过期订阅...');
  8. // 查找所有过期的订阅
  9. const expiredSubscriptions = await db.query.users.findMany({
  10. where: and(
  11. eq(users.subscriptionStatus, 'active'),
  12. lt(users.subscriptionEndDate, new Date())
  13. ),
  14. });
  15. let updatedCount = 0;
  16. for (const user of expiredSubscriptions) {
  17. // 清零订阅积分并更新订阅状态
  18. await db.update(users)
  19. .set({
  20. subscriptionCredits: 0,
  21. subscriptionStatus: 'expired',
  22. updatedAt: new Date()
  23. })
  24. .where(eq(users.id, user.id));
  25. // 记录订阅过期活动
  26. await db.insert(userActivities).values({
  27. userId: user.id,
  28. type: 'subscription_expired',
  29. description: 'credit_description.subscription_expired',
  30. creditAmount: -(user.subscriptionCredits || 0),
  31. metadata: JSON.stringify({
  32. expiredDate: new Date().toISOString(),
  33. previousCredits: user.subscriptionCredits || 0,
  34. planType: user.subscriptionPlan || 'pro'
  35. }),
  36. createdAt: new Date(),
  37. });
  38. updatedCount++;
  39. console.log(`用户 ${user.email} 的订阅已过期,积分已清零`);
  40. }
  41. return NextResponse.json({
  42. success: true,
  43. message: `已处理 ${updatedCount} 个过期订阅`,
  44. updatedCount
  45. });
  46. } catch (error: any) {
  47. console.error('检查订阅失败:', error);
  48. return NextResponse.json(
  49. { error: error.message || '检查订阅失败' },
  50. { status: 500 }
  51. );
  52. }
  53. }
  54. // 也支持 GET 请求进行手动检查
  55. export async function GET(request: NextRequest) {
  56. return POST(request);
  57. }