69 lines
1.7 KiB
TypeScript
69 lines
1.7 KiB
TypeScript
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;
|
|
}
|