5555use OCA \Circles \Exceptions \RequestBuilderException ;
5656use OCA \Circles \Exceptions \SingleCircleNotFoundException ;
5757use OCA \Circles \Exceptions \UnknownRemoteException ;
58+ use OCA \Circles \FederatedItems \MemberRemove ;
5859use OCA \Circles \FederatedItems \SingleMemberAdd ;
5960use OCA \Circles \Model \Circle ;
6061use OCA \Circles \Model \Federated \FederatedEvent ;
6364use OCA \Circles \Model \Member ;
6465use OCP \IGroupManager ;
6566use OCP \IUserManager ;
67+ use OCP \Share \IManager ;
6668
6769/**
6870 * Class SyncService
@@ -89,6 +91,8 @@ class SyncService {
8991 /** @var IGroupManager */
9092 private $ groupManager ;
9193
94+ /** @var IManager */
95+ private $ shareManager ;
9296
9397 /** @var CircleRequest */
9498 private $ circleRequest ;
@@ -99,6 +103,9 @@ class SyncService {
99103 /** @var FederatedUserService */
100104 private $ federatedUserService ;
101105
106+ /** @var MemberService */
107+ private $ memberService ;
108+
102109 /** @var federatedEventService */
103110 private $ federatedEventService ;
104111
@@ -120,6 +127,7 @@ class SyncService {
120127 *
121128 * @param IUserManager $userManager
122129 * @param IGroupManager $groupManager
130+ * @param IManager $shareManager
123131 * @param CircleRequest $circleRequest
124132 * @param MemberRequest $memberRequest
125133 * @param FederatedUserService $federatedUserService
@@ -132,8 +140,10 @@ class SyncService {
132140 public function __construct (
133141 IUserManager $ userManager ,
134142 IGroupManager $ groupManager ,
143+ IManager $ shareManager ,
135144 CircleRequest $ circleRequest ,
136145 MemberRequest $ memberRequest ,
146+ MemberService $ memberService ,
137147 FederatedUserService $ federatedUserService ,
138148 federatedEventService $ federatedEventService ,
139149 CircleService $ circleService ,
@@ -143,8 +153,10 @@ public function __construct(
143153 ) {
144154 $ this ->userManager = $ userManager ;
145155 $ this ->groupManager = $ groupManager ;
156+ $ this ->shareManager = $ shareManager ;
146157 $ this ->circleRequest = $ circleRequest ;
147158 $ this ->memberRequest = $ memberRequest ;
159+ $ this ->memberService = $ memberService ;
148160 $ this ->federatedUserService = $ federatedUserService ;
149161 $ this ->federatedEventService = $ federatedEventService ;
150162 $ this ->circleService = $ circleService ;
@@ -299,6 +311,7 @@ public function syncNextcloudGroup(string $groupId): Circle {
299311 $ event = new FederatedEvent (SingleMemberAdd::class);
300312 $ event ->setCircle ($ circle );
301313 $ event ->setMember ($ member );
314+ $ event ->getParams ()->sBool ('force_group_member ' , true );
302315
303316 try {
304317 $ this ->federatedEventService ->newEvent ($ event );
@@ -451,6 +464,7 @@ public function groupMemberAdded(string $groupId, string $userId): void {
451464 $ event = new FederatedEvent (SingleMemberAdd::class);
452465 $ event ->setCircle ($ circle );
453466 $ event ->setMember ($ member );
467+ $ event ->getParams ()->sBool ('force_group_member ' , true );
454468 $ this ->federatedEventService ->newEvent ($ event );
455469
456470// $this->memberRequest->insertOrUpdate($member);
@@ -482,8 +496,41 @@ public function groupMemberRemoved(string $groupId, string $userId): void {
482496 $ circle = $ this ->federatedUserService ->getGroupCircle ($ groupId );
483497 $ federatedUser = $ this ->federatedUserService ->getLocalFederatedUser ($ userId );
484498
485- $ this ->memberRequest ->deleteFederatedUserFromCircle ($ federatedUser , $ circle );
486- $ this ->membershipService ->onUpdate ($ federatedUser ->getSingleId ());
499+ $ member = $ this ->memberRequest ->getMember ($ circle ->getSingleId (), $ federatedUser ->getSingleId ());
500+ $ event = new FederatedEvent (MemberRemove::class);
501+ $ event ->setCircle ($ member ->getCircle ());
502+ $ event ->setMember ($ member );
503+
504+ $ this ->maintainGroupMemberOnly ($ federatedUser );
505+ }
506+
507+
508+ /**
509+ * in case of limitation shareGroupMembersOnly, clean membership on existing Circles related to
510+ * the removed group member.
511+ *
512+ * @param FederatedUser $federatedUser
513+ *
514+ * @throws RequestBuilderException
515+ */
516+ private function maintainGroupMemberOnly (FederatedUser $ federatedUser ): void {
517+ if (!$ this ->shareManager ->shareWithGroupMembersOnly ()) {
518+ return ;
519+ }
520+
521+ foreach ($ federatedUser ->getMemberships () as $ membership ) {
522+ try {
523+ $ circle = $ this ->circleRequest ->getCircle ($ membership ->getCircleId ());
524+ } catch (CircleNotFoundException $ e ) {
525+ continue ;
526+ }
527+
528+ if (!$ this ->membershipService ->limitToGroupMembersOnly ($ federatedUser , $ circle )) {
529+ continue ;
530+ }
531+
532+ echo 'NO NON ' . json_encode ($ circle ) . "\n" ;
533+ }
487534 }
488535
489536
0 commit comments