| 
									
										
										
										
											2016-05-07 03:33:08 +08:00
										 |  |  | <?php namespace BookStack\Repos; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-05-14 04:20:21 +08:00
										 |  |  | use BookStack\Tag; | 
					
						
							| 
									
										
										
										
											2016-05-07 03:33:08 +08:00
										 |  |  | use BookStack\Entity; | 
					
						
							|  |  |  | use BookStack\Services\PermissionService; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /** | 
					
						
							| 
									
										
										
										
											2016-05-14 04:20:21 +08:00
										 |  |  |  * Class TagRepo | 
					
						
							| 
									
										
										
										
											2016-05-07 03:33:08 +08:00
										 |  |  |  * @package BookStack\Repos | 
					
						
							|  |  |  |  */ | 
					
						
							| 
									
										
										
										
											2016-05-14 04:20:21 +08:00
										 |  |  | class TagRepo | 
					
						
							| 
									
										
										
										
											2016-05-07 03:33:08 +08:00
										 |  |  | { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-05-14 04:20:21 +08:00
										 |  |  |     protected $tag; | 
					
						
							| 
									
										
										
										
											2016-05-07 03:33:08 +08:00
										 |  |  |     protected $entity; | 
					
						
							|  |  |  |     protected $permissionService; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							| 
									
										
										
										
											2016-05-14 04:20:21 +08:00
										 |  |  |      * TagRepo constructor. | 
					
						
							|  |  |  |      * @param Tag $attr | 
					
						
							| 
									
										
										
										
											2016-05-07 03:33:08 +08:00
										 |  |  |      * @param Entity $ent | 
					
						
							|  |  |  |      * @param PermissionService $ps | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2016-05-14 04:20:21 +08:00
										 |  |  |     public function __construct(Tag $attr, Entity $ent, PermissionService $ps) | 
					
						
							| 
									
										
										
										
											2016-05-07 03:33:08 +08:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2016-05-14 04:20:21 +08:00
										 |  |  |         $this->tag = $attr; | 
					
						
							| 
									
										
										
										
											2016-05-07 03:33:08 +08:00
										 |  |  |         $this->entity = $ent; | 
					
						
							|  |  |  |         $this->permissionService = $ps; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-05-07 21:29:43 +08:00
										 |  |  |     /** | 
					
						
							|  |  |  |      * Get an entity instance of its particular type. | 
					
						
							|  |  |  |      * @param $entityType | 
					
						
							|  |  |  |      * @param $entityId | 
					
						
							|  |  |  |      * @param string $action | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     public function getEntity($entityType, $entityId, $action = 'view') | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $entityInstance = $this->entity->getEntityInstance($entityType); | 
					
						
							| 
									
										
										
										
											2016-05-14 04:20:21 +08:00
										 |  |  |         $searchQuery = $entityInstance->where('id', '=', $entityId)->with('tags'); | 
					
						
							| 
									
										
										
										
											2016-05-07 21:29:43 +08:00
										 |  |  |         $searchQuery = $this->permissionService->enforceEntityRestrictions($searchQuery, $action); | 
					
						
							|  |  |  |         return $searchQuery->first(); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							| 
									
										
										
										
											2016-05-14 04:20:21 +08:00
										 |  |  |      * Get all tags for a particular entity. | 
					
						
							| 
									
										
										
										
											2016-05-07 21:29:43 +08:00
										 |  |  |      * @param string $entityType | 
					
						
							|  |  |  |      * @param int $entityId | 
					
						
							|  |  |  |      * @return mixed | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     public function getForEntity($entityType, $entityId) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $entity = $this->getEntity($entityType, $entityId); | 
					
						
							|  |  |  |         if ($entity === null) return collect(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-05-14 04:20:21 +08:00
										 |  |  |         return $entity->tags; | 
					
						
							| 
									
										
										
										
											2016-05-07 21:29:43 +08:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							| 
									
										
										
										
											2016-05-14 04:20:21 +08:00
										 |  |  |      * Get tag name suggestions from scanning existing tag names. | 
					
						
							| 
									
										
										
										
											2016-06-04 22:37:28 +08:00
										 |  |  |      * If no search term is given the 50 most popular tag names are provided. | 
					
						
							| 
									
										
										
										
											2016-05-07 21:29:43 +08:00
										 |  |  |      * @param $searchTerm | 
					
						
							|  |  |  |      * @return array | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2016-06-04 22:37:28 +08:00
										 |  |  |     public function getNameSuggestions($searchTerm = false) | 
					
						
							| 
									
										
										
										
											2016-05-07 21:29:43 +08:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2016-06-04 22:37:28 +08:00
										 |  |  |         $query = $this->tag->select('*', \DB::raw('count(*) as count'))->groupBy('name'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if ($searchTerm) { | 
					
						
							|  |  |  |             $query = $query->where('name', 'LIKE', $searchTerm . '%')->orderBy('name', 'desc'); | 
					
						
							|  |  |  |         } else { | 
					
						
							|  |  |  |             $query = $query->orderBy('count', 'desc')->take(50); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-05-14 04:20:21 +08:00
										 |  |  |         $query = $this->permissionService->filterRestrictedEntityRelations($query, 'tags', 'entity_id', 'entity_type'); | 
					
						
							| 
									
										
										
										
											2016-05-07 21:29:43 +08:00
										 |  |  |         return $query->get(['name'])->pluck('name'); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-05-16 03:12:53 +08:00
										 |  |  |     /** | 
					
						
							|  |  |  |      * Get tag value suggestions from scanning existing tag values. | 
					
						
							| 
									
										
										
										
											2016-06-04 22:37:28 +08:00
										 |  |  |      * If no search is given the 50 most popular values are provided. | 
					
						
							|  |  |  |      * Passing a tagName will only find values for a tags with a particular name. | 
					
						
							| 
									
										
										
										
											2016-05-16 03:12:53 +08:00
										 |  |  |      * @param $searchTerm | 
					
						
							| 
									
										
										
										
											2016-06-04 21:54:31 +08:00
										 |  |  |      * @param $tagName | 
					
						
							| 
									
										
										
										
											2016-05-16 03:12:53 +08:00
										 |  |  |      * @return array | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2016-06-04 22:37:28 +08:00
										 |  |  |     public function getValueSuggestions($searchTerm = false, $tagName = false) | 
					
						
							| 
									
										
										
										
											2016-05-16 03:12:53 +08:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2016-06-04 22:37:28 +08:00
										 |  |  |         $query = $this->tag->select('*', \DB::raw('count(*) as count'))->groupBy('value'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if ($searchTerm) { | 
					
						
							|  |  |  |             $query = $query->where('value', 'LIKE', $searchTerm . '%')->orderBy('value', 'desc'); | 
					
						
							|  |  |  |         } else { | 
					
						
							|  |  |  |             $query = $query->orderBy('count', 'desc')->take(50); | 
					
						
							| 
									
										
										
										
											2016-06-04 21:54:31 +08:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2016-06-04 22:37:28 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |         if ($tagName !== false) $query = $query->where('name', '=', $tagName); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-05-16 03:12:53 +08:00
										 |  |  |         $query = $this->permissionService->filterRestrictedEntityRelations($query, 'tags', 'entity_id', 'entity_type'); | 
					
						
							|  |  |  |         return $query->get(['value'])->pluck('value'); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2016-06-04 22:37:28 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-05-07 21:29:43 +08:00
										 |  |  |     /** | 
					
						
							| 
									
										
										
										
											2016-05-14 04:20:21 +08:00
										 |  |  |      * Save an array of tags to an entity | 
					
						
							| 
									
										
										
										
											2016-05-07 21:29:43 +08:00
										 |  |  |      * @param Entity $entity | 
					
						
							| 
									
										
										
										
											2016-05-14 04:20:21 +08:00
										 |  |  |      * @param array $tags | 
					
						
							| 
									
										
										
										
											2016-05-07 21:29:43 +08:00
										 |  |  |      * @return array|\Illuminate\Database\Eloquent\Collection | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2016-05-14 04:20:21 +08:00
										 |  |  |     public function saveTagsToEntity(Entity $entity, $tags = []) | 
					
						
							| 
									
										
										
										
											2016-05-07 21:29:43 +08:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2016-05-14 04:20:21 +08:00
										 |  |  |         $entity->tags()->delete(); | 
					
						
							|  |  |  |         $newTags = []; | 
					
						
							|  |  |  |         foreach ($tags as $tag) { | 
					
						
							|  |  |  |             if (trim($tag['name']) === '') continue; | 
					
						
							|  |  |  |             $newTags[] = $this->newInstanceFromInput($tag); | 
					
						
							| 
									
										
										
										
											2016-05-07 21:29:43 +08:00
										 |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-05-14 04:20:21 +08:00
										 |  |  |         return $entity->tags()->saveMany($newTags); | 
					
						
							| 
									
										
										
										
											2016-05-07 21:29:43 +08:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							| 
									
										
										
										
											2016-05-14 04:20:21 +08:00
										 |  |  |      * Create a new Tag instance from user input. | 
					
						
							| 
									
										
										
										
											2016-05-07 21:29:43 +08:00
										 |  |  |      * @param $input | 
					
						
							| 
									
										
										
										
											2016-12-05 00:51:39 +08:00
										 |  |  |      * @return Tag | 
					
						
							| 
									
										
										
										
											2016-05-07 21:29:43 +08:00
										 |  |  |      */ | 
					
						
							|  |  |  |     protected function newInstanceFromInput($input) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $name = trim($input['name']); | 
					
						
							|  |  |  |         $value = isset($input['value']) ? trim($input['value']) : ''; | 
					
						
							|  |  |  |         // Any other modification or cleanup required can go here
 | 
					
						
							|  |  |  |         $values = ['name' => $name, 'value' => $value]; | 
					
						
							| 
									
										
										
										
											2016-05-14 04:20:21 +08:00
										 |  |  |         return $this->tag->newInstance($values); | 
					
						
							| 
									
										
										
										
											2016-05-07 21:29:43 +08:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2016-05-07 03:33:08 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | } |