Use capped memory cache for board permissions

Signed-off-by: Julius Härtl <jus@bitgrid.net>
This commit is contained in:
Julius Härtl
2022-08-16 16:06:40 +02:00
parent c235f05340
commit 7c40172c40

View File

@@ -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();
} }
} }