3 namespace BookStack\Exports\ZipExports\Models;
5 use BookStack\Entities\Models\Chapter;
6 use BookStack\Entities\Models\Page;
7 use BookStack\Exports\ZipExports\ZipExportFiles;
8 use BookStack\Exports\ZipExports\ZipValidationHelper;
10 class ZipExportChapter extends ZipExportModel
12 public ?int $id = null;
14 public ?string $description_html = null;
15 public ?int $priority = null;
16 /** @var ZipExportPage[] */
17 public array $pages = [];
18 /** @var ZipExportTag[] */
19 public array $tags = [];
21 public function metadataOnly(): void
23 $this->description_html = null;
25 foreach ($this->pages as $page) {
26 $page->metadataOnly();
28 foreach ($this->tags as $tag) {
33 public function children(): array
38 public static function fromModel(Chapter $model, ZipExportFiles $files): self
40 $instance = new self();
41 $instance->id = $model->id;
42 $instance->name = $model->name;
43 $instance->description_html = $model->descriptionHtml();
44 $instance->priority = $model->priority;
45 $instance->tags = ZipExportTag::fromModelArray($model->tags()->get()->all());
47 $pages = $model->getVisiblePages()->filter(fn (Page $page) => !$page->draft)->all();
48 $instance->pages = ZipExportPage::fromModelArray($pages, $files);
54 * @param Chapter[] $chapterArray
57 public static function fromModelArray(array $chapterArray, ZipExportFiles $files): array
59 return array_values(array_map(function (Chapter $chapter) use ($files) {
60 return self::fromModel($chapter, $files);
64 public static function validate(ZipValidationHelper $context, array $data): array
67 'id' => ['nullable', 'int', $context->uniqueIdRule('chapter')],
68 'name' => ['required', 'string', 'min:1'],
69 'description_html' => ['nullable', 'string'],
70 'priority' => ['nullable', 'int'],
75 $errors = $context->validateData($data, $rules);
76 $errors['tags'] = $context->validateRelations($data['tags'] ?? [], ZipExportTag::class);
77 $errors['pages'] = $context->validateRelations($data['pages'] ?? [], ZipExportPage::class);
82 public static function fromArray(array $data): self
86 $model->id = $data['id'] ?? null;
87 $model->name = $data['name'];
88 $model->description_html = $data['description_html'] ?? null;
89 $model->priority = isset($data['priority']) ? intval($data['priority']) : null;
90 $model->tags = ZipExportTag::fromManyArray($data['tags'] ?? []);
91 $model->pages = ZipExportPage::fromManyArray($data['pages'] ?? []);