No update regarding the UI or the API for now
Fixes #758
* - searchtags: list of tags
* - searchterm: term search
* @param bool $casesensitive Optional: Perform case sensitive filter
* - 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.
*/
*
* @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']) : '';
{
// Filter link database according to parameters.
$searchtags = !empty($filterRequest['searchtags']) ? escape($filterRequest['searchtags']) : '';
}
$linkFilter = new LinkFilter($this);
}
$linkFilter = new LinkFilter($this);
- return $linkFilter->filter($type, $request, $casesensitive, $privateonly);
+ return $linkFilter->filter($type, $request, $casesensitive, $visibility);
* @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 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.
*/
*
* @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);
switch($type) {
case self::$FILTER_HASH:
return $this->filterSmallHash($request);
if (!empty($request)) {
$filtered = $this->links;
if (isset($request[0])) {
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);
}
if (isset($request[1])) {
$lf = new LinkFilter($filtered);
- $filtered = $lf->filterFulltext($request[1], $privateonly);
+ $filtered = $lf->filterFulltext($request[1], $visibility);
- return $this->noFilter($privateonly);
+ return $this->noFilter($visibility);
- return $this->filterFulltext($request, $privateonly);
+ return $this->filterFulltext($request, $visibility);
- return $this->filterTags($request, $casesensitive, $privateonly);
+ return $this->filterTags($request, $casesensitive, $visibility);
case self::$FILTER_DAY:
return $this->filterDay($request);
default:
case self::$FILTER_DAY:
return $this->filterDay($request);
default:
- return $this->noFilter($privateonly);
+ return $this->noFilter($visibility);
}
}
/**
* Unknown filter, but handle private only.
*
}
}
/**
* 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.
*/
*
* @return array filtered links.
*/
- private function noFilter($privateonly = false)
+ private function noFilter($visibility = 'all')
+ if ($visibility === 'all') {
return $this->links;
}
$out = array();
foreach ($this->links as $key => $value) {
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') {
* - see https://github.com/shaarli/Shaarli/issues/75 for examples
*
* @param string $searchterms search query.
* - 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.
*/
*
* @return array search results.
*/
- private function filterFulltext($searchterms, $privateonly = false)
+ private function filterFulltext($searchterms, $visibility = 'all')
{
if (empty($searchterms)) {
{
if (empty($searchterms)) {
+ return $this->noFilter($visibility);
foreach ($this->links as $id => $link) {
// ignore non private links when 'privatonly' is on.
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.
}
// Concatenate link fields to search across fields.
*
* @param string $tags list of tags separated by commas or blank spaces.
* @param bool $casesensitive ignore case if false.
*
* @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.
*/
*
* @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)) {
{
// Implode if array for clean up.
$tags = is_array($tags) ? trim(implode(' ', $tags)) : $tags;
if (empty($tags)) {
+ return $this->noFilter($visibility);
}
$searchtags = self::tagsStrToArray($tags, $casesensitive);
}
$searchtags = self::tagsStrToArray($tags, $casesensitive);
foreach ($this->links as $key => $link) {
// ignore non private links when 'privatonly' is on.
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);
}
$linktags = self::tagsStrToArray($link['tags'], $casesensitive);
* @param bool $casesensitive will convert everything to lowercase if false.
*
* @return array filtered tags string.
* @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)
public static function tagsStrToArray($tags, $casesensitive)
{
// We use UTF-8 conversion to handle various graphemes (i.e. cyrillic, or greek)
'searchterm' => $request->getParam('searchterm', ''),
],
false,
'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.
);
// Return links from the {offset}th link, starting from 0.
}
} else {
// Filter links according search parameters.
}
} 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);
*/
protected static $linkFilter;
*/
protected static $linkFilter;
+ /**
+ * @var ReferenceLinkDB instance
+ */
+ protected static $refDB;
+
/**
* Instanciate linkFilter with ReferenceLinkDB data.
*/
public static function setUpBeforeClass()
{
/**
* 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());
public function testFilter()
{
$this->assertEquals(
public function testFilter()
{
$this->assertEquals(
- ReferenceLinkDB::$NB_LINKS_TOTAL,
+ self::$refDB->countLinks(),
count(self::$linkFilter->filter('', ''))
);
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(
// 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'))
count(self::$linkFilter->filter(LinkFilter::$FILTER_TAG, 'web', false))
);
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,
// 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'))
public function testFilterFullTextTags()
{
$this->assertEquals(
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,
);
// 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'))
LinkFilter::$FILTER_TAG,
$hashtag,
false,
LinkFilter::$FILTER_TAG,
$hashtag,
false,