"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"; type ActionResult = { ok: true } | { error: string }; const vesselSchema = z.object({ name: z.string().min(1, "Vessel name is required"), imoNumber: 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"), imoNumber: formData.get("imoNumber") || undefined, }); if (!parsed.success) return { error: parsed.error.errors[0]?.message ?? "Validation failed" }; const data = parsed.data; if (data.imoNumber) { const exists = await db.vessel.findUnique({ where: { imoNumber: data.imoNumber } }); if (exists) return { error: "A vessel with that IMO number already exists" }; } await db.vessel.create({ data: { name: data.name, imoNumber: data.imoNumber ?? null } }); 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"), imoNumber: formData.get("imoNumber") || undefined, }); if (!parsed.success) return { error: parsed.error.errors[0]?.message ?? "Validation failed" }; const data = parsed.data; if (data.imoNumber) { const conflict = await db.vessel.findFirst({ where: { imoNumber: data.imoNumber, id: { not: id } } }); if (conflict) return { error: "Another vessel already has that IMO number" }; } await db.vessel.update({ where: { id }, data: { name: data.name, imoNumber: data.imoNumber ?? null } }); 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: vessel is referenced in purchase orders. Remove those POs first." }; 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: "Vessel not found" }; await db.vessel.update({ where: { id: vesselId }, data: { isActive: !vessel.isActive } }); revalidatePath("/admin/vessels"); return { ok: true }; }