51 lines
1.5 KiB
TypeScript
51 lines
1.5 KiB
TypeScript
import { NextRequest } from 'next/server'
|
|
import { requireProjectAuth, isErrorResponse } from '@/lib/api-auth'
|
|
import { apiHandler, ApiError } from '@/lib/api-errors'
|
|
import { TASK_TYPE } from '@/lib/task/types'
|
|
import { maybeSubmitLLMTask } from '@/lib/llm-observe/route-task'
|
|
|
|
export const runtime = 'nodejs'
|
|
|
|
export const POST = apiHandler(async (
|
|
request: NextRequest,
|
|
context: { params: Promise<{ projectId: string }> },
|
|
) => {
|
|
const { projectId } = await context.params
|
|
const body = await request.json().catch(() => ({}))
|
|
const episodeId = typeof body?.episodeId === 'string' ? body.episodeId.trim() : ''
|
|
const content = typeof body?.content === 'string' ? body.content.trim() : ''
|
|
|
|
if (!episodeId) {
|
|
throw new ApiError('INVALID_PARAMS')
|
|
}
|
|
if (!content) {
|
|
throw new ApiError('INVALID_PARAMS')
|
|
}
|
|
|
|
const authResult = await requireProjectAuth(projectId, {
|
|
include: { characters: true, locations: true },
|
|
})
|
|
if (isErrorResponse(authResult)) return authResult
|
|
const { session } = authResult
|
|
|
|
const asyncTaskResponse = await maybeSubmitLLMTask({
|
|
request,
|
|
userId: session.user.id,
|
|
projectId,
|
|
episodeId,
|
|
type: TASK_TYPE.STORY_TO_SCRIPT_RUN,
|
|
targetType: 'NovelPromotionEpisode',
|
|
targetId: episodeId,
|
|
routePath: `/api/novel-promotion/${projectId}/story-to-script-stream`,
|
|
body: {
|
|
...body,
|
|
displayMode: 'detail',
|
|
},
|
|
dedupeKey: `story_to_script_run:${episodeId}`,
|
|
priority: 2,
|
|
})
|
|
if (asyncTaskResponse) return asyncTaskResponse
|
|
|
|
throw new ApiError('INVALID_PARAMS')
|
|
})
|