'use server'; import { revalidatePath } from 'next/cache'; import { requireStaff } from '@/lib/admin/guard'; import { logStaffActivity } from '@/lib/services/staff-activity'; import { prisma } from '@/lib/prisma'; /** Parse a FormData field into a positive BigInt id, or null when invalid. */ function parseId(raw: FormDataEntryValue | null): bigint | null { if (typeof raw !== 'string' || raw.trim() === '') return null; try { const id = BigInt(raw.trim()); return id > 0n ? id : null; } catch { return null; } } /** * Delete a radio shout from the DJ moderation page. Re-reads auth via * requireStaff, writes a staff-activity audit entry and revalidates the * moderation route. Fails soft if the row is already gone. */ export async function deleteShout(formData: FormData): Promise { const staff = await requireStaff(); const id = parseId(formData.get('id')); if (id === null) return; try { await prisma.radioShouts.delete({ where: { id } }); await logStaffActivity({ staffId: staff.id, action: 'radio.shout.delete', description: `Deleted radio shout #${id}`, targetType: 'radio_shout', targetId: Number(id), }); } catch { // Row may already be gone; ignore so the action does not throw. } revalidatePath('/admin/radio/moderation'); }