| 
									
										
										
										
											2019-10-05 19:55:01 +08:00
										 |  |  | <?php | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | namespace BookStack\Entities\Repos; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-05-18 00:56:55 +08:00
										 |  |  | use BookStack\Activity\TagRepo; | 
					
						
							| 
									
										
										
										
											2024-02-01 20:51:47 +08:00
										 |  |  | use BookStack\Entities\Models\Book; | 
					
						
							|  |  |  | use BookStack\Entities\Models\Chapter; | 
					
						
							| 
									
										
										
										
											2020-11-22 08:17:45 +08:00
										 |  |  | use BookStack\Entities\Models\Entity; | 
					
						
							|  |  |  | use BookStack\Entities\Models\HasCoverImage; | 
					
						
							| 
									
										
										
										
											2023-12-17 23:02:15 +08:00
										 |  |  | use BookStack\Entities\Models\HasHtmlDescription; | 
					
						
							| 
									
										
										
										
											2024-02-08 05:58:27 +08:00
										 |  |  | use BookStack\Entities\Queries\PageQueries; | 
					
						
							| 
									
										
										
										
											2019-10-05 19:55:01 +08:00
										 |  |  | use BookStack\Exceptions\ImageUploadException; | 
					
						
							| 
									
										
										
										
											2023-12-19 00:23:40 +08:00
										 |  |  | use BookStack\References\ReferenceStore; | 
					
						
							| 
									
										
										
										
											2022-08-22 01:05:19 +08:00
										 |  |  | use BookStack\References\ReferenceUpdater; | 
					
						
							| 
									
										
										
										
											2019-10-05 19:55:01 +08:00
										 |  |  | use BookStack\Uploads\ImageRepo; | 
					
						
							| 
									
										
										
										
											2023-12-19 23:10:29 +08:00
										 |  |  | use BookStack\Util\HtmlDescriptionFilter; | 
					
						
							| 
									
										
										
										
											2019-10-05 19:55:01 +08:00
										 |  |  | use Illuminate\Http\UploadedFile; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class BaseRepo | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2023-12-17 23:02:15 +08:00
										 |  |  |     public function __construct( | 
					
						
							|  |  |  |         protected TagRepo $tagRepo, | 
					
						
							|  |  |  |         protected ImageRepo $imageRepo, | 
					
						
							| 
									
										
										
										
											2023-12-19 00:23:40 +08:00
										 |  |  |         protected ReferenceUpdater $referenceUpdater, | 
					
						
							|  |  |  |         protected ReferenceStore $referenceStore, | 
					
						
							| 
									
										
										
										
											2024-02-08 05:58:27 +08:00
										 |  |  |         protected PageQueries $pageQueries, | 
					
						
							| 
									
										
										
										
											2023-12-17 23:02:15 +08:00
										 |  |  |     ) { | 
					
						
							| 
									
										
										
										
											2019-10-05 19:55:01 +08:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							| 
									
										
										
										
											2021-06-26 23:23:15 +08:00
										 |  |  |      * Create a new entity in the system. | 
					
						
							| 
									
										
										
										
											2019-10-05 19:55:01 +08:00
										 |  |  |      */ | 
					
						
							|  |  |  |     public function create(Entity $entity, array $input) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $entity->fill($input); | 
					
						
							| 
									
										
										
										
											2023-12-17 23:02:15 +08:00
										 |  |  |         $this->updateDescription($entity, $input); | 
					
						
							| 
									
										
										
										
											2019-10-05 19:55:01 +08:00
										 |  |  |         $entity->forceFill([ | 
					
						
							|  |  |  |             'created_by' => user()->id, | 
					
						
							|  |  |  |             'updated_by' => user()->id, | 
					
						
							| 
									
										
										
										
											2021-06-26 23:23:15 +08:00
										 |  |  |             'owned_by'   => user()->id, | 
					
						
							| 
									
										
										
										
											2019-10-05 19:55:01 +08:00
										 |  |  |         ]); | 
					
						
							|  |  |  |         $entity->refreshSlug(); | 
					
						
							|  |  |  |         $entity->save(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if (isset($input['tags'])) { | 
					
						
							|  |  |  |             $this->tagRepo->saveTagsToEntity($entity, $input['tags']); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-08-10 15:06:48 +08:00
										 |  |  |         $entity->refresh(); | 
					
						
							| 
									
										
										
										
											2019-10-05 19:55:01 +08:00
										 |  |  |         $entity->rebuildPermissions(); | 
					
						
							|  |  |  |         $entity->indexForSearch(); | 
					
						
							| 
									
										
										
										
											2023-12-19 00:23:40 +08:00
										 |  |  |         $this->referenceStore->updateForEntity($entity); | 
					
						
							| 
									
										
										
										
											2019-10-05 19:55:01 +08:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * Update the given entity. | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     public function update(Entity $entity, array $input) | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2022-08-22 01:05:19 +08:00
										 |  |  |         $oldUrl = $entity->getUrl(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-05 19:55:01 +08:00
										 |  |  |         $entity->fill($input); | 
					
						
							| 
									
										
										
										
											2023-12-17 23:02:15 +08:00
										 |  |  |         $this->updateDescription($entity, $input); | 
					
						
							| 
									
										
										
										
											2019-10-05 19:55:01 +08:00
										 |  |  |         $entity->updated_by = user()->id; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-09-01 19:53:34 +08:00
										 |  |  |         if ($entity->isDirty('name') || empty($entity->slug)) { | 
					
						
							| 
									
										
										
										
											2019-10-05 19:55:01 +08:00
										 |  |  |             $entity->refreshSlug(); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $entity->save(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if (isset($input['tags'])) { | 
					
						
							|  |  |  |             $this->tagRepo->saveTagsToEntity($entity, $input['tags']); | 
					
						
							| 
									
										
										
										
											2022-04-05 00:24:05 +08:00
										 |  |  |             $entity->touch(); | 
					
						
							| 
									
										
										
										
											2019-10-05 19:55:01 +08:00
										 |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $entity->rebuildPermissions(); | 
					
						
							|  |  |  |         $entity->indexForSearch(); | 
					
						
							| 
									
										
										
										
											2023-12-19 00:23:40 +08:00
										 |  |  |         $this->referenceStore->updateForEntity($entity); | 
					
						
							| 
									
										
										
										
											2022-08-22 01:05:19 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |         if ($oldUrl !== $entity->getUrl()) { | 
					
						
							| 
									
										
										
										
											2023-12-19 02:12:36 +08:00
										 |  |  |             $this->referenceUpdater->updateEntityReferences($entity, $oldUrl); | 
					
						
							| 
									
										
										
										
											2022-08-22 01:05:19 +08:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2019-10-05 19:55:01 +08:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * Update the given items' cover image, or clear it. | 
					
						
							| 
									
										
										
										
											2021-06-26 23:23:15 +08:00
										 |  |  |      * | 
					
						
							| 
									
										
										
										
											2021-11-20 22:03:56 +08:00
										 |  |  |      * @param Entity&HasCoverImage $entity | 
					
						
							|  |  |  |      * | 
					
						
							| 
									
										
										
										
											2019-10-05 19:55:01 +08:00
										 |  |  |      * @throws ImageUploadException | 
					
						
							|  |  |  |      * @throws \Exception | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2021-11-20 22:03:56 +08:00
										 |  |  |     public function updateCoverImage($entity, ?UploadedFile $coverImage, bool $removeImage = false) | 
					
						
							| 
									
										
										
										
											2019-10-05 19:55:01 +08:00
										 |  |  |     { | 
					
						
							|  |  |  |         if ($coverImage) { | 
					
						
							| 
									
										
										
										
											2022-09-02 19:54:54 +08:00
										 |  |  |             $imageType = $entity->coverImageTypeKey(); | 
					
						
							| 
									
										
										
										
											2022-10-24 19:12:48 +08:00
										 |  |  |             $this->imageRepo->destroyImage($entity->cover()->first()); | 
					
						
							| 
									
										
										
										
											2022-09-02 19:54:54 +08:00
										 |  |  |             $image = $this->imageRepo->saveNew($coverImage, $imageType, $entity->id, 512, 512, true); | 
					
						
							| 
									
										
										
										
											2019-10-05 19:55:01 +08:00
										 |  |  |             $entity->cover()->associate($image); | 
					
						
							| 
									
										
										
										
											2019-10-22 17:18:08 +08:00
										 |  |  |             $entity->save(); | 
					
						
							| 
									
										
										
										
											2019-10-05 19:55:01 +08:00
										 |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if ($removeImage) { | 
					
						
							| 
									
										
										
										
											2022-10-24 19:12:48 +08:00
										 |  |  |             $this->imageRepo->destroyImage($entity->cover()->first()); | 
					
						
							| 
									
										
										
										
											2019-10-05 19:55:01 +08:00
										 |  |  |             $entity->image_id = 0; | 
					
						
							|  |  |  |             $entity->save(); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2023-12-17 23:02:15 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-02-01 20:51:47 +08:00
										 |  |  |     /** | 
					
						
							|  |  |  |      * Update the default page template used for this item. | 
					
						
							|  |  |  |      * Checks that, if changing, the provided value is a valid template and the user | 
					
						
							|  |  |  |      * has visibility of the provided page template id. | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     public function updateDefaultTemplate(Book|Chapter $entity, int $templateId): void | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $changing = $templateId !== intval($entity->default_template_id); | 
					
						
							|  |  |  |         if (!$changing) { | 
					
						
							|  |  |  |             return; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if ($templateId === 0) { | 
					
						
							|  |  |  |             $entity->default_template_id = null; | 
					
						
							|  |  |  |             $entity->save(); | 
					
						
							|  |  |  |             return; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-02-08 05:58:27 +08:00
										 |  |  |         $templateExists = $this->pageQueries->visibleTemplates() | 
					
						
							| 
									
										
										
										
											2024-02-01 20:51:47 +08:00
										 |  |  |             ->where('id', '=', $templateId) | 
					
						
							|  |  |  |             ->exists(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $entity->default_template_id = $templateExists ? $templateId : null; | 
					
						
							|  |  |  |         $entity->save(); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-12-17 23:02:15 +08:00
										 |  |  |     protected function updateDescription(Entity $entity, array $input): void | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         if (!in_array(HasHtmlDescription::class, class_uses($entity))) { | 
					
						
							|  |  |  |             return; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         /** @var HasHtmlDescription $entity */ | 
					
						
							|  |  |  |         if (isset($input['description_html'])) { | 
					
						
							| 
									
										
										
										
											2023-12-19 23:10:29 +08:00
										 |  |  |             $entity->description_html = HtmlDescriptionFilter::filterFromString($input['description_html']); | 
					
						
							| 
									
										
										
										
											2023-12-17 23:02:15 +08:00
										 |  |  |             $entity->description = html_entity_decode(strip_tags($input['description_html'])); | 
					
						
							|  |  |  |         } else if (isset($input['description'])) { | 
					
						
							|  |  |  |             $entity->description = $input['description']; | 
					
						
							| 
									
										
										
										
											2023-12-22 21:17:23 +08:00
										 |  |  |             $entity->description_html = ''; | 
					
						
							| 
									
										
										
										
											2023-12-17 23:02:15 +08:00
										 |  |  |             $entity->description_html = $entity->descriptionHtml(); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2019-10-05 19:55:01 +08:00
										 |  |  | } |