"use server"; import { auth } from "@/auth"; import { db } from "@/lib/db"; import { hasPermission } from "@/lib/permissions"; import { z } from "zod"; import { revalidatePath } from "next/cache"; import { nextId } from "@/lib/id-generators"; type ActionResult = { ok: true } | { error: string }; const vesselSchema = z.object({ name: z.string().min(1, "Cost centre name is required"), code: z.string().optional(), }); export async function createVessel(formData: FormData): Promise { const session = await auth(); if (!session?.user || !hasPermission(session.user.role, "manage_vessels_accounts")) { return { error: "Unauthorized" }; } const parsed = vesselSchema.safeParse({ name: formData.get("name"), code: (formData.get("code") as string).trim() || undefined, }); if (!parsed.success) return { error: parsed.error.errors[0]?.message ?? "Validation failed" }; const existingCodes = await db.vessel.findMany({ select: { code: true } }); let code: string; if (parsed.data.code) { const conflict = await db.vessel.findUnique({ where: { code: parsed.data.code } }); if (conflict) return { error: `Code "${parsed.data.code}" is already in use by another vessel.` }; code = parsed.data.code; } else { code = nextId("SITE", existingCodes.map((v) => v.code)); } await db.vessel.create({ data: { name: parsed.data.name, code } }); revalidatePath("/admin/vessels"); return { ok: true }; } export async function updateVessel(formData: FormData): Promise { const session = await auth(); if (!session?.user || !hasPermission(session.user.role, "manage_vessels_accounts")) { return { error: "Unauthorized" }; } const id = formData.get("id") as string; if (!id) return { error: "Vessel ID is required" }; const parsed = vesselSchema.safeParse({ name: formData.get("name"), }); if (!parsed.success) return { error: parsed.error.errors[0]?.message ?? "Validation failed" }; await db.vessel.update({ where: { id }, data: { name: parsed.data.name } }); revalidatePath("/admin/vessels"); return { ok: true }; } export async function deleteVessel(id: string): Promise { const session = await auth(); if (!session?.user || !hasPermission(session.user.role, "manage_vessels_accounts")) return { error: "Unauthorized" }; const inUse = await db.purchaseOrder.findFirst({ where: { vesselId: id } }); if (inUse) return { error: "Cannot delete: this cost centre is referenced in purchase orders." }; await db.vessel.delete({ where: { id } }); revalidatePath("/admin/vessels"); return { ok: true }; } export async function toggleVesselActive(vesselId: string): Promise { const session = await auth(); if (!session?.user || !hasPermission(session.user.role, "manage_vessels_accounts")) { return { error: "Unauthorized" }; } const vessel = await db.vessel.findUnique({ where: { id: vesselId }, select: { isActive: true } }); if (!vessel) return { error: "Cost centre not found" }; await db.vessel.update({ where: { id: vesselId }, data: { isActive: !vessel.isActive } }); revalidatePath("/admin/vessels"); return { ok: true }; }