Skip to content

Commit 7e35d86

Browse files
authored
Merge pull request #1830 from nextcloud/revert-1745-fix/noid/remove-caching-for-shares
Revert "remove caching for shares"
2 parents 30cd96e + cacd06a commit 7e35d86

2 files changed

Lines changed: 56 additions & 4 deletions

File tree

lib/Service/MembershipService.php

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -330,6 +330,9 @@ function (Membership $membership): string {
330330
if (!in_array($item->getCircleId(), $circleIds)) {
331331
$deprecated[] = $item;
332332
$this->membershipRequest->delete($item);
333+
334+
// clearing the getSharedWith() cache for singleId related to the membership
335+
$this->shareWrapperService->clearCache($item->getSingleId());
333336
}
334337
}
335338

@@ -359,6 +362,9 @@ private function createNewMemberships(array $memberships, array $known): array {
359362
$this->membershipRequest->insert($membership);
360363
$new[] = $membership;
361364
}
365+
366+
// clearing the getSharedWith() cache for singleId related to the membership
367+
$this->shareWrapperService->clearCache($membership->getSingleId());
362368
}
363369

364370
return $new;

lib/Service/ShareWrapperService.php

Lines changed: 50 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,13 @@
1818
use OCA\Circles\Model\FederatedUser;
1919
use OCA\Circles\Model\Probes\CircleProbe;
2020
use OCA\Circles\Model\ShareWrapper;
21+
use OCA\Circles\Tools\Exceptions\InvalidItemException;
2122
use OCA\Circles\Tools\Traits\TDeserialize;
2223
use OCA\Circles\Tools\Traits\TStringTools;
2324
use OCP\Files\Folder;
2425
use OCP\Files\NotFoundException;
26+
use OCP\ICache;
27+
use OCP\ICacheFactory;
2528
use OCP\Share\IShare;
2629

2730
/**
@@ -33,9 +36,26 @@ class ShareWrapperService {
3336
use TStringTools;
3437
use TDeserialize;
3538

36-
public function __construct(
37-
private ShareWrapperRequest $shareWrapperRequest,
38-
) {
39+
public const CACHE_SHARED_WITH = 'circles/getSharedWith';
40+
public const CACHE_SHARED_WITH_TTL = 900;
41+
42+
43+
/** @var ShareWrapperRequest */
44+
private $shareWrapperRequest;
45+
46+
private ICache $cache;
47+
48+
49+
/**
50+
* ShareWrapperService constructor.
51+
*
52+
* @param ICacheFactory $cacheFactory
53+
* @param ShareWrapperRequest $shareWrapperRequest
54+
*/
55+
public function __construct(ICacheFactory $cacheFactory, ShareWrapperRequest $shareWrapperRequest) {
56+
$this->cache = $cacheFactory->createDistributed(self::CACHE_SHARED_WITH);
57+
58+
$this->shareWrapperRequest = $shareWrapperRequest;
3959
}
4060

4161

@@ -58,6 +78,7 @@ public function searchShare(string $singleId, int $nodeId): ShareWrapper {
5878
* @throws NotFoundException
5979
*/
6080
public function save(IShare $share): void {
81+
$this->cache->clear('');
6182
$this->shareWrapperRequest->save($share);
6283
}
6384

@@ -66,6 +87,7 @@ public function save(IShare $share): void {
6687
* @param ShareWrapper $shareWrapper
6788
*/
6889
public function update(ShareWrapper $shareWrapper): void {
90+
$this->cache->clear('');
6991
$this->shareWrapperRequest->update($shareWrapper);
7092
}
7193

@@ -74,6 +96,7 @@ public function update(ShareWrapper $shareWrapper): void {
7496
* @param ShareWrapper $shareWrapper
7597
*/
7698
public function delete(ShareWrapper $shareWrapper): void {
99+
$this->cache->clear('');
77100
$this->shareWrapperRequest->delete((int)$shareWrapper->getId());
78101
}
79102

@@ -88,6 +111,7 @@ public function deleteUserSharesToCircle(string $circleId, string $userId): void
88111
throw new Exception('$initiator cannot be empty');
89112
}
90113

114+
$this->cache->clear('');
91115
$this->shareWrapperRequest->deleteSharesToCircle($circleId, $userId);
92116
}
93117

@@ -96,6 +120,7 @@ public function deleteUserSharesToCircle(string $circleId, string $userId): void
96120
* @param string $circleId
97121
*/
98122
public function deleteAllSharesToCircle(string $circleId): void {
123+
$this->cache->clear('');
99124
$this->shareWrapperRequest->deleteSharesToCircle($circleId, '');
100125
}
101126

@@ -185,7 +210,22 @@ public function getSharedWith(
185210
int $nodeId,
186211
?CircleProbe $probe,
187212
): array {
188-
return $this->shareWrapperRequest->getSharedWith($federatedUser, $nodeId, $probe);
213+
$key = $this->generateSharedWithCacheKey($federatedUser, $nodeId, $probe->getChecksum());
214+
215+
$cachedData = $this->cache->get($key);
216+
try {
217+
if (!is_string($cachedData)) {
218+
throw new InvalidItemException();
219+
}
220+
221+
return $this->deserializeList($cachedData, ShareWrapper::class);
222+
} catch (InvalidItemException $e) {
223+
}
224+
225+
$shares = $this->shareWrapperRequest->getSharedWith($federatedUser, $nodeId, $probe);
226+
$this->cache->set($key, json_encode($shares), self::CACHE_SHARED_WITH_TTL);
227+
228+
return $shares;
189229
}
190230

191231

@@ -249,6 +289,11 @@ public function getChild(IShare $share, FederatedUser $federatedUser): ShareWrap
249289
}
250290

251291

292+
public function clearCache(string $singleId): void {
293+
$this->cache->clear($singleId);
294+
}
295+
296+
252297
/**
253298
* @param FederatedUser $federatedUser
254299
* @param IShare $share
@@ -259,6 +304,7 @@ public function getChild(IShare $share, FederatedUser $federatedUser): ShareWrap
259304
* @throws RequestBuilderException
260305
*/
261306
private function createChild(IShare $share, FederatedUser $federatedUser): ShareWrapper {
307+
$this->cache->clear('');
262308
$share->setSharedWith($federatedUser->getSingleId());
263309
$childId = $this->shareWrapperRequest->save($share, (int)$share->getId());
264310

0 commit comments

Comments
 (0)