42 lines
1.6 KiB
TypeScript
42 lines
1.6 KiB
TypeScript
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 };
|
|
});
|