// app/api/videos/[id]/route.ts import { NextResponse } from "next/server"; import { prisma } from "../../../../lib/prisma"; import { getServerSession } from "next-auth"; import { authOptions } from "../../../../lib/auth-options"; import { getVideoUrls } from "../../../../lib/video-urls"; export async function GET(req: Request, context: any) { try { // unwrap params let params = context?.params; if (typeof params?.then === "function") params = await params; const id = params?.id; if (!id) return NextResponse.json({ error: "Missing video id" }, { status: 400 }); const session = await getServerSession(authOptions); if (!session?.user?.email) { return NextResponse.json({ error: "Unauthorized" }, { status: 401 }); } const user = await prisma.user.findUnique({ where: { email: session.user.email }, include: { enrollments: true, }, }); if (!user) { return NextResponse.json({ error: "Unauthorized" }, { status: 401 }); } const video = await prisma.video.findUnique({ where: { id }, include: { playlist: { include: { course: true, courses: true, }, }, uploader: { select: { id: true, name: true, image: true, }, }, videoCourses: true, }, }); if (!video) return NextResponse.json({ error: "Not found" }, { status: 404 }); const userCourseIds = user.enrollments.map((enrollment) => enrollment.courseId); const playlistCourseIds = new Set([video.playlist.courseId]); (video.playlist.courses || []).forEach((mapping) => { playlistCourseIds.add(mapping.courseId); }); const hasPlaylistAccess = [...playlistCourseIds].some((courseId) => userCourseIds.includes(courseId) ); if (!hasPlaylistAccess) { return NextResponse.json({ error: "Forbidden" }, { status: 403 }); } const restrictedCourseIds = (video.videoCourses || []) .filter((assignment) => assignment.exclusive) .map((assignment) => assignment.courseId); if ( restrictedCourseIds.length > 0 && !restrictedCourseIds.some((courseId) => userCourseIds.includes(courseId)) ) { return NextResponse.json({ error: "Forbidden" }, { status: 403 }); } // Find the next video (index = current.index + 1) const next = await prisma.video.findFirst({ where: { playlistId: video.playlistId, index: video.index + 1, }, include: { uploader: { select: { id: true, name: true, image: true, }, }, }, }); // Add video URLs with HLS support const videoUrls = getVideoUrls(video.id, video.url, video.transcodingStatus as any); const responseVideo = { ...video, videoUrls, transcodingStatus: video.transcodingStatus, restrictedCourseIds, }; // Ensure we return the URL field explicitly (player expects `video.url`). return NextResponse.json({ video: responseVideo, next }); } catch (err: any) { console.error("GET /api/videos/[id] error:", err); return NextResponse.json({ error: "Server error" }, { status: 500 }); } }