1717use OCA \Circles \Model \Probes \DataProbe ;
1818use OCP \App \IAppManager ;
1919use OCP \Server ;
20+ use Psr \Log \LoggerInterface ;
2021use Throwable ;
2122
2223/**
@@ -30,7 +31,7 @@ class CirclesService {
3031 /** @var array<string, string[]> */
3132 private array $ userCirclesCache = [];
3233
33- public function __construct (IAppManager $ appManager ) {
34+ public function __construct (IAppManager $ appManager, private ? LoggerInterface $ logger = null ) {
3435 $ this ->circlesEnabled = $ appManager ->isEnabledForUser ('circles ' );
3536 }
3637
@@ -44,14 +45,21 @@ public function getCircle(string $circleId): ?Circle {
4445 }
4546
4647 try {
47-
4848 // Enforce current user condition since we always want the full list of members
49- $ circlesManager = Server:: get (CirclesManager::class );
49+ $ circlesManager = $ this -> getCirclesManager ( );
5050 $ circlesManager ->startSuperSession ();
51- $ dataProbe = new DataProbe ();
52- $ dataProbe ->add (DataProbe::OWNER );
53- return $ circlesManager ->probeCircle ($ circleId , null , $ dataProbe );
51+ try {
52+ $ dataProbe = new DataProbe ();
53+ $ dataProbe ->add (DataProbe::OWNER );
54+ return $ circlesManager ->probeCircle ($ circleId , null , $ dataProbe );
55+ } finally {
56+ $ this ->stopSessionSafely ($ circlesManager , 'getCircle ' );
57+ }
5458 } catch (Throwable $ e ) {
59+ $ this ->logger ?->debug('CirclesService::getCircle failed ' , [
60+ 'circleId ' => $ circleId ,
61+ 'exception ' => $ e ,
62+ ]);
5563 }
5664 return null ;
5765 }
@@ -66,14 +74,18 @@ public function isUserInCircle(string $circleId, string $userId): bool {
6674 }
6775
6876 try {
69- $ circlesManager = Server:: get (CirclesManager::class );
77+ $ circlesManager = $ this -> getCirclesManager ( );
7078 $ federatedUser = $ circlesManager ->getFederatedUser ($ userId , Member::TYPE_USER );
7179 $ circlesManager ->startSession ($ federatedUser );
72- $ dataProbe = new DataProbe ();
73- $ dataProbe ->add (DataProbe::INITIATOR );
74- $ circle = $ circlesManager ->probeCircle ($ circleId , null , $ dataProbe );
75- $ member = $ circle ->getInitiator ();
76- $ isUserInCircle = $ member ->getLevel () >= Member::LEVEL_MEMBER ;
80+ try {
81+ $ dataProbe = new DataProbe ();
82+ $ dataProbe ->add (DataProbe::INITIATOR );
83+ $ circle = $ circlesManager ->probeCircle ($ circleId , null , $ dataProbe );
84+ $ member = $ circle ->getInitiator ();
85+ $ isUserInCircle = $ member ->getLevel () >= Member::LEVEL_MEMBER ;
86+ } finally {
87+ $ this ->stopSessionSafely ($ circlesManager , 'isUserInCircle ' );
88+ }
7789
7890 if (!isset ($ this ->userCircleCache [$ circleId ])) {
7991 $ this ->userCircleCache [$ circleId ] = [];
@@ -82,6 +94,11 @@ public function isUserInCircle(string $circleId, string $userId): bool {
8294
8395 return $ isUserInCircle ;
8496 } catch (Throwable $ e ) {
97+ $ this ->logger ?->debug('CirclesService::isUserInCircle failed ' , [
98+ 'circleId ' => $ circleId ,
99+ 'userId ' => $ userId ,
100+ 'exception ' => $ e ,
101+ ]);
85102 }
86103 return false ;
87104 }
@@ -100,18 +117,87 @@ public function getUserCircles(string $userId): array {
100117 }
101118
102119 try {
103- $ circlesManager = Server:: get (CirclesManager::class );
120+ $ circlesManager = $ this -> getCirclesManager ( );
104121 $ federatedUser = $ circlesManager ->getFederatedUser ($ userId , Member::TYPE_USER );
105122 $ circlesManager ->startSession ($ federatedUser );
106- $ probe = new CircleProbe ();
107- $ probe ->mustBeMember ();
108- $ circles = array_map (function (Circle $ circle ) {
109- return $ circle ->getSingleId ();
110- }, $ circlesManager ->probeCircles ($ probe ));
123+ try {
124+ $ probe = new CircleProbe ();
125+ $ probe ->mustBeMember ();
126+ $ circles = array_map (function (Circle $ circle ) {
127+ return $ circle ->getSingleId ();
128+ }, $ circlesManager ->probeCircles ($ probe ));
129+ } finally {
130+ $ this ->stopSessionSafely ($ circlesManager , 'getUserCircles ' );
131+ }
111132 $ this ->userCirclesCache [$ userId ] = $ circles ;
112133 return $ circles ;
113134 } catch (Throwable $ e ) {
135+ $ this ->logger ?->debug('CirclesService::getUserCircles failed ' , [
136+ 'userId ' => $ userId ,
137+ 'exception ' => $ e ,
138+ ]);
114139 }
115140 return [];
116141 }
142+
143+ public function clearUserCircleCache (?string $ circleId = null , ?string $ userId = null ): void {
144+ if ($ circleId === null && $ userId === null ) {
145+ $ this ->userCircleCache = [];
146+ return ;
147+ }
148+
149+ if ($ circleId !== null && $ userId === null ) {
150+ unset($ this ->userCircleCache [$ circleId ]);
151+ return ;
152+ }
153+
154+ if ($ circleId !== null && $ userId !== null ) {
155+ unset($ this ->userCircleCache [$ circleId ][$ userId ]);
156+ if (empty ($ this ->userCircleCache [$ circleId ])) {
157+ unset($ this ->userCircleCache [$ circleId ]);
158+ }
159+ return ;
160+ }
161+
162+ foreach ($ this ->userCircleCache as $ cachedCircleId => $ users ) {
163+ unset($ users [$ userId ]);
164+ if (empty ($ users )) {
165+ unset($ this ->userCircleCache [$ cachedCircleId ]);
166+ continue ;
167+ }
168+ $ this ->userCircleCache [$ cachedCircleId ] = $ users ;
169+ }
170+ }
171+
172+ public function clearUserCirclesCache (?string $ userId = null ): void {
173+ if ($ userId === null ) {
174+ $ this ->userCirclesCache = [];
175+ return ;
176+ }
177+
178+ unset($ this ->userCirclesCache [$ userId ]);
179+ }
180+
181+ public function clearAllCaches (): void {
182+ $ this ->clearUserCircleCache ();
183+ $ this ->clearUserCirclesCache ();
184+ }
185+
186+ protected function getCirclesManager (): CirclesManager {
187+ return Server::get (CirclesManager::class);
188+ }
189+
190+ private function stopSessionSafely (CirclesManager $ circlesManager , string $ method ): void {
191+ if (!method_exists ($ circlesManager , 'stopSession ' )) {
192+ return ;
193+ }
194+
195+ try {
196+ $ circlesManager ->stopSession ();
197+ } catch (Throwable $ e ) {
198+ $ this ->logger ?->debug('CirclesService:: ' . $ method . ' stopSession failed ' , [
199+ 'exception ' => $ e ,
200+ ]);
201+ }
202+ }
117203}
0 commit comments