web/contentpanel - refactor Aushang-Upload to store PNGs only
This commit is contained in:
@@ -1,133 +1,49 @@
|
||||
<?php
|
||||
|
||||
// Prüft, ob ein Basisname dem von der Anwendung erzeugten Format entspricht.
|
||||
const NEWS_PNG_DIRECTORY = __DIR__ . '/news/png';
|
||||
|
||||
function isValidNewsFileBase(string $fileBase): bool
|
||||
{
|
||||
return preg_match(
|
||||
'/^\d{4}-\d{2}-\d{2}-[A-Za-z0-9_-]+$/D',
|
||||
$fileBase
|
||||
) === 1;
|
||||
return preg_match('/^\d{4}-\d{2}-\d{2}-[A-Za-z0-9_-]+$/D', $fileBase) === 1;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Löscht eine News vollständig:
|
||||
*
|
||||
* - Original-PDF
|
||||
* - alle daraus erzeugten PNG-Seiten
|
||||
*/
|
||||
function deleteNewsFiles(string $fileBase): bool
|
||||
{
|
||||
if (!isValidNewsFileBase($fileBase)) {
|
||||
error_log('Ungültiger News-Dateiname beim Löschen: ' . $fileBase);
|
||||
return false;
|
||||
}
|
||||
|
||||
$newsDirectory = __DIR__ . '/news';
|
||||
$pngDirectory = $newsDirectory . '/png';
|
||||
|
||||
$success = true;
|
||||
|
||||
// Alle erzeugten PNG-Seiten löschen
|
||||
$pngFiles = glob(
|
||||
$pngDirectory . '/' . $fileBase . '_page_*.png'
|
||||
) ?: [];
|
||||
|
||||
foreach ($pngFiles as $pngFile) {
|
||||
if (is_file($pngFile) && !unlink($pngFile)) {
|
||||
error_log('News-PNG konnte nicht gelöscht werden: ' . $pngFile);
|
||||
foreach (glob(NEWS_PNG_DIRECTORY . '/' . $fileBase . '_page_*.png') ?: [] as $file) {
|
||||
if (!unlink($file)) {
|
||||
$success = false;
|
||||
}
|
||||
}
|
||||
|
||||
// Original-PDF löschen
|
||||
$pdfFile = $newsDirectory . '/' . $fileBase . '.pdf';
|
||||
|
||||
if (is_file($pdfFile) && !unlink($pdfFile)) {
|
||||
error_log('News-PDF konnte nicht gelöscht werden: ' . $pdfFile);
|
||||
$success = false;
|
||||
}
|
||||
|
||||
return $success;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Löscht alle abgelaufenen News.
|
||||
*
|
||||
* Wichtig:
|
||||
* Es werden sowohl vorhandene PDFs als auch page_1-PNGs betrachtet.
|
||||
* Dadurch werden auch verwaiste PDFs ohne PNG zuverlässig gefunden.
|
||||
*/
|
||||
function cleanupExpiredNews(): void
|
||||
{
|
||||
$newsDirectory = __DIR__ . '/news';
|
||||
$pngDirectory = $newsDirectory . '/png';
|
||||
$today = new DateTimeImmutable('today');
|
||||
|
||||
$fileBases = [];
|
||||
foreach (glob(NEWS_PNG_DIRECTORY . '/*_page_1.png') ?: [] as $file) {
|
||||
$fileBase = basename($file, '_page_1.png');
|
||||
|
||||
// PDFs erfassen
|
||||
foreach (glob($newsDirectory . '/*.pdf') ?: [] as $pdfFile) {
|
||||
$fileBase = pathinfo($pdfFile, PATHINFO_FILENAME);
|
||||
|
||||
if (isValidNewsFileBase($fileBase)) {
|
||||
$fileBases[$fileBase] = true;
|
||||
}
|
||||
}
|
||||
|
||||
// Zusätzlich PNGs erfassen.
|
||||
// Damit funktioniert die Bereinigung auch, falls die PDF bereits fehlt.
|
||||
foreach (glob($pngDirectory . '/*_page_1.png') ?: [] as $pngFile) {
|
||||
$fileName = basename($pngFile);
|
||||
$suffix = '_page_1.png';
|
||||
|
||||
if (!str_ends_with($fileName, $suffix)) {
|
||||
if (!isValidNewsFileBase($fileBase)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
$fileBase = substr($fileName, 0, -strlen($suffix));
|
||||
$dateString = substr($fileBase, 0, 10);
|
||||
$expiryDate = DateTimeImmutable::createFromFormat('!Y-m-d', $dateString);
|
||||
|
||||
if (isValidNewsFileBase($fileBase)) {
|
||||
$fileBases[$fileBase] = true;
|
||||
}
|
||||
}
|
||||
|
||||
$now = new DateTimeImmutable();
|
||||
|
||||
foreach (array_keys($fileBases) as $fileBase) {
|
||||
// YYYY-MM-DD aus dem Dateinamen holen
|
||||
$expiryDateString = substr($fileBase, 0, 10);
|
||||
|
||||
$expiryDate = DateTimeImmutable::createFromFormat(
|
||||
'!Y-m-d',
|
||||
$expiryDateString
|
||||
);
|
||||
|
||||
// Zusätzlich prüfen, ob wirklich ein gültiges Datum entstanden ist
|
||||
if (
|
||||
$expiryDate === false ||
|
||||
$expiryDate->format('Y-m-d') !== $expiryDateString
|
||||
$expiryDate !== false &&
|
||||
$expiryDate->format('Y-m-d') === $dateString &&
|
||||
$today > $expiryDate
|
||||
) {
|
||||
error_log(
|
||||
'Ungültiges Ablaufdatum bei News-Datei: ' . $fileBase
|
||||
);
|
||||
continue;
|
||||
}
|
||||
|
||||
/*
|
||||
* Aushang bleibt den gesamten angegebenen Tag sichtbar.
|
||||
* Beispiel Ablaufdatum 2026-09-05:
|
||||
* Löschung ab 2026-09-06 00:00 Uhr.
|
||||
*/
|
||||
$deleteFrom = $expiryDate->modify('+1 day');
|
||||
|
||||
if ($now >= $deleteFrom) {
|
||||
if (!deleteNewsFiles($fileBase)) {
|
||||
error_log(
|
||||
'Abgelaufene News konnte nicht vollständig gelöscht werden: '
|
||||
. $fileBase
|
||||
);
|
||||
}
|
||||
deleteNewsFiles($fileBase);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user