Initial commit

This commit is contained in:
admin
2026-05-26 22:46:00 +02:00
commit 7e2c2ff89c
256 changed files with 51523 additions and 0 deletions
+64
View File
@@ -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");
}