import Link from "next/link"; import { redirect } from "next/navigation"; import { UserRole } from "@prisma/client"; import { requireUser } from "@/lib/auth/requireUser"; import { db } from "@/lib/prisma"; function getText(value: unknown): string { if (!value) return ""; if (typeof value === "string") return value; if (typeof value === "object") { const record = value as Record; if (typeof record.en === "string") return record.en; if (typeof record.es === "string") return record.es; } return ""; } export default async function MyCoursesPage() { const user = await requireUser(); if (!user?.id) { redirect("/auth/login?redirectTo=/my-courses"); } const isTeacher = user.role === UserRole.TEACHER || user.role === UserRole.SUPER_ADMIN; if (isTeacher) { const courses = await db.course.findMany({ where: { authorId: user.id }, include: { modules: { include: { lessons: { select: { id: true, videoUrl: true, youtubeUrl: true, }, }, }, }, _count: { select: { enrollments: true, }, }, }, orderBy: { updatedAt: "desc" }, }); return (

My Courses

Your created courses

Review, edit, and publish the courses you are building for your students.

{courses.length === 0 ? (

No courses created yet

Create your first teacher course to get started.

Create course
) : (
{courses.map((course) => { const totalLessons = course.modules.reduce((acc, module) => acc + module.lessons.length, 0); const lessonsWithVideo = course.modules.reduce( (acc, module) => acc + module.lessons.filter((lesson) => lesson.videoUrl || lesson.youtubeUrl).length, 0, ); const title = getText(course.title) || "Untitled course"; return (

{title}

{course._count.enrollments} students | {course.modules.length} modules | {totalLessons} lessons

Upload coverage: {lessonsWithVideo}/{totalLessons || 0} lessons with video

Edit course Preview
); })}
)}
); } const enrollments = await db.enrollment.findMany({ where: { userId: user.id }, include: { course: { include: { modules: { include: { lessons: { select: { id: true }, }, }, }, }, }, }, orderBy: { purchasedAt: "desc" }, }); const courseIds = enrollments.map((enrollment) => enrollment.courseId); const completed = await db.userProgress.findMany({ where: { userId: user.id, isCompleted: true, lesson: { module: { courseId: { in: courseIds, }, }, }, }, select: { lesson: { select: { module: { select: { courseId: true }, }, }, }, }, }); const certificates = await db.certificate.findMany({ where: { userId: user.id, courseId: { in: courseIds, }, }, select: { id: true, courseId: true, }, }); const completedByCourse = new Map(); for (const item of completed) { const courseId = item.lesson.module.courseId; completedByCourse.set(courseId, (completedByCourse.get(courseId) ?? 0) + 1); } const certificateByCourse = new Map(certificates.map((certificate) => [certificate.courseId, certificate.id])); return (

My Courses

Your enrolled courses

Continue where you left off, check completion, and download certificates for finished courses.

{enrollments.length === 0 ? (

No courses enrolled yet

Browse the catalog and start your first learning path.

Browse courses
) : (
{enrollments.map((enrollment) => { const totalLessons = enrollment.course.modules.reduce((acc, module) => acc + module.lessons.length, 0); const completedLessons = completedByCourse.get(enrollment.course.id) ?? 0; const progressPercent = totalLessons > 0 ? Math.round((completedLessons / totalLessons) * 100) : 0; const courseTitle = getText(enrollment.course.title) || "Untitled course"; const certificateId = certificateByCourse.get(enrollment.course.id); return (

{courseTitle}

Progress: {completedLessons}/{totalLessons} lessons ({progressPercent}%)

{progressPercent >= 100 ? "Review" : "Continue"} {certificateId ? ( Download Certificate ) : null}
); })}
)}
); }