Revisione/server/api/courses/[id]/index.delete.ts

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