Skip to content

Commit 8ca1993

Browse files
Merge pull request #1900 from nextcloud/backport/1829/stable31
[stable31] fix: propagate group name changes
2 parents 3b9ee23 + f11afd9 commit 8ca1993

File tree

4 files changed

+91
-0
lines changed

4 files changed

+91
-0
lines changed

lib/AppInfo/Application.php

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
use OCA\Circles\Listeners\Files\PreparingShareSendMail as ListenerFilesPreparingShareSendMail;
3535
use OCA\Circles\Listeners\Files\RemovingMember as ListenerFilesRemovingMember;
3636
use OCA\Circles\Listeners\Files\ShareCreatedSendMail as ListenerFilesShareCreatedSendMail;
37+
use OCA\Circles\Listeners\GroupChanged;
3738
use OCA\Circles\Listeners\GroupCreated;
3839
use OCA\Circles\Listeners\GroupDeleted;
3940
use OCA\Circles\Listeners\GroupMemberAdded;
@@ -52,6 +53,7 @@
5253
use OCP\AppFramework\Bootstrap\IBootstrap;
5354
use OCP\AppFramework\Bootstrap\IRegistrationContext;
5455
use OCP\Files\Config\IMountProviderCollection;
56+
use OCP\Group\Events\GroupChangedEvent;
5557
use OCP\Group\Events\GroupCreatedEvent;
5658
use OCP\Group\Events\GroupDeletedEvent;
5759
use OCP\Group\Events\UserAddedEvent;
@@ -98,6 +100,7 @@ public function register(IRegistrationContext $context): void {
98100

99101
// Group Events
100102
$context->registerEventListener(GroupCreatedEvent::class, GroupCreated::class);
103+
$context->registerEventListener(GroupChangedEvent::class, GroupChanged::class);
101104
$context->registerEventListener(GroupDeletedEvent::class, GroupDeleted::class);
102105
$context->registerEventListener(UserAddedEvent::class, GroupMemberAdded::class);
103106
$context->registerEventListener(UserRemovedEvent::class, GroupMemberRemoved::class);

lib/FederatedItems/CircleEdit.php

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,11 @@ public function verify(FederatedEvent $event): void {
8888
$event->getData()->s('name', $new->getName());
8989
}
9090

91+
if ($data->hasKey('displayName')) {
92+
$new->setDisplayName($data->g('displayName'));
93+
$event->getData()->s('displayName', $new->getDisplayName());
94+
}
95+
9196
if ($data->hasKey('description')) {
9297
$new->setDescription($data->g('description'));
9398
$event->getData()->s('description', $new->getDescription());
@@ -114,6 +119,10 @@ public function manage(FederatedEvent $event): void {
114119
$circle->setName($data->g('name'));
115120
}
116121

122+
if ($data->hasKey('displayName')) {
123+
$circle->setDisplayName($data->g('displayName'));
124+
}
125+
117126
$this->circleService->confirmName($circle);
118127

119128
if ($data->hasKey('description')) {

lib/Listeners/GroupChanged.php

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
/**
6+
* SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors
7+
* SPDX-License-Identifier: AGPL-3.0-or-later
8+
*/
9+
10+
namespace OCA\Circles\Listeners;
11+
12+
use OCA\Circles\AppInfo\Application;
13+
use OCA\Circles\Db\CircleRequest;
14+
use OCA\Circles\Exceptions\CircleNotFoundException;
15+
use OCA\Circles\Model\Circle;
16+
use OCA\Circles\Model\Member;
17+
use OCA\Circles\Service\CircleService;
18+
use OCA\Circles\Service\FederatedUserService;
19+
use OCP\EventDispatcher\Event;
20+
use OCP\EventDispatcher\IEventListener;
21+
use OCP\Group\Events\GroupChangedEvent;
22+
23+
/** @template-implements IEventListener<GroupChangedEvent|Event> */
24+
class GroupChanged implements IEventListener {
25+
public function __construct(
26+
private readonly FederatedUserService $federatedUserService,
27+
private readonly CircleService $circleService,
28+
private readonly CircleRequest $circleRequest,
29+
) {
30+
}
31+
32+
public function handle(Event $event): void {
33+
if (!($event instanceof GroupChangedEvent)) {
34+
return;
35+
}
36+
37+
if ($event->getFeature() !== 'displayName') {
38+
return;
39+
}
40+
41+
$groupId = $event->getGroup()->getGID();
42+
43+
$circle = new Circle();
44+
$circle->setName('group:' . $groupId)
45+
->setConfig(Circle::CFG_SYSTEM | Circle::CFG_NO_OWNER | Circle::CFG_HIDDEN)
46+
->setSource(Member::TYPE_GROUP);
47+
48+
$owner = $this->federatedUserService->getAppInitiator(
49+
Application::APP_ID,
50+
Member::APP_CIRCLES,
51+
Application::APP_NAME
52+
);
53+
$member = new Member();
54+
$member->importFromIFederatedUser($owner);
55+
$member->setLevel(Member::LEVEL_OWNER)
56+
->setStatus(Member::STATUS_MEMBER);
57+
$circle->setOwner($member);
58+
59+
try {
60+
$this->federatedUserService->setCurrentUser($owner);
61+
$circle = $this->circleRequest->searchCircle($circle);
62+
} catch (CircleNotFoundException) {
63+
return;
64+
}
65+
66+
$this->circleService->updateDisplayName($circle->getSingleId(), $event->getValue());
67+
}
68+
}

lib/Service/CircleService.php

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -363,6 +363,17 @@ public function updateName(string $circleId, string $name): array {
363363
return $event->getOutcome();
364364
}
365365

366+
public function updateDisplayName(string $circleId, string $displayName): array {
367+
$circle = $this->getCircle($circleId);
368+
369+
$event = new FederatedEvent(CircleEdit::class);
370+
$event->setCircle($circle);
371+
$event->setParams(new SimpleDataStore(['displayName' => $displayName]));
372+
$this->federatedEventService->newEvent($event);
373+
374+
return $event->getOutcome();
375+
}
376+
366377
/**
367378
* @param string $circleId
368379
* @param string $description

0 commit comments

Comments
 (0)