diff options
author | ArthurHoaro <arthur@hoa.ro> | 2016-03-21 21:40:49 +0100 |
---|---|---|
committer | ArthurHoaro <arthur@hoa.ro> | 2016-03-25 19:17:59 +0100 |
commit | 528a6f8a232c060faf024008e4f8a09b4aa8dabc (patch) | |
tree | 86cac78b7f4d3998bedd923da83145c37ec88ff4 /application | |
parent | ee88a4bcc29da721cf43b750663aebeac4969517 (diff) | |
download | Shaarli-528a6f8a232c060faf024008e4f8a09b4aa8dabc.tar.gz Shaarli-528a6f8a232c060faf024008e4f8a09b4aa8dabc.tar.zst Shaarli-528a6f8a232c060faf024008e4f8a09b4aa8dabc.zip |
Refactor filter in LinkDB
* search type now carried by LinkDB in order to factorize code between different search sources.
* LinkDB->filter split in 3 method: filterSearch, filterHash, filterDay (we know what type of filter is needed).
* filterHash now throw a LinkNotFoundException if it doesn't exist: internal implementation choice, still displays a 404.
* Smallhash regex has been rewritten.
* Unit tests update
Diffstat (limited to 'application')
-rw-r--r-- | application/FeedBuilder.php | 18 | ||||
-rw-r--r-- | application/LinkDB.php | 64 | ||||
-rw-r--r-- | application/LinkFilter.php | 14 | ||||
-rw-r--r-- | application/Updater.php | 2 |
4 files changed, 74 insertions, 24 deletions
diff --git a/application/FeedBuilder.php b/application/FeedBuilder.php index 50e09831..ddefe6ce 100644 --- a/application/FeedBuilder.php +++ b/application/FeedBuilder.php | |||
@@ -103,23 +103,7 @@ class FeedBuilder | |||
103 | public function buildData() | 103 | public function buildData() |
104 | { | 104 | { |
105 | // Optionally filter the results: | 105 | // Optionally filter the results: |
106 | $searchtags = !empty($this->userInput['searchtags']) ? escape($this->userInput['searchtags']) : ''; | 106 | $linksToDisplay = $this->linkDB->filterSearch($this->userInput); |
107 | $searchterm = !empty($this->userInput['searchterm']) ? escape($this->userInput['searchterm']) : ''; | ||
108 | if (! empty($searchtags) && ! empty($searchterm)) { | ||
109 | $linksToDisplay = $this->linkDB->filter( | ||
110 | LinkFilter::$FILTER_TAG | LinkFilter::$FILTER_TEXT, | ||
111 | array($searchtags, $searchterm) | ||
112 | ); | ||
113 | } | ||
114 | elseif ($searchtags) { | ||
115 | $linksToDisplay = $this->linkDB->filter(LinkFilter::$FILTER_TAG, $searchtags); | ||
116 | } | ||
117 | elseif ($searchterm) { | ||
118 | $linksToDisplay = $this->linkDB->filter(LinkFilter::$FILTER_TEXT, $searchterm); | ||
119 | } | ||
120 | else { | ||
121 | $linksToDisplay = $this->linkDB; | ||
122 | } | ||
123 | 107 | ||
124 | $nblinksToDisplay = $this->getNbLinks(count($linksToDisplay)); | 108 | $nblinksToDisplay = $this->getNbLinks(count($linksToDisplay)); |
125 | 109 | ||
diff --git a/application/LinkDB.php b/application/LinkDB.php index 1b505620..a62341fc 100644 --- a/application/LinkDB.php +++ b/application/LinkDB.php | |||
@@ -341,17 +341,71 @@ You use the community supported version of the original Shaarli project, by Seba | |||
341 | } | 341 | } |
342 | 342 | ||
343 | /** | 343 | /** |
344 | * Filter links. | 344 | * Returns the shaare corresponding to a smallHash. |
345 | * | 345 | * |
346 | * @param string $type Type of filter. | 346 | * @param string $request QUERY_STRING server parameter. |
347 | * @param mixed $request Search request, string or array. | 347 | * |
348 | * @return array $filtered array containing permalink data. | ||
349 | * | ||
350 | * @throws LinkNotFoundException if the smallhash is malformed or doesn't match any link. | ||
351 | */ | ||
352 | public function filterHash($request) | ||
353 | { | ||
354 | $request = substr($request, 0, 6); | ||
355 | $linkFilter = new LinkFilter($this->_links); | ||
356 | return $linkFilter->filter(LinkFilter::$FILTER_HASH, $request); | ||
357 | } | ||
358 | |||
359 | /** | ||
360 | * Returns the list of articles for a given day. | ||
361 | * | ||
362 | * @param string $request day to filter. Format: YYYYMMDD. | ||
363 | * | ||
364 | * @return array list of shaare found. | ||
365 | */ | ||
366 | public function filterDay($request) { | ||
367 | $linkFilter = new LinkFilter($this->_links); | ||
368 | return $linkFilter->filter(LinkFilter::$FILTER_DAY, $request); | ||
369 | } | ||
370 | |||
371 | /** | ||
372 | * Filter links according to search parameters. | ||
373 | * | ||
374 | * @param array $filterRequest Search request content. Supported keys: | ||
375 | * - searchtags: list of tags | ||
376 | * - searchterm: term search | ||
348 | * @param bool $casesensitive Optional: Perform case sensitive filter | 377 | * @param bool $casesensitive Optional: Perform case sensitive filter |
349 | * @param bool $privateonly Optional: Returns private links only if true. | 378 | * @param bool $privateonly Optional: Returns private links only if true. |
350 | * | 379 | * |
351 | * @return array filtered links | 380 | * @return array filtered links, all links if no suitable filter was provided. |
352 | */ | 381 | */ |
353 | public function filter($type = '', $request = '', $casesensitive = false, $privateonly = false) | 382 | public function filterSearch($filterRequest = array(), $casesensitive = false, $privateonly = false) |
354 | { | 383 | { |
384 | // Filter link database according to parameters. | ||
385 | $searchtags = !empty($filterRequest['searchtags']) ? escape($filterRequest['searchtags']) : ''; | ||
386 | $searchterm = !empty($filterRequest['searchterm']) ? escape($filterRequest['searchterm']) : ''; | ||
387 | |||
388 | // Search tags + fullsearch. | ||
389 | if (empty($type) && ! empty($searchtags) && ! empty($searchterm)) { | ||
390 | $type = LinkFilter::$FILTER_TAG | LinkFilter::$FILTER_TEXT; | ||
391 | $request = array($searchtags, $searchterm); | ||
392 | } | ||
393 | // Search by tags. | ||
394 | elseif (! empty($searchtags)) { | ||
395 | $type = LinkFilter::$FILTER_TAG; | ||
396 | $request = $searchtags; | ||
397 | } | ||
398 | // Fulltext search. | ||
399 | elseif (! empty($searchterm)) { | ||
400 | $type = LinkFilter::$FILTER_TEXT; | ||
401 | $request = $searchterm; | ||
402 | } | ||
403 | // Otherwise, display without filtering. | ||
404 | else { | ||
405 | $type = ''; | ||
406 | $request = ''; | ||
407 | } | ||
408 | |||
355 | $linkFilter = new LinkFilter($this->_links); | 409 | $linkFilter = new LinkFilter($this->_links); |
356 | return $linkFilter->filter($type, $request, $casesensitive, $privateonly); | 410 | return $linkFilter->filter($type, $request, $casesensitive, $privateonly); |
357 | } | 411 | } |
diff --git a/application/LinkFilter.php b/application/LinkFilter.php index 3fd803cb..5e0d8015 100644 --- a/application/LinkFilter.php +++ b/application/LinkFilter.php | |||
@@ -44,7 +44,7 @@ class LinkFilter | |||
44 | * Filter links according to parameters. | 44 | * Filter links according to parameters. |
45 | * | 45 | * |
46 | * @param string $type Type of filter (eg. tags, permalink, etc.). | 46 | * @param string $type Type of filter (eg. tags, permalink, etc.). |
47 | * @param string $request Filter content. | 47 | * @param mixed $request Filter content. |
48 | * @param bool $casesensitive Optional: Perform case sensitive filter if true. | 48 | * @param bool $casesensitive Optional: Perform case sensitive filter if true. |
49 | * @param bool $privateonly Optional: Only returns private links if true. | 49 | * @param bool $privateonly Optional: Only returns private links if true. |
50 | * | 50 | * |
@@ -110,6 +110,8 @@ class LinkFilter | |||
110 | * @param string $smallHash permalink hash. | 110 | * @param string $smallHash permalink hash. |
111 | * | 111 | * |
112 | * @return array $filtered array containing permalink data. | 112 | * @return array $filtered array containing permalink data. |
113 | * | ||
114 | * @throws LinkNotFoundException if the smallhash doesn't match any link. | ||
113 | */ | 115 | */ |
114 | private function filterSmallHash($smallHash) | 116 | private function filterSmallHash($smallHash) |
115 | { | 117 | { |
@@ -121,6 +123,11 @@ class LinkFilter | |||
121 | return $filtered; | 123 | return $filtered; |
122 | } | 124 | } |
123 | } | 125 | } |
126 | |||
127 | if (empty($filtered)) { | ||
128 | throw new LinkNotFoundException(); | ||
129 | } | ||
130 | |||
124 | return $filtered; | 131 | return $filtered; |
125 | } | 132 | } |
126 | 133 | ||
@@ -318,3 +325,8 @@ class LinkFilter | |||
318 | return array_filter(explode(' ', trim($tagsOut)), 'strlen'); | 325 | return array_filter(explode(' ', trim($tagsOut)), 'strlen'); |
319 | } | 326 | } |
320 | } | 327 | } |
328 | |||
329 | class LinkNotFoundException extends Exception | ||
330 | { | ||
331 | protected $message = 'The link you are trying to reach does not exist or has been deleted.'; | ||
332 | } | ||
diff --git a/application/Updater.php b/application/Updater.php index 773a1ffa..58c13c07 100644 --- a/application/Updater.php +++ b/application/Updater.php | |||
@@ -137,7 +137,7 @@ class Updater | |||
137 | */ | 137 | */ |
138 | public function updateMethodRenameDashTags() | 138 | public function updateMethodRenameDashTags() |
139 | { | 139 | { |
140 | $linklist = $this->linkDB->filter(); | 140 | $linklist = $this->linkDB->filterSearch(); |
141 | foreach ($linklist as $link) { | 141 | foreach ($linklist as $link) { |
142 | $link['tags'] = preg_replace('/(^| )\-/', '$1', $link['tags']); | 142 | $link['tags'] = preg_replace('/(^| )\-/', '$1', $link['tags']); |
143 | $link['tags'] = implode(' ', array_unique(LinkFilter::tagsStrToArray($link['tags'], true))); | 143 | $link['tags'] = implode(' ', array_unique(LinkFilter::tagsStrToArray($link['tags'], true))); |