Initial commit: FL-Akademie LMS mit Docker, Admin, Portal und Dokumentation.

Made-with: Cursor
This commit is contained in:
lo
2026-04-13 23:17:07 +02:00
commit d3367f0046
66 changed files with 3641 additions and 0 deletions

68
lib/course-queries.ts Normal file
View File

@@ -0,0 +1,68 @@
import { prisma } from "@/lib/prisma";
export async function listPublishedCourses() {
return prisma.course.findMany({
where: { published: true },
orderBy: { updatedAt: "desc" },
include: {
categories: { include: { category: true } },
modules: {
orderBy: { sortOrder: "asc" },
include: {
lessons: {
where: { published: true },
orderBy: { sortOrder: "asc" },
select: { slug: true },
},
},
},
},
});
}
export async function getCourseBySlug(slug: string) {
return prisma.course.findFirst({
where: { slug, published: true },
include: {
categories: { include: { category: true } },
modules: {
orderBy: { sortOrder: "asc" },
include: {
lessons: { where: { published: true }, orderBy: { sortOrder: "asc" } },
},
},
},
});
}
export async function getLessonContext(courseSlug: string, lessonSlug: string) {
const course = await prisma.course.findFirst({
where: { slug: courseSlug, published: true },
include: {
modules: {
orderBy: { sortOrder: "asc" },
include: {
lessons: { where: { published: true }, orderBy: { sortOrder: "asc" } },
},
},
},
});
if (!course) return null;
for (const mod of course.modules) {
const lesson = mod.lessons.find((l) => l.slug === lessonSlug);
if (lesson) return { course, module: mod, lesson };
}
return null;
}
export function firstLessonPath(course: {
slug: string;
modules: { lessons: { slug: string }[] }[];
}): string | null {
for (const m of course.modules) {
const first = m.lessons[0];
if (first) return `/kurse/${course.slug}/lektionen/${first.slug}`;
}
return null;
}