Initial commit

This commit is contained in:
twotalesanimation
2026-05-19 22:20:29 +02:00
commit 0fbe856dce
173 changed files with 38316 additions and 0 deletions
+116
View File
@@ -0,0 +1,116 @@
"use server";
import { auth } from "@/auth";
import { db } from "@/lib/db";
import { revalidatePath } from "next/cache";
import { z } from "zod";
import { ShotStatus, ShotPriority } from "@prisma/client";
const createAssetSchema = z.object({
assetCode: z.string().min(1, "Asset code is required").max(30).regex(/^[A-Z0-9_\-]+$/i),
name: z.string().min(1, "Name is required").max(200),
description: z.string().optional(),
status: z.nativeEnum(ShotStatus).default("WAITING"),
priority: z.nativeEnum(ShotPriority).default("NORMAL"),
leadId: z.string().cuid().optional().or(z.literal("")),
dueDate: z.string().optional(),
projectId: z.string().cuid(),
});
export async function createAsset(data: z.infer<typeof createAssetSchema>) {
const session = await auth();
if (!session?.user) throw new Error("Unauthorized");
if (!["ADMIN", "PRODUCER", "SUPERVISOR"].includes(session.user.role)) {
throw new Error("Insufficient permissions");
}
const parsed = createAssetSchema.parse(data);
const asset = await db.asset.create({
data: {
assetCode: parsed.assetCode.toUpperCase(),
name: parsed.name,
description: parsed.description,
status: parsed.status,
priority: parsed.priority,
leadId: parsed.leadId || undefined,
dueDate: parsed.dueDate ? new Date(parsed.dueDate) : undefined,
projectId: parsed.projectId,
},
});
revalidatePath(`/projects/${parsed.projectId}`);
return { success: true, asset };
}
const updateAssetSchema = z.object({
name: z.string().min(1).max(200).optional(),
description: z.string().optional(),
status: z.nativeEnum(ShotStatus).optional(),
priority: z.nativeEnum(ShotPriority).optional(),
leadId: z.string().cuid().nullable().optional(),
dueDate: z.string().nullable().optional(),
});
export async function updateAsset(assetId: string, data: z.infer<typeof updateAssetSchema>) {
const session = await auth();
if (!session?.user) throw new Error("Unauthorized");
if (!["ADMIN", "PRODUCER", "SUPERVISOR"].includes(session.user.role)) {
throw new Error("Insufficient permissions");
}
const parsed = updateAssetSchema.parse(data);
const asset = await db.asset.findUnique({ where: { id: assetId } });
if (!asset) throw new Error("Asset not found");
const updated = await db.asset.update({
where: { id: assetId },
data: {
...(parsed.name !== undefined && { name: parsed.name }),
...(parsed.description !== undefined && { description: parsed.description }),
...(parsed.status !== undefined && { status: parsed.status }),
...(parsed.priority !== undefined && { priority: parsed.priority }),
...(parsed.leadId !== undefined && { leadId: parsed.leadId }),
...(parsed.dueDate !== undefined && {
dueDate: parsed.dueDate ? new Date(parsed.dueDate) : null,
}),
},
});
revalidatePath(`/projects/${asset.projectId}`);
return { success: true, asset: updated };
}
export async function deleteAsset(assetId: string) {
const session = await auth();
if (!session?.user) throw new Error("Unauthorized");
if (!["ADMIN", "PRODUCER", "SUPERVISOR"].includes(session.user.role)) {
throw new Error("Insufficient permissions");
}
const asset = await db.asset.findUnique({ where: { id: assetId } });
if (!asset) throw new Error("Asset not found");
await db.asset.delete({ where: { id: assetId } });
revalidatePath(`/projects/${asset.projectId}`);
return { success: true };
}
export async function getProjectAssets(projectId: string) {
const session = await auth();
if (!session?.user) throw new Error("Unauthorized");
return db.asset.findMany({
where: { projectId },
orderBy: { assetCode: "asc" },
include: {
lead: { select: { id: true, name: true, email: true, image: true } },
_count: { select: { tasks: true } },
tasks: {
orderBy: { sortOrder: "asc" },
select: { id: true, status: true, title: true, type: true },
},
},
});
}