Files
veridian/server/api/topic/[topicId]/chat/cancel/[generationId].post.ts

76 lines
1.8 KiB
TypeScript

import { generations } from '~~/drizzle/schema';
import { db } from '~~/server/lib/db';
import { cancelPendingGeneration } from '~~/server/utils/generations';
export default defineEventHandler(async (event) => {
await protectRoute(event);
const { generationId } = event.context.params!;
const topicId = getRouterParam(event, 'topicId')!;
const topic = await db.query.topics.findFirst({
where: {
id: topicId,
userId: event.context.user!.id as string,
},
with: {
messages: true,
},
});
if (!topic) throw createError({ statusCode: 404, message: 'Topic not found' });
const success = cancelPendingGeneration(generationId!);
const generation = await db.query.generations.findFirst({
where: {
id: generationId,
},
});
if (!generation) {
throw createError({
statusCode: 404,
message: 'Generation not found',
});
}
if (generation.status === 'completed') {
throw createError({
statusCode: 400,
message: 'Generation already completed',
});
}
const message = await db.query.messages.findFirst({
where: {
generationId: generation.id,
},
});
if (!message) {
throw createError({
statusCode: 404,
message: 'Message not found',
});
}
await db.update(generations).set({ status: 'cancelled' });
await topicEvents.emit(topicId, {
type: 'generation-complete',
payload: {
messageId: message.id,
generationId,
}
})
if (!success) {
throw createError({
statusCode: 400,
message: 'Generation not found or already completed',
});
}
return 'ok';
});