diff --git a/php/validator/article-validator.php b/php/validator/article-validator.php index 669a156..f1fb48a 100644 --- a/php/validator/article-validator.php +++ b/php/validator/article-validator.php @@ -33,19 +33,73 @@ function articleTitleValidator($title) } /** - * Prüft, ob der übergebene Content ein formal valider JSON-String ist. - * @param mixed $content Der zu prüfende Inhalt + * Prüft, ob der Content valides JSON ist UND ob alle enthaltenen Blöcke + * die inhaltlichen Kriterien erfüllen: + * Textblöcke sind nicht leer + * Bilder sind in Bildblöcken vorhanden + * + * @param mixed $content Der zu prüfende JSON-String * @return bool */ function articleContentValidator($content) { + // 1. Grundlegende Typprüfung if (!is_string($content)) { return false; } - // Prüft direkt, ob der String valides JSON enthält - json_decode($content); - return json_last_error() === JSON_ERROR_NONE; + // 2. Formale JSON-Prüfung (Kompatibel mit PHP 8.2) + $blocks = json_decode($content, true); + if (json_last_error() !== JSON_ERROR_NONE) { + return false; + } + + // 3. Inhaltliche Validierung der einzelnen Blöcke + // Falls das JSON zwar valide, aber kein Array ist (z.B. nur ein String/Zahl) + if (!is_array($blocks)) { + return false; + } + + // Mindestens ein Block sollte vorhanden sein (optional, verhindert leere Beiträge) + if (empty($blocks)) { + return false; + } + + foreach ($blocks as $block) { + // Jeder Block muss die Keys 'type' und 'value' besitzen + if (!isset($block['type']) || !isset($block['value'])) { + return false; + } + + $type = $block['type']; + $value = $block['value']; + + if ($type === 'text') { + // Validierung für Text: Darf nach dem Trimmen nicht leer sein + if (trim($value) === '') { + return false; + } + } elseif ($type === 'image') { + // Validierung für Bild: Muss entweder mit uploads/ starten (Bestand) + // oder mit data:image/ beginnen (neues Base64-Bild aus dem Editor) + if (!is_string($value)) { + return false; + } + + $isValidPath = str_starts_with($value, 'uploads/'); + $isValidBase64 = str_starts_with($value, 'data:image/'); + + if (!$isValidPath && !$isValidBase64) { + return false; + } + } else { + // Unbekannter Blocktyp wird zur Sicherheit abgewiesen + return false; + } + } + + // Wenn alle Prüfungen bestanden wurden + return true; } /**