forked from 77media/video-flow
206 lines
5.7 KiB
TypeScript
206 lines
5.7 KiB
TypeScript
/**
|
|
* 视频编辑点API路由
|
|
* 提供编辑点的CRUD操作
|
|
*/
|
|
|
|
import { NextRequest, NextResponse } from 'next/server';
|
|
import { EditPoint, EditPointStatus } from '@/components/pages/work-flow/video-edit/types';
|
|
|
|
// 临时内存存储(生产环境应使用数据库)
|
|
let editPointsStorage: EditPoint[] = [];
|
|
let idCounter = 1;
|
|
|
|
/**
|
|
* 获取编辑点列表
|
|
* GET /api/video-edit/edit-points?video_id=xxx&project_id=xxx
|
|
*/
|
|
export async function GET(request: NextRequest) {
|
|
try {
|
|
const { searchParams } = new URL(request.url);
|
|
const videoId = searchParams.get('video_id');
|
|
const projectId = searchParams.get('project_id');
|
|
const offset = parseInt(searchParams.get('offset') || '0');
|
|
const limit = parseInt(searchParams.get('limit') || '50');
|
|
|
|
console.log('📋 获取编辑点列表请求:', { videoId, projectId, offset, limit });
|
|
|
|
if (!videoId || !projectId) {
|
|
return NextResponse.json({
|
|
code: 400,
|
|
successful: false,
|
|
message: 'video_id and project_id are required',
|
|
data: null
|
|
}, { status: 400 });
|
|
}
|
|
|
|
// 过滤匹配的编辑点
|
|
const filteredPoints = editPointsStorage.filter(point =>
|
|
point.videoId === videoId && point.projectId === projectId
|
|
);
|
|
|
|
// 分页
|
|
const paginatedPoints = filteredPoints.slice(offset, offset + limit);
|
|
|
|
// 转换为API响应格式
|
|
const apiPoints = paginatedPoints.map(point => ({
|
|
id: point.id,
|
|
video_id: point.videoId,
|
|
project_id: point.projectId,
|
|
user_id: point.userId,
|
|
position_x: point.position.x,
|
|
position_y: point.position.y,
|
|
timestamp: point.timestamp,
|
|
description: point.description,
|
|
status: point.status,
|
|
created_at: point.createdAt,
|
|
updated_at: point.updatedAt
|
|
}));
|
|
|
|
const response = {
|
|
code: 0,
|
|
successful: true,
|
|
message: 'Success',
|
|
data: {
|
|
edit_points: apiPoints,
|
|
total_count: filteredPoints.length,
|
|
has_more: offset + limit < filteredPoints.length
|
|
}
|
|
};
|
|
|
|
console.log('✅ 编辑点列表获取成功:', response.data);
|
|
return NextResponse.json(response);
|
|
|
|
} catch (error) {
|
|
console.error('❌ 获取编辑点列表失败:', error);
|
|
return NextResponse.json({
|
|
code: 500,
|
|
successful: false,
|
|
message: 'Internal server error',
|
|
data: null
|
|
}, { status: 500 });
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 创建编辑点
|
|
* POST /api/video-edit/edit-points
|
|
*/
|
|
export async function POST(request: NextRequest) {
|
|
try {
|
|
const body = await request.json();
|
|
const { video_id, project_id, position_x, position_y, timestamp, description, status } = body;
|
|
|
|
console.log('📝 创建编辑点请求:', body);
|
|
|
|
if (!video_id || !project_id || position_x === undefined || position_y === undefined || timestamp === undefined) {
|
|
return NextResponse.json({
|
|
code: 400,
|
|
successful: false,
|
|
message: 'Missing required fields',
|
|
data: null
|
|
}, { status: 400 });
|
|
}
|
|
|
|
// 创建新编辑点
|
|
const newEditPoint: EditPoint = {
|
|
id: `edit-point-${idCounter++}`,
|
|
videoId: video_id,
|
|
projectId: project_id,
|
|
userId: 1, // 从认证中获取,这里暂时硬编码
|
|
position: {
|
|
x: position_x,
|
|
y: position_y
|
|
},
|
|
timestamp,
|
|
description: description || '',
|
|
status: status || EditPointStatus.PENDING,
|
|
createdAt: Date.now(),
|
|
updatedAt: Date.now(),
|
|
showInput: false,
|
|
connectionDirection: 'auto'
|
|
};
|
|
|
|
// 存储编辑点
|
|
editPointsStorage.push(newEditPoint);
|
|
|
|
// 转换为API响应格式
|
|
const apiResponse = {
|
|
id: newEditPoint.id,
|
|
videoId: newEditPoint.videoId,
|
|
projectId: newEditPoint.projectId,
|
|
userId: newEditPoint.userId,
|
|
position: newEditPoint.position,
|
|
timestamp: newEditPoint.timestamp,
|
|
description: newEditPoint.description,
|
|
status: newEditPoint.status,
|
|
createdAt: newEditPoint.createdAt,
|
|
updatedAt: newEditPoint.updatedAt
|
|
};
|
|
|
|
const response = {
|
|
code: 0,
|
|
successful: true,
|
|
message: 'Edit point created successfully',
|
|
data: apiResponse
|
|
};
|
|
|
|
console.log('✅ 编辑点创建成功:', response.data);
|
|
return NextResponse.json(response);
|
|
|
|
} catch (error) {
|
|
console.error('❌ 创建编辑点失败:', error);
|
|
return NextResponse.json({
|
|
code: 500,
|
|
successful: false,
|
|
message: 'Internal server error',
|
|
data: null
|
|
}, { status: 500 });
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 批量删除编辑点
|
|
* DELETE /api/video-edit/edit-points (with body)
|
|
*/
|
|
export async function DELETE(request: NextRequest) {
|
|
try {
|
|
const body = await request.json();
|
|
const { edit_point_ids } = body;
|
|
|
|
console.log('🗑️ 批量删除编辑点请求:', { edit_point_ids });
|
|
|
|
if (!edit_point_ids || !Array.isArray(edit_point_ids)) {
|
|
return NextResponse.json({
|
|
code: 400,
|
|
successful: false,
|
|
message: 'edit_point_ids array is required',
|
|
data: null
|
|
}, { status: 400 });
|
|
}
|
|
|
|
// 删除指定的编辑点
|
|
const initialLength = editPointsStorage.length;
|
|
editPointsStorage = editPointsStorage.filter(point => !edit_point_ids.includes(point.id));
|
|
const deletedCount = initialLength - editPointsStorage.length;
|
|
|
|
const response = {
|
|
code: 0,
|
|
successful: true,
|
|
message: `Successfully deleted ${deletedCount} edit points`,
|
|
data: { deleted_count: deletedCount }
|
|
};
|
|
|
|
console.log('✅ 批量删除编辑点成功:', response.data);
|
|
return NextResponse.json(response);
|
|
|
|
} catch (error) {
|
|
console.error('❌ 批量删除编辑点失败:', error);
|
|
return NextResponse.json({
|
|
code: 500,
|
|
successful: false,
|
|
message: 'Internal server error',
|
|
data: null
|
|
}, { status: 500 });
|
|
}
|
|
}
|