import { db } from "../../../db/index"; import { courses, uploads, topics, lessons, quizQuestions, userProgress } from "../../../db/schema"; import { eq } from "drizzle-orm"; import { verifyLicenseKey } from "../../../utils/license"; import { rm } from "fs/promises"; import { resolve } from "path"; export default defineEventHandler(async (event) => { const key = getHeader(event, "x-license-key") ?? ""; if (!verifyLicenseKey(key)) { throw createError({ statusCode: 401, message: "Invalid or expired license key" }); } const id = getRouterParam(event, "id")!; const course = await db.query.courses.findFirst({ where: eq(courses.id, id) }); if (!course) throw createError({ statusCode: 404, message: "Course not found" }); // delete child records in order const courseTopics = await db.query.topics.findMany({ where: eq(topics.courseId, id) }); for (const topic of courseTopics) { await db.delete(lessons).where(eq(lessons.topicId, topic.id)); await db.delete(quizQuestions).where(eq(quizQuestions.topicId, topic.id)); await db.delete(userProgress).where(eq(userProgress.topicId, topic.id)); } await db.delete(topics).where(eq(topics.courseId, id)); await db.delete(uploads).where(eq(uploads.courseId, id)); await db.delete(userProgress).where(eq(userProgress.courseId, id)); await db.delete(courses).where(eq(courses.id, id)); // clean up uploaded files on disk try { const uploadDir = resolve(process.cwd(), "uploads", id); await rm(uploadDir, { recursive: true, force: true }); } catch { // non-fatal } return { ok: true }; });