diff --git a/app/scan/page.tsx b/app/scan/page.tsx index cd15bf8..6139a70 100755 --- a/app/scan/page.tsx +++ b/app/scan/page.tsx @@ -15,6 +15,7 @@ export default function ScanPage() { const [result, setResult] = useState<{ coursesCreated: number coursesUpdated: number + coursesDeleted: number modulesCreated: number modulesUpdated: number lessonsCreated: number @@ -53,7 +54,9 @@ export default function ScanPage() { setResult(data) addLog(`Scan completed in ${data.duration}ms`) - addLog(`Courses: ${data.coursesCreated} created, ${data.coursesUpdated} updated`) + addLog( + `Courses: ${data.coursesCreated} created, ${data.coursesUpdated} updated, ${data.coursesDeleted} deleted` + ) addLog(`Modules: ${data.modulesCreated} created, ${data.modulesUpdated} updated`) addLog(`Lessons: ${data.lessonsCreated} created, ${data.lessonsUpdated} updated`) diff --git a/lib/scanner.ts b/lib/scanner.ts index d54d597..817d0ce 100755 --- a/lib/scanner.ts +++ b/lib/scanner.ts @@ -135,6 +135,7 @@ async function downloadCourseThumbnail(courseName: string, courseSlug: string): interface ScanResult { coursesCreated: number coursesUpdated: number + coursesDeleted: number modulesCreated: number modulesUpdated: number lessonsCreated: number @@ -249,6 +250,7 @@ interface ScanOptions { interface ScanResult { coursesCreated: number coursesUpdated: number + coursesDeleted: number modulesCreated: number modulesUpdated: number lessonsCreated: number @@ -314,6 +316,7 @@ async function scanCourses(options: ScanOptions = {}): Promise { const result: ScanResult = { coursesCreated: 0, coursesUpdated: 0, + coursesDeleted: 0, modulesCreated: 0, modulesUpdated: 0, lessonsCreated: 0, @@ -446,6 +449,16 @@ async function scanCourses(options: ScanOptions = {}): Promise { } } + const foundSlugs = new Set(courses.map((c) => slugify(c.name))) + const staleCourses = existingCourses.filter((c) => !c.hidden && !foundSlugs.has(c.slug)) + if (staleCourses.length > 0) { + const staleIds = staleCourses.map((c) => c.id) + await prisma.course.deleteMany({ + where: { id: { in: staleIds } }, + }) + result.coursesDeleted = staleCourses.length + } + } catch (error) { result.errors.push('Failed to scan courses root: ' + error) }