50 lines
1.7 KiB
TypeScript
50 lines
1.7 KiB
TypeScript
import { db } from "../db/index";
|
|
import { courses, topics, lessons } from "../db/schema";
|
|
import { eq } from "drizzle-orm";
|
|
import { generateCourseInBackground } from "../utils/generateCourse";
|
|
|
|
export default defineNitroPlugin(async () => {
|
|
console.log("[revisione] resumeGeneration plugin started");
|
|
|
|
// reset any stuck generating states from a previous run
|
|
try {
|
|
const stuckTopics = await db
|
|
.update(topics)
|
|
.set({ status: "pending" })
|
|
.where(eq(topics.status, "generating"))
|
|
.returning({ id: topics.id });
|
|
|
|
const stuckLessons = await db
|
|
.update(lessons)
|
|
.set({ branchStatus: "pending" })
|
|
.where(eq(lessons.branchStatus, "generating"))
|
|
.returning({ id: lessons.id });
|
|
|
|
if (stuckTopics.length > 0 || stuckLessons.length > 0) {
|
|
console.log(`[revisione] reset ${stuckTopics.length} stuck topic(s) and ${stuckLessons.length} stuck lesson(s) to pending`);
|
|
}
|
|
} catch (err: any) {
|
|
console.error("[revisione] failed to reset stuck states:", err?.message ?? err);
|
|
}
|
|
|
|
try {
|
|
const stuck = await db.query.courses.findMany({
|
|
where: eq(courses.status, "processing"),
|
|
});
|
|
|
|
console.log(`[revisione] query complete — found ${stuck.length} course(s)`);
|
|
|
|
if (stuck.length === 0) return;
|
|
|
|
console.log(`[revisione] found ${stuck.length} course(s) stuck in processing — resuming`);
|
|
|
|
for (const course of stuck) {
|
|
console.log(`[revisione] resuming "${course.title}" (${course.id.slice(0, 8)})`);
|
|
generateCourseInBackground(course.id).catch((err) => {
|
|
console.error(`[revisione] background generation threw:`, err?.message ?? err);
|
|
});
|
|
}
|
|
} catch (err: any) {
|
|
console.error("[revisione] resumeGeneration plugin error:", err?.message ?? err);
|
|
}
|
|
});
|