Skip to content

Commit 4e7163e

Browse files
Merge pull request #14358 from nextcloud/backport/14354/stable31
[stable31] fix(teams): Track team name updates
2 parents c8fb510 + b345238 commit 4e7163e

File tree

5 files changed

+127
-11
lines changed

5 files changed

+127
-11
lines changed

lib/AppInfo/Application.php

+5
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@
1010

1111
use OCA\Circles\Events\AddingCircleMemberEvent;
1212
use OCA\Circles\Events\CircleDestroyedEvent;
13+
use OCA\Circles\Events\CircleEditedEvent;
14+
use OCA\Circles\Events\EditingCircleEvent;
1315
use OCA\Circles\Events\RemovingCircleMemberEvent;
1416
use OCA\Files\Event\LoadSidebar;
1517
use OCA\Files_Sharing\Event\BeforeTemplateRenderedEvent;
@@ -82,6 +84,7 @@
8284
use OCA\Talk\Listener\BeforeUserLoggedOutListener;
8385
use OCA\Talk\Listener\BotListener;
8486
use OCA\Talk\Listener\CircleDeletedListener;
87+
use OCA\Talk\Listener\CircleEditedListener;
8588
use OCA\Talk\Listener\CircleMembershipListener;
8689
use OCA\Talk\Listener\CSPListener;
8790
use OCA\Talk\Listener\DisplayNameListener;
@@ -258,6 +261,8 @@ public function register(IRegistrationContext $context): void {
258261
$context->registerEventListener(UserAddedEvent::class, GroupMembershipListener::class);
259262
$context->registerEventListener(UserRemovedEvent::class, GroupMembershipListener::class);
260263
$context->registerEventListener(CircleDestroyedEvent::class, CircleDeletedListener::class);
264+
$context->registerEventListener(EditingCircleEvent::class, CircleEditedListener::class);
265+
$context->registerEventListener(CircleEditedEvent::class, CircleEditedListener::class);
261266
$context->registerEventListener(AddingCircleMemberEvent::class, CircleMembershipListener::class);
262267
$context->registerEventListener(RemovingCircleMemberEvent::class, CircleMembershipListener::class);
263268

lib/Listener/CircleEditedListener.php

+48
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
/**
5+
* SPDX-FileCopyrightText: 2025 Nextcloud GmbH and Nextcloud contributors
6+
* SPDX-License-Identifier: AGPL-3.0-or-later
7+
*/
8+
9+
namespace OCA\Talk\Listener;
10+
11+
use OCA\Circles\Events\CircleEditedEvent;
12+
use OCA\Circles\Events\EditingCircleEvent;
13+
use OCA\Talk\Model\Attendee;
14+
use OCA\Talk\Service\ParticipantService;
15+
use OCP\EventDispatcher\Event;
16+
use OCP\EventDispatcher\IEventListener;
17+
18+
/**
19+
* @template-implements IEventListener<Event>
20+
*/
21+
class CircleEditedListener implements IEventListener {
22+
23+
public function __construct(
24+
readonly private ParticipantService $participantService,
25+
) {
26+
}
27+
28+
public function handle(Event $event): void {
29+
if (!$event instanceof EditingCircleEvent && !$event instanceof CircleEditedEvent) {
30+
// Unrelated
31+
return;
32+
}
33+
34+
$displayName = $event->getCircle()->getDisplayName();
35+
if ($event instanceof EditingCircleEvent) {
36+
// In the before event we need to cheat to get the name
37+
if ($event->getFederatedEvent()?->getData()?->hasKey('name')) {
38+
$displayName = $event->getFederatedEvent()->getData()->g('name');
39+
}
40+
}
41+
42+
$this->participantService->updateDisplayNameForActor(
43+
Attendee::ACTOR_CIRCLES,
44+
$event->getCircle()->getSingleId(),
45+
$displayName,
46+
);
47+
}
48+
}

tests/integration/features/bootstrap/FeatureContext.php

+41-11
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,8 @@ class FeatureContext implements Context, SnippetAcceptingContext {
6565
protected static array $modifiedSince;
6666
/** @var array */
6767
protected static array $createdTeams = [];
68+
/** @var array */
69+
protected static array $renamedTeams = [];
6870
/** @var array<string, int> */
6971
protected static array $userToBanId;
7072

@@ -128,7 +130,7 @@ public static function getTokenForIdentifier(string $identifier) {
128130
}
129131

130132
public static function getTeamIdForLabel(string $server, string $label): string {
131-
return self::$createdTeams[$server][$label] ?? throw new \RuntimeException('Unknown team: ' . $label);
133+
return self::$createdTeams[$server][$label] ?? self::$renamedTeams[$server][$label] ?? throw new \RuntimeException('Unknown team: ' . $label);
132134
}
133135

134136
public static function getMessageIdForText(string $text): int {
@@ -220,6 +222,7 @@ public function setUp(BeforeScenarioScope $scope) {
220222
$this->createdUsers[$server] = [];
221223
$this->createdGroups[$server] = [];
222224
self::$createdTeams[$server] = [];
225+
self::$renamedTeams[$server] = [];
223226
$this->createdGuestAccountUsers[$server] = [];
224227
}
225228

@@ -246,15 +249,15 @@ public function tearDown() {
246249
foreach (['LOCAL', 'REMOTE'] as $server) {
247250
$this->usingServer($server);
248251

252+
foreach (self::$createdTeams[$server] as $team => $id) {
253+
$this->deleteTeam($team);
254+
}
249255
foreach ($this->createdUsers[$server] as $user) {
250256
$this->deleteUser($user);
251257
}
252258
foreach ($this->createdGroups[$server] as $group) {
253259
$this->deleteGroup($group);
254260
}
255-
foreach (self::$createdTeams[$server] as $team => $id) {
256-
$this->deleteTeam($team);
257-
}
258261
foreach ($this->createdGuestAccountUsers[$server] as $user) {
259262
$this->deleteGuestUser($user);
260263
}
@@ -914,6 +917,10 @@ protected function assertAttendeeList(string $identifier, ?TableNode $formData,
914917
$attendee['actorId'] .= '@' . rtrim($this->localRemoteServerUrl, '/');
915918
}
916919

920+
if (isset($attendee['actorId']) && preg_match('/TEAM_ID\(([^)]+)\)/', $attendee['actorId'], $matches)) {
921+
$attendee['actorId'] = self::getTeamIdForLabel($this->currentServer, $matches[1]);
922+
}
923+
917924
if (isset($attendee['sessionIds']) && str_contains($attendee['sessionIds'], '@{$LOCAL_URL}')) {
918925
$attendee['sessionIds'] = str_replace('{$LOCAL_URL}', rtrim($this->localServerUrl, '/'), $attendee['sessionIds']);
919926
}
@@ -1973,7 +1980,7 @@ public function userChangesListableScopeOfTheRoom(string $user, string $identifi
19731980
}
19741981

19751982
/**
1976-
* @Then /^user "([^"]*)" adds (user|group|email|circle|federated_user|phone|team) "([^"]*)" to room "([^"]*)" with (\d+) \((v4)\)$/
1983+
* @Then /^user "([^"]*)" adds (user|group|email|federated_user|phone|team) "([^"]*)" to room "([^"]*)" with (\d+) \((v4)\)$/
19771984
*
19781985
* @param string $user
19791986
* @param string $newType
@@ -1993,8 +2000,8 @@ public function userAddAttendeeToRoom(string $user, string $newType, string $new
19932000
}
19942001
}
19952002

1996-
if ($newType === 'circle' || $newType === 'team') {
1997-
$newId = self::$createdTeams[$this->currentServer][$newId];
2003+
if ($newType === 'team') {
2004+
$newId = self::getTeamIdForLabel($this->currentServer, $newId);
19982005
}
19992006

20002007
$this->sendRequest(
@@ -2319,7 +2326,7 @@ public function userSendsMessageToRoom(string $user, string $sendingMode, string
23192326
if (str_contains($message, '@"TEAM_ID(')) {
23202327
$result = preg_match('/TEAM_ID\(([^)]+)\)/', $message, $matches);
23212328
if ($result) {
2322-
$message = str_replace($matches[0], 'team/' . self::$createdTeams[$this->currentServer][$matches[1]], $message);
2329+
$message = str_replace($matches[0], 'team/' . self::getTeamIdForLabel($this->currentServer, $matches[1]), $message);
23232330
}
23242331
}
23252332

@@ -3570,7 +3577,7 @@ public function userGetsTheFollowingCollaboratorSuggestions($user, $identifier,
35703577
$expected = array_map(function (array $mention): array {
35713578
$result = preg_match('/TEAM_ID\(([^)]+)\)/', $mention['id'], $matches);
35723579
if ($result) {
3573-
$mention['id'] = self::$createdTeams[$this->currentServer][$matches[1]];
3580+
$mention['id'] = self::getTeamIdForLabel($this->currentServer, $matches[1]);
35743581
}
35753582
return $mention;
35763583
}, $formData->getHash());
@@ -3978,7 +3985,7 @@ private function assertNotifications($notifications, TableNode $formData) {
39783985
[$roomToken, $message] = explode('/', $expectedNotification['object_id'], 2);
39793986
$result = preg_match('/TEAM_ID\(([^)]+)\)/', $message, $matches);
39803987
if ($result) {
3981-
$message = str_replace($matches[0], 'team/' . self::$createdTeams[$this->currentServer][$matches[1]], $message);
3988+
$message = str_replace($matches[0], 'team/' . self::getTeamIdForLabel($this->currentServer, $matches[1]), $message);
39823989
}
39833990
$expectedNotification['object_id'] = $roomToken . '/' . $message;
39843991
}
@@ -4015,7 +4022,7 @@ private function assertNotifications($notifications, TableNode $formData) {
40154022
}
40164023
$result = preg_match('/TEAM_ID\(([^)]+)\)/', $expectedNotification['message'], $matches);
40174024
if ($result) {
4018-
$data['message'] = str_replace($matches[0], self::$createdTeams[$this->currentServer][$matches[1]], $data['message']);
4025+
$data['message'] = str_replace($matches[0], self::getTeamIdForLabel($this->currentServer, $matches[1]), $data['message']);
40194026
}
40204027
}
40214028
if (isset($expectedNotification['object_type'])) {
@@ -4289,6 +4296,29 @@ public function assureTeamExists(string $team): void {
42894296
self::$createdTeams[$this->currentServer][$team] = $data['id'];
42904297
}
42914298

4299+
/**
4300+
* @Given /^User "([^"]*)" creates team "([^"]*)"$/
4301+
*/
4302+
public function createTeamAsUser(string $owner, string $team): void {
4303+
$this->runOcc(['circles:manage:create', '--type', '1', '--output', 'json', $owner, $team]);
4304+
$this->theCommandWasSuccessful();
4305+
4306+
$output = $this->getLastStdOut();
4307+
$data = json_decode($output, true);
4308+
4309+
self::$createdTeams[$this->currentServer][$team] = $data['id'];
4310+
}
4311+
4312+
/**
4313+
* @Given /^team "([^"]*)" is renamed to "([^"]*)"$/
4314+
*/
4315+
public function assureTeamRenamed(string $team, string $newName): void {
4316+
$id = self::$createdTeams[$this->currentServer][$team];
4317+
$this->runOcc(['circles:manage:edit', $id, 'displayName', $newName]);
4318+
$this->theCommandWasSuccessful();
4319+
self::$renamedTeams[$this->currentServer][$newName] = $id;
4320+
}
4321+
42924322
/**
42934323
* @Given /^add user "([^"]*)" to team "([^"]*)"$/
42944324
*/
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
Feature: conversation-5/team-participants
2+
Background:
3+
Given user "participant1" exists
4+
Given user "participant2" exists
5+
And User "participant1" creates team "Team A"
6+
And add user "participant2" to team "Team A"
7+
8+
Scenario: Owner invites a team
9+
Given user "participant1" creates room "room" (v4)
10+
| roomType | 3 |
11+
| roomName | room |
12+
And user "participant1" sees the following attendees in room "room" with 200 (v4)
13+
| actorType | actorId | participantType |
14+
| users | participant1 | 1 |
15+
And user "participant1" adds team "Team A" to room "room" with 200 (v4)
16+
And user "participant1" sees the following attendees in room "room" with 200 (v4)
17+
| actorType | actorId | participantType | displayName |
18+
| users | participant1 | 1 | participant1-displayname |
19+
| circles | TEAM_ID(Team A) | 3 | Team A |
20+
| users | participant2 | 3 | participant2-displayname |
21+
And team "Team A" is renamed to "Team Alpha"
22+
And user "participant1" sees the following attendees in room "room" with 200 (v4)
23+
| actorType | actorId | participantType | displayName |
24+
| users | participant1 | 1 | participant1-displayname |
25+
| circles | TEAM_ID(Team A) | 3 | Team Alpha |
26+
| users | participant2 | 3 | participant2-displayname |

tests/psalm-baseline.xml

+7
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44
<UndefinedClass>
55
<code><![CDATA[BeforeTemplateRenderedEvent]]></code>
66
<code><![CDATA[BeforeTemplateRenderedEvent]]></code>
7+
<code><![CDATA[CircleEditedEvent]]></code>
8+
<code><![CDATA[EditingCircleEvent]]></code>
79
</UndefinedClass>
810
</file>
911
<file src="lib/Chat/Parser/SystemMessage.php">
@@ -31,6 +33,11 @@
3133
<code><![CDATA[$fileId]]></code>
3234
</InvalidArgument>
3335
</file>
36+
<file src="lib/Listener/CircleEditedListener.php">
37+
<UndefinedClass>
38+
<code><![CDATA[EditingCircleEvent]]></code>
39+
</UndefinedClass>
40+
</file>
3441
<file src="lib/MatterbridgeManager.php">
3542
<UndefinedClass>
3643
<code><![CDATA[$this->tokenProvider]]></code>

0 commit comments

Comments
 (0)