1818use OCA \Circles \Model \FederatedUser ;
1919use OCA \Circles \Model \Probes \CircleProbe ;
2020use OCA \Circles \Model \ShareWrapper ;
21+ use OCA \Circles \Tools \Exceptions \InvalidItemException ;
2122use OCA \Circles \Tools \Traits \TDeserialize ;
2223use OCA \Circles \Tools \Traits \TStringTools ;
2324use OCP \Files \Folder ;
2425use OCP \Files \NotFoundException ;
26+ use OCP \ICache ;
27+ use OCP \ICacheFactory ;
2528use 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