1414use Exception ;
1515use OC ;
1616use OCA \Circles \AppInfo \Application ;
17+ use OCA \Circles \ConfigLexicon ;
1718use OCA \Circles \Db \AccountsRequest ;
1819use OCA \Circles \Db \CircleRequest ;
1920use OCA \Circles \Db \MemberRequest ;
5455use OCA \Circles \Tools \Traits \TDeserialize ;
5556use OCA \Circles \Tools \Traits \TNCLogger ;
5657use OCA \Circles \Tools \Traits \TStringTools ;
58+ use OCP \Config \IUserConfig ;
5759use OCP \ICache ;
5860use OCP \ICacheFactory ;
5961use OCP \IGroupManager ;
@@ -177,6 +179,7 @@ public function __construct(
177179 ContactService $ contactService ,
178180 InterfaceService $ interfaceService ,
179181 ConfigService $ configService ,
182+ private readonly IUserConfig $ userConfig ,
180183 ) {
181184 $ this ->userSession = $ userSession ;
182185 $ this ->userManager = $ userManager ;
@@ -192,7 +195,7 @@ public function __construct(
192195 $ this ->interfaceService = $ interfaceService ;
193196 $ this ->configService = $ configService ;
194197
195- $ this ->cache = $ cacheFactory ->createDistributed (self ::CACHE_SINGLE_CIRCLE );
198+ $ this ->cache = $ cacheFactory ->createLocal (self ::CACHE_SINGLE_CIRCLE );
196199
197200 if (OC ::$ CLI ) {
198201 $ this ->setInitiatedByOcc (true );
@@ -520,11 +523,44 @@ public function getLocalFederatedUser(string $userId, bool $check = true, bool $
520523
521524 $ federatedUser = new FederatedUser ();
522525 $ federatedUser ->set ($ userId , '' , Member::TYPE_USER , $ displayName );
523- $ this ->fillSingleCircleId ($ federatedUser , ($ check || $ generate ));
526+
527+ $ cached = $ this ->getCachedLocalFederatedUser ($ federatedUser );
528+ if (!$ cached ) {
529+ $ this ->fillSingleCircleId ($ federatedUser , ($ check || $ generate ));
530+ $ this ->userConfig ->setValueString ($ userId , Application::APP_ID , ConfigLexicon::USER_SINGLE_ID , $ federatedUser ->getSingleId ());
531+ }
524532
525533 return $ federatedUser ;
526534 }
527535
536+ /**
537+ * get singleId from UserConfig (already loaded from database)
538+ * and emulate FederatedUser for local accounts.
539+ */
540+ private function getCachedLocalFederatedUser (IFederatedUser $ federatedUser ): bool {
541+ if ($ federatedUser ->getUserType () !== Member::TYPE_USER ) {
542+ return false ;
543+ }
544+
545+ $ teamSingleId = $ this ->userConfig ->getValueString ($ federatedUser ->getUserId (), Application::APP_ID , ConfigLexicon::USER_SINGLE_ID );
546+ if ($ teamSingleId === '' ) {
547+ return false ;
548+ }
549+
550+ $ federatedUser ->setSingleId ($ teamSingleId );
551+ // setBasedOn() should be useless, but we want to keep backward compatibility
552+ $ federatedUser ->setBasedOn (
553+ (new Circle ())->import ([
554+ 'id ' => $ teamSingleId ,
555+ 'name ' => 'user: ' . $ federatedUser ->getUserId () . ': ' . $ teamSingleId ,
556+ 'displayName ' => $ federatedUser ->getDisplayName (),
557+ 'source ' => 1 ,
558+ 'config ' => 1 ,
559+ ])
560+ );
561+
562+ return true ;
563+ }
528564
529565 /**
530566 * Get the full FederatedUser for a local user.
0 commit comments