Files
vfxreview/app/(dashboard)/tasks/[taskId]/page.tsx
T
twotalesanimation 0fbe856dce Initial commit
2026-05-19 22:20:29 +02:00

84 lines
2.7 KiB
TypeScript

import { notFound, redirect } from "next/navigation";
import Link from "next/link";
import { db } from "@/lib/db";
import { auth } from "@/auth";
import { TaskDetailClient } from "./TaskDetailClient";
export async function generateMetadata({ params }: { params: Promise<{ taskId: string }> }) {
const { taskId } = await params;
const task = await db.task.findUnique({ where: { id: taskId }, select: { title: true } });
return { title: task?.title ?? "Task" };
}
async function getTask(taskId: string) {
return db.task.findUnique({
where: { id: taskId },
include: {
shot: { select: { id: true, shotCode: true, projectId: true } },
asset: { select: { id: true, assetCode: true, name: true, projectId: true } },
assignedArtist: { select: { id: true, name: true, email: true, image: true, role: true } },
createdBy: { select: { id: true, name: true, email: true } },
project: { select: { id: true, name: true, code: true } },
versions: {
orderBy: { versionNumber: "desc" },
include: {
artist: { select: { id: true, name: true, image: true, email: true } },
_count: { select: { comments: true } },
approvals: {
orderBy: { createdAt: "desc" },
take: 1,
include: { user: { select: { id: true, name: true, role: true } } },
},
comments: {
orderBy: { createdAt: "asc" },
include: {
author: { select: { id: true, name: true, email: true, image: true, role: true } },
replies: {
orderBy: { createdAt: "asc" },
include: {
author: { select: { id: true, name: true, email: true, image: true, role: true } },
},
},
},
},
},
},
},
});
}
async function getProjectArtists(projectId: string) {
return db.user.findMany({
where: {
isActive: true,
},
select: { id: true, name: true, email: true, image: true, role: true },
orderBy: { name: "asc" },
});
}
export default async function TaskPage({ params }: { params: Promise<{ taskId: string }> }) {
const { taskId } = await params;
const session = await auth();
if (!session?.user) redirect("/login");
const task = await getTask(taskId);
if (!task) notFound();
const artists = await getProjectArtists(task.projectId);
const canManage = ["ADMIN", "PRODUCER", "SUPERVISOR"].includes(session.user.role);
const isAssigned = task.assignedArtistId === session.user.id;
const canUpload = canManage || isAssigned;
return (
<TaskDetailClient
task={task as any}
artists={artists}
currentUserId={session.user.id}
canManage={canManage}
canUpload={canUpload}
/>
);
}