mirror of
https://github.com/nextcloud/server.git
synced 2026-06-09 08:44:07 -04:00
feat(comments): Allow mentions of federated users, groups and teams in the future
Signed-off-by: Joas Schilling <coding@schilljs.com>
This commit is contained in:
parent
455a209b9c
commit
e5b0c06b24
2 changed files with 49 additions and 30 deletions
|
|
@ -220,7 +220,7 @@ class Comment implements IComment {
|
|||
*
|
||||
*/
|
||||
public function getMentions(): array {
|
||||
$ok = preg_match_all("/\B(?<![^a-z0-9_\-@\.\'\s])@(\"guest\/[a-f0-9]+\"|\"group\/[a-z0-9_\-@\.\' ]+\"|\"[a-z0-9_\-@\.\' ]+\"|[a-z0-9_\-@\.\']+)/i", $this->getMessage(), $mentions);
|
||||
$ok = preg_match_all("/\B(?<![^a-z0-9_\-@\.\'\s])@(\"guest\/[a-f0-9]+\"|\"(?:federated_)?(?:group|team|user){1}\/[a-z0-9_\-@\.\' \/:]+\"|\"[a-z0-9_\-@\.\' ]+\"|[a-z0-9_\-@\.\']+)/i", $this->getMessage(), $mentions);
|
||||
if (!$ok || !isset($mentions[0])) {
|
||||
return [];
|
||||
}
|
||||
|
|
@ -230,11 +230,21 @@ class Comment implements IComment {
|
|||
});
|
||||
$result = [];
|
||||
foreach ($mentionIds as $mentionId) {
|
||||
// Cut-off the @ and remove wrapping double-quotes
|
||||
$cleanId = trim(substr($mentionId, 1), '"');
|
||||
|
||||
if (str_starts_with($cleanId, 'guest/')) {
|
||||
$result[] = ['type' => 'guest', 'id' => $cleanId];
|
||||
} elseif (str_starts_with($cleanId, 'federated_group/')) {
|
||||
$result[] = ['type' => 'federated_group', 'id' => substr($cleanId, 16)];
|
||||
} elseif (str_starts_with($cleanId, 'group/')) {
|
||||
$result[] = ['type' => 'group', 'id' => substr($cleanId, 6)];
|
||||
} elseif (str_starts_with($cleanId, 'federated_team/')) {
|
||||
$result[] = ['type' => 'federated_team', 'id' => substr($cleanId, 15)];
|
||||
} elseif (str_starts_with($cleanId, 'team/')) {
|
||||
$result[] = ['type' => 'team', 'id' => substr($cleanId, 5)];
|
||||
} elseif (str_starts_with($cleanId, 'federated_user/')) {
|
||||
$result[] = ['type' => 'federated_user', 'id' => substr($cleanId, 15)];
|
||||
} else {
|
||||
$result[] = ['type' => 'user', 'id' => $cleanId];
|
||||
}
|
||||
|
|
|
|||
|
|
@ -134,19 +134,24 @@ class CommentTest extends TestCase {
|
|||
$comment->setMessage($msg);
|
||||
}
|
||||
|
||||
public function mentionsProvider() {
|
||||
public function mentionsProvider(): array {
|
||||
return [
|
||||
[
|
||||
'@alice @bob look look, a cook!', ['alice', 'bob']
|
||||
'@alice @bob look look, a cook!',
|
||||
[['type' => 'user', 'id' => 'alice'], ['type' => 'user', 'id' => 'bob']],
|
||||
],
|
||||
[
|
||||
'no mentions in this message', []
|
||||
'no mentions in this message',
|
||||
[]
|
||||
],
|
||||
[
|
||||
'@alice @bob look look, a duplication @alice test @bob!', ['alice', 'bob']
|
||||
'@alice @bob look look, a duplication @alice test @bob!',
|
||||
[['type' => 'user', 'id' => 'alice'], ['type' => 'user', 'id' => 'bob']],
|
||||
],
|
||||
[
|
||||
'@alice is the author, notify @bob, nevertheless mention her!', ['alice', 'bob'], 'alice'
|
||||
'@alice is the author, notify @bob, nevertheless mention her!',
|
||||
[['type' => 'user', 'id' => 'alice'], ['type' => 'user', 'id' => 'bob']],
|
||||
/* author: */ 'alice'
|
||||
],
|
||||
[
|
||||
'@foobar and @barfoo you should know, @foo@bar.com is valid' .
|
||||
|
|
@ -154,19 +159,38 @@ class CommentTest extends TestCase {
|
|||
' cc @23452-4333-54353-2342 @yolo!' .
|
||||
' however the most important thing to know is that www.croissant.com/@oil is not valid' .
|
||||
' and won\'t match anything at all',
|
||||
['bar@foo.org@foobar.io', '23452-4333-54353-2342', 'foo@bar.com', 'foobar', 'barfoo', 'yolo']
|
||||
[
|
||||
['type' => 'user', 'id' => 'bar@foo.org@foobar.io'],
|
||||
['type' => 'user', 'id' => '23452-4333-54353-2342'],
|
||||
['type' => 'user', 'id' => 'foo@bar.com'],
|
||||
['type' => 'user', 'id' => 'foobar'],
|
||||
['type' => 'user', 'id' => 'barfoo'],
|
||||
['type' => 'user', 'id' => 'yolo'],
|
||||
],
|
||||
],
|
||||
[
|
||||
'@@chef is also a valid mention, no matter how strange it looks', ['@chef']
|
||||
'@@chef is also a valid mention, no matter how strange it looks',
|
||||
[['type' => 'user', 'id' => '@chef']],
|
||||
],
|
||||
[
|
||||
'Also @"user with spaces" are now supported', ['user with spaces']
|
||||
'Also @"user with spaces" are now supported',
|
||||
[['type' => 'user', 'id' => 'user with spaces']],
|
||||
],
|
||||
[
|
||||
'Also @"guest/0123456789abcdef" are now supported', [], null, ['guest/0123456789abcdef']
|
||||
'Also @"guest/0123456789abcdef" are now supported',
|
||||
[['type' => 'guest', 'id' => 'guest/0123456789abcdef']],
|
||||
],
|
||||
[
|
||||
'Also @"group/My Group ID 321" are now supported', [], null, [], ['My Group ID 321']
|
||||
'Also @"group/My Group ID 321" are now supported',
|
||||
[['type' => 'group', 'id' => 'My Group ID 321']],
|
||||
],
|
||||
[
|
||||
'Welcome federation @"federated_group/My Group ID 321" @"federated_team/Former Cirle" @"federated_user/cloudId@http://example.tld:8080/nextcloud"! Now freshly supported',
|
||||
[
|
||||
['type' => 'federated_user', 'id' => 'cloudId@http://example.tld:8080/nextcloud'],
|
||||
['type' => 'federated_group', 'id' => 'My Group ID 321'],
|
||||
['type' => 'federated_team', 'id' => 'Former Cirle'],
|
||||
],
|
||||
],
|
||||
];
|
||||
}
|
||||
|
|
@ -175,31 +199,16 @@ class CommentTest extends TestCase {
|
|||
* @dataProvider mentionsProvider
|
||||
*
|
||||
* @param string $message
|
||||
* @param array $expectedUids
|
||||
* @param string|null $author
|
||||
* @param array $expectedGuests
|
||||
* @param array $expectedMentions
|
||||
* @param ?string $author
|
||||
*/
|
||||
public function testMentions(string $message, array $expectedUids, ?string $author = null, array $expectedGuests = [], array $expectedGroups = []): void {
|
||||
public function testMentions(string $message, array $expectedMentions, ?string $author = null): void {
|
||||
$comment = new Comment();
|
||||
$comment->setMessage($message);
|
||||
if (!is_null($author)) {
|
||||
$comment->setActor('user', $author);
|
||||
}
|
||||
$mentions = $comment->getMentions();
|
||||
while ($mention = array_shift($mentions)) {
|
||||
if ($mention['type'] === 'user') {
|
||||
$id = array_shift($expectedUids);
|
||||
} elseif ($mention['type'] === 'guest') {
|
||||
$id = array_shift($expectedGuests);
|
||||
} elseif ($mention['type'] === 'group') {
|
||||
$id = array_shift($expectedGroups);
|
||||
} else {
|
||||
$this->fail('Unexpected mention type');
|
||||
continue;
|
||||
}
|
||||
$this->assertSame($id, $mention['id']);
|
||||
}
|
||||
$this->assertEmpty($mentions);
|
||||
$this->assertEmpty($expectedUids);
|
||||
$this->assertSame($expectedMentions, $mentions);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue