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); } });