Initial commit
This commit is contained in:
@@ -0,0 +1,64 @@
|
||||
"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<void> => !!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");
|
||||
}
|
||||
Reference in New Issue
Block a user