*/ class RemovingMember implements IEventListener { use TStringTools; private LoggerInterface $logger; private MemberService $memberService; private ShareTokenService $shareTokenService; private ShareWrapperService $shareWrapperService; public function __construct( LoggerInterface $logger, MemberService $memberService, ShareTokenService $shareTokenService, ShareWrapperService $shareWrapperService, ) { $this->logger = $logger; $this->memberService = $memberService; $this->shareTokenService = $shareTokenService; $this->shareWrapperService = $shareWrapperService; } public function handle(Event $event): void { if (!$event instanceof RemovingCircleMemberEvent) { return; } $member = $event->getMember(); if ($member->getUserType() === Member::TYPE_CIRCLE) { $members = $member->getBasedOn()->getInheritedMembers(); } else { $members = [$member]; } $circle = $event->getCircle(); $singleIds = array_merge( [$circle->getSingleId()], array_map( function (Membership $membership) { return $membership->getCircleId(); }, $circle->getMemberships() ) ); /** @var Member[] $members */ foreach ($members as $member) { if ($member->getUserType() === Member::TYPE_MAIL || $member->getUserType() === Member::TYPE_CONTACT ) { $this->removingSharesExternalMember($member, $singleIds); continue; } if ($member->getUserType() === Member::TYPE_USER) { $this->removingSharesInternalMember($member, $singleIds); } } } /** * @param Member $member * @param string[] $singleIds */ private function removingSharesExternalMember(Member $member, array $singleIds) { foreach ($singleIds as $singleId) { try { $member->getLink($singleId); continue; } catch (MembershipNotFoundException $e) { } $this->shareTokenService->removeTokens($member->getSingleId(), $singleId); } } /** * @param Member $member * @param string[] $singleIds */ private function removingSharesInternalMember(Member $member, array $singleIds) { foreach ($singleIds as $singleId) { try { $member->getLink($singleId); continue; } catch (MembershipNotFoundException $e) { } try { $this->shareWrapperService->deleteUserSharesToCircle($singleId, $member->getUserId()); } catch (\Exception $e) { $this->logger->notice('issue while deleting user shares: ' . $e->getMessage()); } } } }