There is a proposal to allow users to filter files shared to circles. This commit is needed to provide the infrastucture for it. Issue: https://github.com/nextcloud/circles/issues/137 Changes to comply to https://github.com/coletivoEITA/circles/pull/2 Polishing: get files shared to circles in caldav Signed-off-by: Vinicius Cubas Brand <viniciuscb@gmail.com> Signed-off-by: Maxence Lange <maxence@artificial-owl.com> Signed-off-by: Morris Jobke <hey@morrisjobke.de>tags/v16.0.0beta1
@@ -46,6 +46,7 @@ class FilesReportPlugin extends ServerPlugin { | |||
const NS_OWNCLOUD = 'http://owncloud.org/ns'; | |||
const REPORT_NAME = '{http://owncloud.org/ns}filter-files'; | |||
const SYSTEMTAG_PROPERTYNAME = '{http://owncloud.org/ns}systemtag'; | |||
const CIRCLE_PROPERTYNAME = '{http://owncloud.org/ns}circle'; | |||
/** | |||
* Reference to main server object | |||
@@ -256,14 +257,19 @@ class FilesReportPlugin extends ServerPlugin { | |||
$ns = '{' . $this::NS_OWNCLOUD . '}'; | |||
$resultFileIds = null; | |||
$systemTagIds = []; | |||
$circlesIds = []; | |||
$favoriteFilter = null; | |||
foreach ($filterRules as $filterRule) { | |||
if ($filterRule['name'] === $ns . 'systemtag') { | |||
$systemTagIds[] = $filterRule['value']; | |||
} | |||
if ($filterRule['name'] === self::CIRCLE_PROPERTYNAME) { | |||
$circlesIds[] = $filterRule['value']; | |||
} | |||
if ($filterRule['name'] === $ns . 'favorite') { | |||
$favoriteFilter = true; | |||
} | |||
} | |||
if ($favoriteFilter !== null) { | |||
@@ -282,6 +288,15 @@ class FilesReportPlugin extends ServerPlugin { | |||
} | |||
} | |||
if (!empty($circlesIds)) { | |||
$fileIds = $this->getCirclesFileIds($circlesIds); | |||
if (empty($resultFileIds)) { | |||
$resultFileIds = $fileIds; | |||
} else { | |||
$resultFileIds = array_intersect($fileIds, $resultFileIds); | |||
} | |||
} | |||
return $resultFileIds; | |||
} | |||
@@ -328,6 +343,19 @@ class FilesReportPlugin extends ServerPlugin { | |||
return $resultFileIds; | |||
} | |||
/** | |||
* @suppress PhanUndeclaredClassMethod | |||
* @param array $circlesIds | |||
* @return array | |||
*/ | |||
private function getCirclesFileIds(array $circlesIds) { | |||
if (!\OC::$server->getAppManager()->isEnabledForUser('circles') || !class_exists('\OCA\Circles\ShareByCircleProvider')) { | |||
return array(); | |||
} | |||
return \OCA\Circles\Api\v1\Circles::getFilesForCircles($circlesIds); | |||
} | |||
/** | |||
* Prepare propfind response for the given nodes | |||
* |
@@ -45,7 +45,7 @@ use OCP\IUserManager; | |||
use OCP\IUserSession; | |||
use OCP\Share\IManager as IShareManager; | |||
use Sabre\DAV\Exception; | |||
use \Sabre\DAV\PropPatch; | |||
use Sabre\DAV\PropPatch; | |||
use Sabre\DAVACL\PrincipalBackend\BackendInterface; | |||
class Principal implements BackendInterface { | |||
@@ -145,7 +145,11 @@ class Principal implements BackendInterface { | |||
return $this->userToPrincipal($user); | |||
} | |||
} else if ($prefix === 'principals/circles') { | |||
return $this->circleToPrincipal($name); | |||
try { | |||
return $this->circleToPrincipal($name); | |||
} catch (QueryException $e) { | |||
return null; | |||
} | |||
} | |||
return null; | |||
} | |||
@@ -406,6 +410,7 @@ class Principal implements BackendInterface { | |||
/** | |||
* @param string $circleUniqueId | |||
* @return array|null | |||
* @throws \OCP\AppFramework\QueryException | |||
* @suppress PhanUndeclaredClassMethod | |||
* @suppress PhanUndeclaredClassCatch | |||
*/ | |||
@@ -438,9 +443,9 @@ class Principal implements BackendInterface { | |||
* Returns the list of circles a principal is a member of | |||
* | |||
* @param string $principal | |||
* @param bool $needGroups | |||
* @return array | |||
* @throws Exception | |||
* @throws \OCP\AppFramework\QueryException | |||
* @suppress PhanUndeclaredClassMethod | |||
*/ | |||
public function getCircleMembership($principal):array { | |||
@@ -458,13 +463,13 @@ class Principal implements BackendInterface { | |||
$circles = \OCA\Circles\Api\v1\Circles::joinedCircles($name, true); | |||
$circles = array_map(function($circle) { | |||
/** @var \OCA\Circles\Model\Circle $group */ | |||
/** @var \OCA\Circles\Model\Circle $circle */ | |||
return 'principals/circles/' . urlencode($circle->getUniqueId()); | |||
}, $circles); | |||
return $circles; | |||
} | |||
return []; | |||
} | |||
@@ -86,6 +86,10 @@ class PublicCalendarRootTest extends TestCase { | |||
->withAnyParameters() | |||
->willReturn([]); | |||
$this->principal->expects($this->any())->method('getCircleMembership') | |||
->withAnyParameters() | |||
->willReturn([]); | |||
$this->backend = new CalDavBackend( | |||
$db, | |||
$this->principal, | |||
@@ -112,6 +116,11 @@ class PublicCalendarRootTest extends TestCase { | |||
$this->principal->expects($this->any())->method('getGroupMembership') | |||
->withAnyParameters() | |||
->willReturn([]); | |||
$this->principal->expects($this->any())->method('getCircleMembership') | |||
->withAnyParameters() | |||
->willReturn([]); | |||
$books = $this->backend->getCalendarsForUser(self::UNIT_TEST_USER); | |||
foreach ($books as $book) { | |||
$this->backend->deleteCalendar($book['id']); |
@@ -503,7 +503,7 @@ | |||
/** | |||
* Fetches a flat list of files filtered by a given filter criteria. | |||
* (currently only system tags is supported) | |||
* (currently system tags and circles are supported) | |||
* | |||
* @param {Object} filter filter criteria | |||
* @param {Object} [filter.systemTagIds] list of system tag ids to filter by | |||
@@ -525,7 +525,8 @@ | |||
properties = options.properties; | |||
} | |||
if (!filter || (!filter.systemTagIds && _.isUndefined(filter.favorite))) { | |||
if (!filter || | |||
(!filter.systemTagIds && _.isUndefined(filter.favorite) && !filter.circlesIds) ) { | |||
throw 'Missing filter argument'; | |||
} | |||
@@ -551,6 +552,9 @@ | |||
_.each(filter.systemTagIds, function(systemTagIds) { | |||
body += ' <oc:systemtag>' + escapeHTML(systemTagIds) + '</oc:systemtag>\n'; | |||
}); | |||
_.each(filter.circlesIds, function(circlesIds) { | |||
body += ' <oc:circle>' + escapeHTML(circlesIds) + '</oc:circle>\n'; | |||
}); | |||
if (filter.favorite) { | |||
body += ' <oc:favorite>' + (filter.favorite ? '1': '0') + '</oc:favorite>\n'; | |||
} |