Files
Podcast-Generator/web/src/app/api/generate-podcast/route.ts
hex2077 e479ffb789 feat: 实现积分系统与认证重构
重构认证系统,从next-auth迁移至better-auth,并实现完整的积分系统功能:
1. 新增积分账户管理、交易记录和扣减逻辑
2. 添加积分概览组件和API端点
3. 重构认证相关组件和路由
4. 优化播客生成流程与积分校验
5. 新增安全配置文档和数据库schema
6. 改进UI状态管理和错误处理

新增功能包括:
- 用户注册自动初始化积分账户
- 播客生成前检查积分余额
- 积分交易记录查询
- 用户积分实时显示
- 安全回调处理
2025-08-18 00:21:02 +08:00

56 lines
2.0 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import { NextRequest, NextResponse } from 'next/server';
import { startPodcastGenerationTask } from '@/lib/podcastApi';
import type { PodcastGenerationRequest } from '@/types';
import { getSessionData } from '@/lib/server-actions';
import { getUserPoints } from '@/lib/points'; // 导入 getUserPoints
export async function POST(request: NextRequest) {
const session = await getSessionData();
const userId = session.user?.id;
if (!userId) {
return NextResponse.json(
{ success: false, error: '用户未登录或会话已过期' },
{ status: 403 }
);
}
try {
const body: PodcastGenerationRequest = await request.json();
// 1. 查询用户积分
const currentPoints = await getUserPoints(userId);
const POINTS_PER_PODCAST = parseInt(process.env.POINTS_PER_PODCAST || '10', 10); // 从环境变量获取默认10
// 2. 检查积分是否足够
if (currentPoints === null || currentPoints < POINTS_PER_PODCAST) {
return NextResponse.json(
{ success: false, error: `积分不足,生成一个播客需要 ${POINTS_PER_PODCAST} 积分,您当前只有 ${currentPoints || 0} 积分。` },
{ status: 403 } // 403 Forbidden - 权限不足,因为积分不足
);
}
// 积分足够,继续生成播客
const result = await startPodcastGenerationTask(body, userId);
if (result.success) {
return NextResponse.json({
success: true,
data: result.data,
});
} else {
return NextResponse.json(
{ success: false, error: result.error },
{ status: result.statusCode || 400 } // Use 400 for client-side errors, or 500 for internal server errors
);
}
} catch (error: any) {
console.error('Error in generate-podcast API:', error);
const statusCode = error.statusCode || 500; // 假设 HttpError 会有 statusCode 属性
return NextResponse.json(
{ success: false, error: error.message || '服务器内部错误' },
{ status: statusCode }
);
}
}