3 namespace BookStack\Exports\ZipExports;
5 use BookStack\Exports\ZipExports\Models\ZipExportModel;
6 use Illuminate\Validation\Factory;
8 class ZipValidationHelper
10 protected Factory $validationFactory;
13 * Local store of validated IDs (in format "<type>:<id>". Example: "book:2")
14 * which we can use to check uniqueness.
15 * @var array<string, bool>
17 protected array $validatedIds = [];
19 public function __construct(
20 public ZipExportReader $zipReader,
22 $this->validationFactory = app(Factory::class);
25 public function validateData(array $data, array $rules): array
27 $messages = $this->validationFactory->make($data, $rules)->errors()->messages();
29 foreach ($messages as $key => $message) {
30 $messages[$key] = implode("\n", $message);
36 public function fileReferenceRule(array $acceptedMimes = []): ZipFileReferenceRule
38 return new ZipFileReferenceRule($this, $acceptedMimes);
41 public function uniqueIdRule(string $type): ZipUniqueIdRule
43 return new ZipUniqueIdRule($this, $type);
46 public function hasIdBeenUsed(string $type, mixed $id): bool
48 $key = $type . ':' . $id;
49 if (isset($this->validatedIds[$key])) {
53 $this->validatedIds[$key] = true;
59 * Validate an array of relation data arrays that are expected
60 * to be for the given ZipExportModel.
61 * @param class-string<ZipExportModel> $model
63 public function validateRelations(array $relations, string $model): array
67 foreach ($relations as $key => $relationData) {
68 if (is_array($relationData)) {
69 $results[$key] = $model::validate($this, $relationData);
71 $results[$key] = [trans('validation.zip_model_expected', ['type' => gettype($relationData)])];