]> git.immae.eu Git - github/shaarli/Shaarli.git/commitdiff
Update LinkFilter to be able to filter only public links 768/head
authorArthurHoaro <arthur@hoa.ro>
Mon, 16 Jan 2017 12:57:11 +0000 (13:57 +0100)
committerArthurHoaro <arthur@hoa.ro>
Mon, 16 Jan 2017 12:57:11 +0000 (13:57 +0100)
No update regarding the UI or the API for now

Fixes #758

application/LinkDB.php
application/LinkFilter.php
application/api/controllers/Links.php
index.php
tests/LinkFilterTest.php

index 1e13286ad31808a778c41eab2bd4b6533e7775bb..4cee2af9942559fd122189687058ddddc1fc4ebf 100644 (file)
@@ -443,11 +443,11 @@ You use the community supported version of the original Shaarli project, by Seba
      *                                - searchtags: list of tags
      *                                - searchterm: term search
      * @param bool   $casesensitive Optional: Perform case sensitive filter
-     * @param bool   $privateonly   Optional: Returns private links only if true.
+     * @param string $visibility    return only all/private/public links
      *
      * @return array filtered links, all links if no suitable filter was provided.
      */
-    public function filterSearch($filterRequest = array(), $casesensitive = false, $privateonly = false)
+    public function filterSearch($filterRequest = array(), $casesensitive = false, $visibility = 'all')
     {
         // Filter link database according to parameters.
         $searchtags = !empty($filterRequest['searchtags']) ? escape($filterRequest['searchtags']) : '';
@@ -475,7 +475,7 @@ You use the community supported version of the original Shaarli project, by Seba
         }
 
         $linkFilter = new LinkFilter($this);
-        return $linkFilter->filter($type, $request, $casesensitive, $privateonly);
+        return $linkFilter->filter($type, $request, $casesensitive, $visibility);
     }
 
     /**
index 57ebfd5cb8070e55bd87545f9ad716434a8c488b..81832a4b428f4bc650d3049b8e0ced2a850c1cdc 100644 (file)
@@ -51,12 +51,16 @@ class LinkFilter
      * @param string $type          Type of filter (eg. tags, permalink, etc.).
      * @param mixed  $request       Filter content.
      * @param bool   $casesensitive Optional: Perform case sensitive filter if true.
-     * @param bool   $privateonly   Optional: Only returns private links if true.
+     * @param string $visibility    Optional: return only all/private/public links
      *
      * @return array filtered link list.
      */
-    public function filter($type, $request, $casesensitive = false, $privateonly = false)
+    public function filter($type, $request, $casesensitive = false, $visibility = 'all')
     {
+        if (! in_array($visibility, ['all', 'public', 'private'])) {
+            $visibility = 'all';
+        }
+
         switch($type) {
             case self::$FILTER_HASH:
                 return $this->filterSmallHash($request);
@@ -64,42 +68,44 @@ class LinkFilter
                 if (!empty($request)) {
                     $filtered = $this->links;
                     if (isset($request[0])) {
-                        $filtered = $this->filterTags($request[0], $casesensitive, $privateonly);
+                        $filtered = $this->filterTags($request[0], $casesensitive, $visibility);
                     }
                     if (isset($request[1])) {
                         $lf = new LinkFilter($filtered);
-                        $filtered = $lf->filterFulltext($request[1], $privateonly);
+                        $filtered = $lf->filterFulltext($request[1], $visibility);
                     }
                     return $filtered;
                 }
-                return $this->noFilter($privateonly);
+                return $this->noFilter($visibility);
             case self::$FILTER_TEXT:
-                return $this->filterFulltext($request, $privateonly);
+                return $this->filterFulltext($request, $visibility);
             case self::$FILTER_TAG:
-                return $this->filterTags($request, $casesensitive, $privateonly);
+                return $this->filterTags($request, $casesensitive, $visibility);
             case self::$FILTER_DAY:
                 return $this->filterDay($request);
             default:
-                return $this->noFilter($privateonly);
+                return $this->noFilter($visibility);
         }
     }
 
     /**
      * Unknown filter, but handle private only.
      *
-     * @param bool $privateonly returns private link only if true.
+     * @param string $visibility Optional: return only all/private/public links
      *
      * @return array filtered links.
      */
-    private function noFilter($privateonly = false)
+    private function noFilter($visibility = 'all')
     {
-        if (! $privateonly) {
+        if ($visibility === 'all') {
             return $this->links;
         }
 
         $out = array();
         foreach ($this->links as $key => $value) {
-            if ($value['private']) {
+            if ($value['private'] && $visibility === 'private') {
+                $out[$key] = $value;
+            } else if (! $value['private'] && $visibility === 'public') {
                 $out[$key] = $value;
             }
         }
@@ -151,14 +157,14 @@ class LinkFilter
      *  - see https://github.com/shaarli/Shaarli/issues/75 for examples
      *
      * @param string $searchterms search query.
-     * @param bool   $privateonly return only private links if true.
+     * @param string $visibility Optional: return only all/private/public links.
      *
      * @return array search results.
      */
-    private function filterFulltext($searchterms, $privateonly = false)
+    private function filterFulltext($searchterms, $visibility = 'all')
     {
         if (empty($searchterms)) {
-            return $this->links;
+            return $this->noFilter($visibility);
         }
 
         $filtered = array();
@@ -189,8 +195,12 @@ class LinkFilter
         foreach ($this->links as $id => $link) {
 
             // ignore non private links when 'privatonly' is on.
-            if (! $link['private'] && $privateonly === true) {
-                continue;
+            if ($visibility !== 'all') {
+                if (! $link['private'] && $visibility === 'private') {
+                    continue;
+                } else if ($link['private'] && $visibility === 'public') {
+                    continue;
+                }
             }
 
             // Concatenate link fields to search across fields.
@@ -235,16 +245,16 @@ class LinkFilter
      *
      * @param string $tags          list of tags separated by commas or blank spaces.
      * @param bool   $casesensitive ignore case if false.
-     * @param bool   $privateonly   returns private links only.
+     * @param string $visibility    Optional: return only all/private/public links.
      *
      * @return array filtered links.
      */
-    public function filterTags($tags, $casesensitive = false, $privateonly = false)
+    public function filterTags($tags, $casesensitive = false, $visibility = 'all')
     {
         // Implode if array for clean up.
         $tags = is_array($tags) ? trim(implode(' ', $tags)) : $tags;
         if (empty($tags)) {
-            return $this->links;
+            return $this->noFilter($visibility);
         }
 
         $searchtags = self::tagsStrToArray($tags, $casesensitive);
@@ -255,8 +265,12 @@ class LinkFilter
 
         foreach ($this->links as $key => $link) {
             // ignore non private links when 'privatonly' is on.
-            if (! $link['private'] && $privateonly === true) {
-                continue;
+            if ($visibility !== 'all') {
+                if (! $link['private'] && $visibility === 'private') {
+                    continue;
+                } else if ($link['private'] && $visibility === 'public') {
+                    continue;
+                }
             }
 
             $linktags = self::tagsStrToArray($link['tags'], $casesensitive);
@@ -341,7 +355,7 @@ class LinkFilter
      * @param bool   $casesensitive will convert everything to lowercase if false.
      *
      * @return array filtered tags string.
-    */
+     */
     public static function tagsStrToArray($tags, $casesensitive)
     {
         // We use UTF-8 conversion to handle various graphemes (i.e. cyrillic, or greek)
index 1c7b41cd48551375b28428480ff692432cdca55a..01b7e783f0390ce1ff42756507b12cb952791c62 100644 (file)
@@ -41,7 +41,8 @@ class Links extends ApiController
                 'searchterm' => $request->getParam('searchterm', ''),
             ],
             false,
-            $private === 'true' || $private === '1'
+            // to updated in another PR depending on the API doc
+            ($private === 'true' || $private === '1') ? 'private' : 'all'
         );
 
         // Return links from the {offset}th link, starting from 0.
index 145ea3f63a51edfda5e082cc1793ef44e30ccb2e..4f07a013420c93dfc4decd8219dce61bdea8a7e9 100644 (file)
--- a/index.php
+++ b/index.php
@@ -1630,8 +1630,8 @@ function buildLinkList($PAGE,$LINKSDB, $conf, $pluginManager)
         }
     } else {
         // Filter links according search parameters.
-        $privateonly = !empty($_SESSION['privateonly']);
-        $linksToDisplay = $LINKSDB->filterSearch($_GET, false, $privateonly);
+        $visibility = ! empty($_SESSION['privateonly']) ? 'private' : 'all';
+        $linksToDisplay = $LINKSDB->filterSearch($_GET, false, $visibility);
     }
 
     // ---- Handle paging.
index 21d680a5ae59f55532e85e45f67e7abc4e1b31f1..37d5ca306e4f128edd350e1f88542fab7880ea84 100644 (file)
@@ -12,13 +12,18 @@ class LinkFilterTest extends PHPUnit_Framework_TestCase
      */
     protected static $linkFilter;
 
+    /**
+     * @var ReferenceLinkDB instance
+     */
+    protected static $refDB;
+
     /**
      * Instanciate linkFilter with ReferenceLinkDB data.
      */
     public static function setUpBeforeClass()
     {
-        $refDB = new ReferenceLinkDB();
-        self::$linkFilter = new LinkFilter($refDB->getLinks());
+        self::$refDB = new ReferenceLinkDB();
+        self::$linkFilter = new LinkFilter(self::$refDB->getLinks());
     }
 
     /**
@@ -27,14 +32,30 @@ class LinkFilterTest extends PHPUnit_Framework_TestCase
     public function testFilter()
     {
         $this->assertEquals(
-            ReferenceLinkDB::$NB_LINKS_TOTAL,
+            self::$refDB->countLinks(),
             count(self::$linkFilter->filter('', ''))
         );
 
+        $this->assertEquals(
+            self::$refDB->countLinks(),
+            count(self::$linkFilter->filter('', '', 'all'))
+        );
+
+        $this->assertEquals(
+            self::$refDB->countLinks(),
+            count(self::$linkFilter->filter('', '', 'randomstr'))
+        );
+
         // Private only.
         $this->assertEquals(
-            2,
-            count(self::$linkFilter->filter('', '', false, true))
+            self::$refDB->countPrivateLinks(),
+            count(self::$linkFilter->filter('', '', false, 'private'))
+        );
+
+        // Public only.
+        $this->assertEquals(
+            self::$refDB->countPublicLinks(),
+            count(self::$linkFilter->filter('', '', false, 'public'))
         );
 
         $this->assertEquals(
@@ -58,10 +79,26 @@ class LinkFilterTest extends PHPUnit_Framework_TestCase
             count(self::$linkFilter->filter(LinkFilter::$FILTER_TAG, 'web', false))
         );
 
+        $this->assertEquals(
+            4,
+            count(self::$linkFilter->filter(LinkFilter::$FILTER_TAG, 'web', false, 'all'))
+        );
+
+        $this->assertEquals(
+            4,
+            count(self::$linkFilter->filter(LinkFilter::$FILTER_TAG, 'web', false, 'default-blabla'))
+        );
+
         // Private only.
         $this->assertEquals(
             1,
-            count(self::$linkFilter->filter(LinkFilter::$FILTER_TAG, 'web', false, true))
+            count(self::$linkFilter->filter(LinkFilter::$FILTER_TAG, 'web', false, 'private'))
+        );
+
+        // Public only.
+        $this->assertEquals(
+            3,
+            count(self::$linkFilter->filter(LinkFilter::$FILTER_TAG, 'web', false, 'public'))
         );
     }
 
@@ -253,14 +290,30 @@ class LinkFilterTest extends PHPUnit_Framework_TestCase
     public function testFilterFullTextTags()
     {
         $this->assertEquals(
-            2,
-            count(self::$linkFilter->filter(LinkFilter::$FILTER_TEXT, 'gnu'))
+            6,
+            count(self::$linkFilter->filter(LinkFilter::$FILTER_TEXT, 'web'))
+        );
+
+        $this->assertEquals(
+            6,
+            count(self::$linkFilter->filter(LinkFilter::$FILTER_TEXT, 'web', 'all'))
+        );
+
+        $this->assertEquals(
+            6,
+            count(self::$linkFilter->filter(LinkFilter::$FILTER_TEXT, 'web', 'bla'))
         );
 
         // Private only.
         $this->assertEquals(
             1,
-            count(self::$linkFilter->filter(LinkFilter::$FILTER_TEXT, 'web', false, true))
+            count(self::$linkFilter->filter(LinkFilter::$FILTER_TEXT, 'web', false, 'private'))
+        );
+
+        // Public only.
+        $this->assertEquals(
+            5,
+            count(self::$linkFilter->filter(LinkFilter::$FILTER_TEXT, 'web', false, 'public'))
         );
     }
 
@@ -409,7 +462,7 @@ class LinkFilterTest extends PHPUnit_Framework_TestCase
                 LinkFilter::$FILTER_TAG,
                 $hashtag,
                 false,
-                true
+                'private'
             ))
         );
     }