BookStack/app/Exports/ZipExports/ZipExportValidator.php

71 lines
2.2 KiB
PHP
Raw Normal View History

2024-10-30 21:13:41 +08:00
<?php
namespace BookStack\Exports\ZipExports;
use BookStack\Exports\ZipExports\Models\ZipExportBook;
use BookStack\Exports\ZipExports\Models\ZipExportChapter;
use BookStack\Exports\ZipExports\Models\ZipExportPage;
2024-10-30 21:13:41 +08:00
use ZipArchive;
class ZipExportValidator
{
public function __construct(
protected string $zipPath,
) {
}
public function validate(): array
2024-10-30 21:13:41 +08:00
{
// Validate file exists
if (!file_exists($this->zipPath) || !is_readable($this->zipPath)) {
return ['format' => "Could not read ZIP file"];
2024-10-30 21:13:41 +08:00
}
// Validate file is valid zip
$zip = new \ZipArchive();
$opened = $zip->open($this->zipPath, ZipArchive::RDONLY);
if ($opened !== true) {
return ['format' => "Could not read ZIP file"];
2024-10-30 21:13:41 +08:00
}
// Validate json data exists, including metadata
$jsonData = $zip->getFromName('data.json') ?: '';
$importData = json_decode($jsonData, true);
if (!$importData) {
return ['format' => "Could not find and decode ZIP data.json content"];
2024-10-30 21:13:41 +08:00
}
$helper = new ZipValidationHelper($zip);
2024-10-30 21:13:41 +08:00
if (isset($importData['book'])) {
$modelErrors = ZipExportBook::validate($helper, $importData['book']);
$keyPrefix = 'book';
2024-10-30 21:13:41 +08:00
} else if (isset($importData['chapter'])) {
$modelErrors = ZipExportChapter::validate($helper, $importData['chapter']);
$keyPrefix = 'chapter';
2024-10-30 21:13:41 +08:00
} else if (isset($importData['page'])) {
$modelErrors = ZipExportPage::validate($helper, $importData['page']);
$keyPrefix = 'page';
2024-10-30 21:13:41 +08:00
} else {
return ['format' => "ZIP file has no book, chapter or page data"];
2024-10-30 21:13:41 +08:00
}
return $this->flattenModelErrors($modelErrors, $keyPrefix);
2024-10-30 21:13:41 +08:00
}
protected function flattenModelErrors(array $errors, string $keyPrefix): array
2024-10-30 21:13:41 +08:00
{
$flattened = [];
foreach ($errors as $key => $error) {
if (is_array($error)) {
$flattened = array_merge($flattened, $this->flattenModelErrors($error, $keyPrefix . '.' . $key));
} else {
$flattened[$keyPrefix . '.' . $key] = $error;
}
}
return $flattened;
2024-10-30 21:13:41 +08:00
}
}