76 lines
1.8 KiB
TypeScript
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';
|
|
});
|