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 = $this->priority = null;
25 foreach ($this->pages as $page) {
26 $page->metadataOnly();
28 foreach ($this->tags as $tag) {
33 public static function fromModel(Chapter $model, ZipExportFiles $files): self
35 $instance = new self();
36 $instance->id = $model->id;
37 $instance->name = $model->name;
38 $instance->description_html = $model->descriptionHtml();
39 $instance->priority = $model->priority;
40 $instance->tags = ZipExportTag::fromModelArray($model->tags()->get()->all());
42 $pages = $model->getVisiblePages()->filter(fn (Page $page) => !$page->draft)->all();
43 $instance->pages = ZipExportPage::fromModelArray($pages, $files);
49 * @param Chapter[] $chapterArray
52 public static function fromModelArray(array $chapterArray, ZipExportFiles $files): array
54 return array_values(array_map(function (Chapter $chapter) use ($files) {
55 return self::fromModel($chapter, $files);
59 public static function validate(ZipValidationHelper $context, array $data): array
62 'id' => ['nullable', 'int', $context->uniqueIdRule('chapter')],
63 'name' => ['required', 'string', 'min:1'],
64 'description_html' => ['nullable', 'string'],
65 'priority' => ['nullable', 'int'],
70 $errors = $context->validateData($data, $rules);
71 $errors['tags'] = $context->validateRelations($data['tags'] ?? [], ZipExportTag::class);
72 $errors['pages'] = $context->validateRelations($data['pages'] ?? [], ZipExportPage::class);
77 public static function fromArray(array $data): self
81 $model->id = $data['id'] ?? null;
82 $model->name = $data['name'];
83 $model->description_html = $data['description_html'] ?? null;
84 $model->priority = isset($data['priority']) ? intval($data['priority']) : null;
85 $model->tags = ZipExportTag::fromManyArray($data['tags'] ?? []);
86 $model->pages = ZipExportPage::fromManyArray($data['pages'] ?? []);