| 
									
										
										
										
											2019-10-05 19:55:01 +08:00
										 |  |  | <?php | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | namespace BookStack\Entities\Repos; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | use BookStack\Actions\TagRepo; | 
					
						
							| 
									
										
										
										
											2020-11-22 08:17:45 +08:00
										 |  |  | use BookStack\Entities\Models\Entity; | 
					
						
							|  |  |  | use BookStack\Entities\Models\HasCoverImage; | 
					
						
							| 
									
										
										
										
											2019-10-05 19:55:01 +08:00
										 |  |  | use BookStack\Exceptions\ImageUploadException; | 
					
						
							| 
									
										
										
										
											2022-08-22 01:05:19 +08:00
										 |  |  | use BookStack\References\ReferenceUpdater; | 
					
						
							| 
									
										
										
										
											2019-10-05 19:55:01 +08:00
										 |  |  | use BookStack\Uploads\ImageRepo; | 
					
						
							|  |  |  | use Illuminate\Http\UploadedFile; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class BaseRepo | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2022-04-05 00:24:05 +08:00
										 |  |  |     protected TagRepo $tagRepo; | 
					
						
							|  |  |  |     protected ImageRepo $imageRepo; | 
					
						
							| 
									
										
										
										
											2022-08-22 01:05:19 +08:00
										 |  |  |     protected ReferenceUpdater $referenceUpdater; | 
					
						
							| 
									
										
										
										
											2019-10-05 19:55:01 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-08-22 01:05:19 +08:00
										 |  |  |     public function __construct(TagRepo $tagRepo, ImageRepo $imageRepo, ReferenceUpdater $referenceUpdater) | 
					
						
							| 
									
										
										
										
											2019-10-05 19:55:01 +08:00
										 |  |  |     { | 
					
						
							|  |  |  |         $this->tagRepo = $tagRepo; | 
					
						
							|  |  |  |         $this->imageRepo = $imageRepo; | 
					
						
							| 
									
										
										
										
											2022-08-22 01:05:19 +08:00
										 |  |  |         $this->referenceUpdater = $referenceUpdater; | 
					
						
							| 
									
										
										
										
											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); | 
					
						
							|  |  |  |         $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(); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * 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); | 
					
						
							|  |  |  |         $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(); | 
					
						
							| 
									
										
										
										
											2022-08-22 01:05:19 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |         if ($oldUrl !== $entity->getUrl()) { | 
					
						
							|  |  |  |             $this->referenceUpdater->updateEntityPageReferences($entity, $oldUrl); | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											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(); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | } |