"use server"; import { revalidatePath } from "next/cache"; import path from "node:path"; import fs from "node:fs/promises"; import { rawDb } from "@/lib/db/client"; import { getAppSetting } from "@/lib/db/appSettings"; import { safeJoin } from "@/lib/safePath"; const LIBRARY_ROOT = path.join(process.cwd(), "library"); const THUMB_ROOT = path.join(process.cwd(), "data", "thumbs"); export async function restoreImages(ids: number[]): Promise<{ restored: number }> { if (ids.length === 0) return { restored: 0 }; const placeholders = ids.map(() => "?").join(","); const r = rawDb.prepare( `UPDATE images SET deleted_at = NULL WHERE id IN (${placeholders}) AND deleted_at IS NOT NULL`, ).run(...ids); revalidate(); return { restored: r.changes }; } export async function purgeFromTrash(ids: number[]): Promise<{ purged: number }> { if (ids.length === 0) return { purged: 0 }; const placeholders = ids.map(() => "?").join(","); const rows = rawDb.prepare( ` WITH targets AS ( SELECT id FROM images WHERE deleted_at IS NOT NULL AND id IN (${placeholders}) ) SELECT id, rel_path, thumb_path FROM images WHERE id IN (SELECT id FROM targets) OR parent_image_id IN (SELECT id FROM targets) `, ).all(...ids) as Array<{ id: number; rel_path: string; thumb_path: string }>; if (rows.length === 0) return { purged: 0 }; if (getAppSetting("purgeFilesOnDelete")) { await Promise.all(rows.flatMap((r) => { const fileAbs = safeJoin(LIBRARY_ROOT, r.rel_path); const thumbAbs = safeJoin(THUMB_ROOT, r.thumb_path); return [ fileAbs ? fs.rm(fileAbs, { force: true }) : null, thumbAbs ? fs.rm(thumbAbs, { force: true }) : null, ].filter((p): p is Promise => !!p); })); } rawDb.prepare(`DELETE FROM images WHERE id IN (${rows.map(() => "?").join(",")})`).run(...rows.map((r) => r.id)); revalidate(); return { purged: rows.length }; } export async function emptyTrash(): Promise<{ purged: number }> { const ids = (rawDb.prepare(`SELECT id FROM images WHERE deleted_at IS NOT NULL`).all() as Array<{ id: number }>).map((r) => r.id); return purgeFromTrash(ids); } function revalidate() { revalidatePath("/"); revalidatePath("/collection"); revalidatePath("/tag"); revalidatePath("/actress"); revalidatePath("/studios"); revalidatePath("/series"); revalidatePath("/genres"); }