Use capped memory cache for board permissions
Signed-off-by: Julius Härtl <jus@bitgrid.net>
This commit is contained in:
@@ -23,7 +23,7 @@
|
|||||||
|
|
||||||
namespace OCA\Deck\Service;
|
namespace OCA\Deck\Service;
|
||||||
|
|
||||||
use OC\Cache\CappedMemoryCache;
|
use OCP\Cache\CappedMemoryCache;
|
||||||
use OCA\Circles\Model\Member;
|
use OCA\Circles\Model\Member;
|
||||||
use OCA\Deck\Db\Acl;
|
use OCA\Deck\Db\Acl;
|
||||||
use OCA\Deck\Db\AclMapper;
|
use OCA\Deck\Db\AclMapper;
|
||||||
@@ -33,7 +33,6 @@ use OCA\Deck\Db\IPermissionMapper;
|
|||||||
use OCA\Deck\Db\User;
|
use OCA\Deck\Db\User;
|
||||||
use OCA\Deck\NoPermissionException;
|
use OCA\Deck\NoPermissionException;
|
||||||
use OCP\AppFramework\Db\DoesNotExistException;
|
use OCP\AppFramework\Db\DoesNotExistException;
|
||||||
use OCP\AppFramework\Db\Entity;
|
|
||||||
use OCP\AppFramework\Db\MultipleObjectsReturnedException;
|
use OCP\AppFramework\Db\MultipleObjectsReturnedException;
|
||||||
use OCP\IConfig;
|
use OCP\IConfig;
|
||||||
use OCP\IGroupManager;
|
use OCP\IGroupManager;
|
||||||
@@ -64,7 +63,8 @@ class PermissionService {
|
|||||||
/** @var array */
|
/** @var array */
|
||||||
private $users = [];
|
private $users = [];
|
||||||
|
|
||||||
private $boardCache;
|
private CappedMemoryCache $boardCache;
|
||||||
|
private CappedMemoryCache $permissionCache;
|
||||||
|
|
||||||
public function __construct(
|
public function __construct(
|
||||||
ILogger $logger,
|
ILogger $logger,
|
||||||
@@ -88,6 +88,7 @@ class PermissionService {
|
|||||||
$this->userId = $userId;
|
$this->userId = $userId;
|
||||||
|
|
||||||
$this->boardCache = new CappedMemoryCache();
|
$this->boardCache = new CappedMemoryCache();
|
||||||
|
$this->permissionCache = new CappedMemoryCache();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -97,15 +98,21 @@ class PermissionService {
|
|||||||
* @return bool|array
|
* @return bool|array
|
||||||
*/
|
*/
|
||||||
public function getPermissions($boardId) {
|
public function getPermissions($boardId) {
|
||||||
|
if ($cached = $this->permissionCache->get($boardId)) {
|
||||||
|
return $cached;
|
||||||
|
}
|
||||||
|
|
||||||
$owner = $this->userIsBoardOwner($boardId);
|
$owner = $this->userIsBoardOwner($boardId);
|
||||||
$acls = $this->aclMapper->findAll($boardId);
|
$acls = $this->aclMapper->findAll($boardId);
|
||||||
return [
|
$permissions = [
|
||||||
Acl::PERMISSION_READ => $owner || $this->userCan($acls, Acl::PERMISSION_READ),
|
Acl::PERMISSION_READ => $owner || $this->userCan($acls, Acl::PERMISSION_READ),
|
||||||
Acl::PERMISSION_EDIT => $owner || $this->userCan($acls, Acl::PERMISSION_EDIT),
|
Acl::PERMISSION_EDIT => $owner || $this->userCan($acls, Acl::PERMISSION_EDIT),
|
||||||
Acl::PERMISSION_MANAGE => $owner || $this->userCan($acls, Acl::PERMISSION_MANAGE),
|
Acl::PERMISSION_MANAGE => $owner || $this->userCan($acls, Acl::PERMISSION_MANAGE),
|
||||||
Acl::PERMISSION_SHARE => ($owner || $this->userCan($acls, Acl::PERMISSION_SHARE))
|
Acl::PERMISSION_SHARE => ($owner || $this->userCan($acls, Acl::PERMISSION_SHARE))
|
||||||
&& (!$this->shareManager->sharingDisabledForUser($this->userId))
|
&& (!$this->shareManager->sharingDisabledForUser($this->userId))
|
||||||
];
|
];
|
||||||
|
$this->permissionCache->set($boardId, $permissions);
|
||||||
|
return $permissions;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -343,5 +350,6 @@ class PermissionService {
|
|||||||
*/
|
*/
|
||||||
public function setUserId(string $userId): void {
|
public function setUserId(string $userId): void {
|
||||||
$this->userId = $userId;
|
$this->userId = $userId;
|
||||||
|
$this->permissionCache->clear();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user