import { eq } from 'drizzle-orm'; import { db } from '../config/database.js'; import { managedAssets } from '../db/schema.js'; /** * Fuehrt Buch darueber, welche Dateien das CMS selbst angelegt hat. * Nur diese darf es spaeter wieder loeschen. */ // Altbestand: vor der Umstellung auf sprechende Namen hiessen Uploads // -<6 zeichen>.. Diese Dateien stehen nicht in der // Tabelle, sollen aber weiterhin aufgeraeumt werden koennen. Handgepflegte // Assets wie event_karaoke.jpg oder Gallery1.webp passen nicht auf das Muster. const LEGACY_NAME = /^[a-z0-9]{6,14}-[a-z0-9]{6}\.[a-z0-9]{2,5}$/i; function basename(urlPath: string): string { return urlPath.split('/').pop() || ''; } /** Merkt sich eine neu angelegte Datei. */ export async function registerManagedAsset(urlPath: string): Promise { await db.insert(managedAssets).values({ path: urlPath }).onConflictDoNothing(); } /** Vergisst eine Datei wieder (nach dem Loeschen). */ export async function forgetManagedAsset(urlPath: string): Promise { await db.delete(managedAssets).where(eq(managedAssets.path, urlPath)); } /** Darf das CMS diese Datei loeschen? */ export async function isManagedAsset(urlPath: string): Promise { if (!urlPath) return false; const [row] = await db .select() .from(managedAssets) .where(eq(managedAssets.path, urlPath)) .limit(1); if (row) return true; return LEGACY_NAME.test(basename(urlPath)); } /** Alle vom CMS angelegten Pfade aus der Tabelle. */ export async function listManagedAssets(): Promise { const rows = (await db.select().from(managedAssets)) as any[]; return rows.map((row) => row.path as string); } /** Trifft der Altbestands-Namensstil zu? */ export function hasLegacyName(urlPath: string): boolean { return LEGACY_NAME.test(basename(urlPath)); }