diff --git a/lib/AppInfo/Application.php b/lib/AppInfo/Application.php index b8b539f90..58cf03421 100644 --- a/lib/AppInfo/Application.php +++ b/lib/AppInfo/Application.php @@ -33,6 +33,7 @@ use OCA\Circles\Listeners\Files\PreparingShareSendMail as ListenerFilesPreparingShareSendMail; use OCA\Circles\Listeners\Files\RemovingMember as ListenerFilesRemovingMember; use OCA\Circles\Listeners\Files\ShareCreatedSendMail as ListenerFilesShareCreatedSendMail; +use OCA\Circles\Listeners\GroupChanged; use OCA\Circles\Listeners\GroupCreated; use OCA\Circles\Listeners\GroupDeleted; use OCA\Circles\Listeners\GroupMemberAdded; @@ -50,6 +51,7 @@ use OCP\AppFramework\Bootstrap\IBootstrap; use OCP\AppFramework\Bootstrap\IRegistrationContext; use OCP\Files\Config\IMountProviderCollection; +use OCP\Group\Events\GroupChangedEvent; use OCP\Group\Events\GroupCreatedEvent; use OCP\Group\Events\GroupDeletedEvent; use OCP\Group\Events\UserAddedEvent; @@ -96,6 +98,7 @@ public function register(IRegistrationContext $context): void { // Group Events $context->registerEventListener(GroupCreatedEvent::class, GroupCreated::class); + $context->registerEventListener(GroupChangedEvent::class, GroupChanged::class); $context->registerEventListener(GroupDeletedEvent::class, GroupDeleted::class); $context->registerEventListener(UserAddedEvent::class, GroupMemberAdded::class); $context->registerEventListener(UserRemovedEvent::class, GroupMemberRemoved::class); diff --git a/lib/FederatedItems/CircleEdit.php b/lib/FederatedItems/CircleEdit.php index 7c963b786..6553e3799 100644 --- a/lib/FederatedItems/CircleEdit.php +++ b/lib/FederatedItems/CircleEdit.php @@ -88,6 +88,11 @@ public function verify(FederatedEvent $event): void { $event->getData()->s('name', $new->getName()); } + if ($data->hasKey('displayName')) { + $new->setDisplayName($data->g('displayName')); + $event->getData()->s('displayName', $new->getDisplayName()); + } + if ($data->hasKey('description')) { $new->setDescription($data->g('description')); $event->getData()->s('description', $new->getDescription()); @@ -114,6 +119,10 @@ public function manage(FederatedEvent $event): void { $circle->setName($data->g('name')); } + if ($data->hasKey('displayName')) { + $circle->setDisplayName($data->g('displayName')); + } + $this->circleService->confirmName($circle); if ($data->hasKey('description')) { diff --git a/lib/Listeners/GroupChanged.php b/lib/Listeners/GroupChanged.php new file mode 100644 index 000000000..a3cd5c30b --- /dev/null +++ b/lib/Listeners/GroupChanged.php @@ -0,0 +1,68 @@ + */ +class GroupChanged implements IEventListener { + public function __construct( + private readonly FederatedUserService $federatedUserService, + private readonly CircleService $circleService, + private readonly CircleRequest $circleRequest, + ) { + } + + public function handle(Event $event): void { + if (!($event instanceof GroupChangedEvent)) { + return; + } + + if ($event->getFeature() !== 'displayName') { + return; + } + + $groupId = $event->getGroup()->getGID(); + + $circle = new Circle(); + $circle->setName('group:' . $groupId) + ->setConfig(Circle::CFG_SYSTEM | Circle::CFG_NO_OWNER | Circle::CFG_HIDDEN) + ->setSource(Member::TYPE_GROUP); + + $owner = $this->federatedUserService->getAppInitiator( + Application::APP_ID, + Member::APP_CIRCLES, + Application::APP_NAME + ); + $member = new Member(); + $member->importFromIFederatedUser($owner); + $member->setLevel(Member::LEVEL_OWNER) + ->setStatus(Member::STATUS_MEMBER); + $circle->setOwner($member); + + try { + $this->federatedUserService->setCurrentUser($owner); + $circle = $this->circleRequest->searchCircle($circle); + } catch (CircleNotFoundException) { + return; + } + + $this->circleService->updateDisplayName($circle->getSingleId(), $event->getValue()); + } +} diff --git a/lib/Service/CircleService.php b/lib/Service/CircleService.php index a0a40f00c..1854262f4 100644 --- a/lib/Service/CircleService.php +++ b/lib/Service/CircleService.php @@ -363,6 +363,17 @@ public function updateName(string $circleId, string $name): array { return $event->getOutcome(); } + public function updateDisplayName(string $circleId, string $displayName): array { + $circle = $this->getCircle($circleId); + + $event = new FederatedEvent(CircleEdit::class); + $event->setCircle($circle); + $event->setParams(new SimpleDataStore(['displayName' => $displayName])); + $this->federatedEventService->newEvent($event); + + return $event->getOutcome(); + } + /** * @param string $circleId * @param string $description