重构认证系统,从next-auth迁移至better-auth,并实现完整的积分系统功能: 1. 新增积分账户管理、交易记录和扣减逻辑 2. 添加积分概览组件和API端点 3. 重构认证相关组件和路由 4. 优化播客生成流程与积分校验 5. 新增安全配置文档和数据库schema 6. 改进UI状态管理和错误处理 新增功能包括: - 用户注册自动初始化积分账户 - 播客生成前检查积分余额 - 积分交易记录查询 - 用户积分实时显示 - 安全回调处理
56 lines
2.0 KiB
TypeScript
56 lines
2.0 KiB
TypeScript
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 }
|
||
);
|
||
}
|
||
}
|