Skip to content

Commit cba556d

Browse files
authored
Merge pull request #48612 from nextcloud/fix/activity-log-for-favorites-in-dav
add activity logging for favorites in dav
2 parents 290c347 + eb61a3a commit cba556d

14 files changed

Lines changed: 164 additions & 114 deletions

File tree

apps/dav/lib/Connector/Sabre/ServerFactory.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,7 @@ public function createServer(string $baseUri,
136136
));
137137

138138
if ($this->userSession->isLoggedIn()) {
139-
$server->addPlugin(new TagsPlugin($objectTree, $this->tagManager));
139+
$server->addPlugin(new TagsPlugin($objectTree, $this->tagManager, $this->eventDispatcher, $this->userSession));
140140
$server->addPlugin(new SharesPlugin(
141141
$objectTree,
142142
$this->userSession,

apps/dav/lib/Connector/Sabre/TagsPlugin.php

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,10 @@
2727
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
2828
*
2929
*/
30+
use OCP\EventDispatcher\IEventDispatcher;
3031
use OCP\ITagManager;
3132
use OCP\ITags;
33+
use OCP\IUserSession;
3234
use Sabre\DAV\PropFind;
3335
use Sabre\DAV\PropPatch;
3436

@@ -67,6 +69,8 @@ class TagsPlugin extends \Sabre\DAV\ServerPlugin {
6769
public function __construct(
6870
private \Sabre\DAV\Tree $tree,
6971
private ITagManager $tagManager,
72+
private IEventDispatcher $eventDispatcher,
73+
private IUserSession $userSession,
7074
) {
7175
$this->tagger = null;
7276
$this->cachedTags = [];
@@ -251,7 +255,7 @@ public function handleUpdateProperties($path, PropPatch $propPatch) {
251255
return true;
252256
});
253257

254-
$propPatch->handle(self::FAVORITE_PROPERTYNAME, function ($favState) use ($node) {
258+
$propPatch->handle(self::FAVORITE_PROPERTYNAME, function ($favState) use ($node, $path) {
255259
if ((int)$favState === 1 || $favState === 'true') {
256260
$this->getTagger()->tagAs($node->getId(), self::TAG_FAVORITE);
257261
} else {

apps/dav/lib/Server.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -295,7 +295,7 @@ public function __construct(
295295
}
296296
$this->server->addPlugin(
297297
new TagsPlugin(
298-
$this->server->tree, \OC::$server->getTagManager()
298+
$this->server->tree, \OC::$server->getTagManager(), \OC::$server->get(IEventDispatcher::class), \OC::$server->get(IUserSession::class)
299299
)
300300
);
301301

apps/dav/tests/unit/Connector/Sabre/TagsPluginTest.php

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,11 @@
1313
use OCA\DAV\Connector\Sabre\TagList;
1414
use OCA\DAV\Connector\Sabre\TagsPlugin;
1515
use OCA\DAV\Upload\UploadFile;
16+
use OCP\EventDispatcher\IEventDispatcher;
1617
use OCP\ITagManager;
1718
use OCP\ITags;
19+
use OCP\IUser;
20+
use OCP\IUserSession;
1821
use Sabre\DAV\Tree;
1922

2023
class TagsPluginTest extends \Test\TestCase {
@@ -42,6 +45,16 @@ class TagsPluginTest extends \Test\TestCase {
4245
*/
4346
private $tagger;
4447

48+
/**
49+
* @var IEventDispatcher
50+
*/
51+
private $eventDispatcher;
52+
53+
/**
54+
* @var IUserSession
55+
*/
56+
private $userSession;
57+
4558
/**
4659
* @var TagsPlugin
4760
*/
@@ -59,11 +72,24 @@ protected function setUp(): void {
5972
$this->tagManager = $this->getMockBuilder(ITagManager::class)
6073
->disableOriginalConstructor()
6174
->getMock();
75+
76+
$this->eventDispatcher = $this->getMockBuilder(IEventDispatcher::class)
77+
->disableOriginalConstructor()
78+
->getMock();
79+
$user = $this->createMock(IUser::class);
80+
/**
81+
* @var IUserSession
82+
*/
83+
$this->userSession = $this->createMock(IUserSession::class);
84+
$this->userSession->expects($this->any())
85+
->method('getUser')
86+
->withAnyParameters()
87+
->willReturn($user);
6288
$this->tagManager->expects($this->any())
6389
->method('load')
6490
->with('files')
6591
->willReturn($this->tagger);
66-
$this->plugin = new TagsPlugin($this->tree, $this->tagManager);
92+
$this->plugin = new TagsPlugin($this->tree, $this->tagManager, $this->eventDispatcher, $this->userSession);
6793
$this->plugin->initialize($this->server);
6894
}
6995

apps/files/composer/composer/autoload_classmap.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,8 @@
6060
'OCA\\Files\\Helper' => $baseDir . '/../lib/Helper.php',
6161
'OCA\\Files\\Listener\\LoadSearchPluginsListener' => $baseDir . '/../lib/Listener/LoadSearchPluginsListener.php',
6262
'OCA\\Files\\Listener\\LoadSidebarListener' => $baseDir . '/../lib/Listener/LoadSidebarListener.php',
63+
'OCA\\Files\\Listener\\NodeAddedToFavoriteListener' => $baseDir . '/../lib/Listener/NodeAddedToFavoriteListener.php',
64+
'OCA\\Files\\Listener\\NodeRemovedFromFavoriteListener' => $baseDir . '/../lib/Listener/NodeRemovedFromFavoriteListener.php',
6365
'OCA\\Files\\Listener\\RenderReferenceEventListener' => $baseDir . '/../lib/Listener/RenderReferenceEventListener.php',
6466
'OCA\\Files\\Listener\\SyncLivePhotosListener' => $baseDir . '/../lib/Listener/SyncLivePhotosListener.php',
6567
'OCA\\Files\\Migration\\Version11301Date20191205150729' => $baseDir . '/../lib/Migration/Version11301Date20191205150729.php',

apps/files/composer/composer/autoload_static.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,8 @@ class ComposerStaticInitFiles
7575
'OCA\\Files\\Helper' => __DIR__ . '/..' . '/../lib/Helper.php',
7676
'OCA\\Files\\Listener\\LoadSearchPluginsListener' => __DIR__ . '/..' . '/../lib/Listener/LoadSearchPluginsListener.php',
7777
'OCA\\Files\\Listener\\LoadSidebarListener' => __DIR__ . '/..' . '/../lib/Listener/LoadSidebarListener.php',
78+
'OCA\\Files\\Listener\\NodeAddedToFavoriteListener' => __DIR__ . '/..' . '/../lib/Listener/NodeAddedToFavoriteListener.php',
79+
'OCA\\Files\\Listener\\NodeRemovedFromFavoriteListener' => __DIR__ . '/..' . '/../lib/Listener/NodeRemovedFromFavoriteListener.php',
7880
'OCA\\Files\\Listener\\RenderReferenceEventListener' => __DIR__ . '/..' . '/../lib/Listener/RenderReferenceEventListener.php',
7981
'OCA\\Files\\Listener\\SyncLivePhotosListener' => __DIR__ . '/..' . '/../lib/Listener/SyncLivePhotosListener.php',
8082
'OCA\\Files\\Migration\\Version11301Date20191205150729' => __DIR__ . '/..' . '/../lib/Migration/Version11301Date20191205150729.php',

apps/files/lib/AppInfo/Application.php

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@
1818
use OCA\Files\Event\LoadSidebar;
1919
use OCA\Files\Listener\LoadSearchPluginsListener;
2020
use OCA\Files\Listener\LoadSidebarListener;
21+
use OCA\Files\Listener\NodeAddedToFavoriteListener;
22+
use OCA\Files\Listener\NodeRemovedFromFavoriteListener;
2123
use OCA\Files\Listener\RenderReferenceEventListener;
2224
use OCA\Files\Listener\SyncLivePhotosListener;
2325
use OCA\Files\Notification\Notifier;
@@ -33,12 +35,13 @@
3335
use OCP\AppFramework\Bootstrap\IRegistrationContext;
3436
use OCP\Collaboration\Reference\RenderReferenceEvent;
3537
use OCP\Collaboration\Resources\IProviderManager;
36-
use OCP\EventDispatcher\IEventDispatcher;
3738
use OCP\Files\Cache\CacheEntryRemovedEvent;
3839
use OCP\Files\Events\Node\BeforeNodeCopiedEvent;
3940
use OCP\Files\Events\Node\BeforeNodeDeletedEvent;
4041
use OCP\Files\Events\Node\BeforeNodeRenamedEvent;
4142
use OCP\Files\Events\Node\NodeCopiedEvent;
43+
use OCP\Files\Events\NodeAddedToFavorite;
44+
use OCP\Files\Events\NodeRemovedFromFavorite;
4245
use OCP\Files\IRootFolder;
4346
use OCP\IConfig;
4447
use OCP\IL10N;
@@ -96,7 +99,6 @@ public function register(IRegistrationContext $context): void {
9699
$c->get(IActivityManager::class),
97100
$c->get(ITagManager::class)->load(self::APP_ID),
98101
$server->getUserFolder(),
99-
$c->get(IEventDispatcher::class),
100102
);
101103
});
102104

@@ -116,7 +118,8 @@ public function register(IRegistrationContext $context): void {
116118
$context->registerEventListener(BeforeNodeCopiedEvent::class, SyncLivePhotosListener::class);
117119
$context->registerEventListener(NodeCopiedEvent::class, SyncLivePhotosListener::class);
118120
$context->registerEventListener(LoadSearchPlugins::class, LoadSearchPluginsListener::class);
119-
121+
$context->registerEventListener(NodeAddedToFavorite::class, NodeAddedToFavoriteListener::class);
122+
$context->registerEventListener(NodeRemovedFromFavorite::class, NodeRemovedFromFavoriteListener::class);
120123
$context->registerSearchProvider(FilesSearchProvider::class);
121124

122125
$context->registerNotifierService(Notifier::class);
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
/**
5+
* SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors
6+
* SPDX-License-Identifier: AGPL-3.0-or-later
7+
*/
8+
namespace OCA\Files\Listener;
9+
10+
use OCA\Files\Activity\FavoriteProvider;
11+
use OCP\Activity\IManager as IActivityManager;
12+
use OCP\EventDispatcher\Event;
13+
use OCP\EventDispatcher\IEventListener;
14+
use OCP\Files\Events\NodeAddedToFavorite;
15+
16+
/** @template-implements IEventListener<NodeAddedToFavorite> */
17+
class NodeAddedToFavoriteListener implements IEventListener {
18+
public function __construct(
19+
private IActivityManager $activityManager,
20+
) {
21+
}
22+
public function handle(Event $event):void {
23+
if (!($event instanceof NodeAddedToFavorite)) {
24+
return;
25+
}
26+
$activityEvent = $this->activityManager->generateEvent();
27+
try {
28+
$activityEvent->setApp('files')
29+
->setObject('files', $event->getFileId(), $event->getPath())
30+
->setType('favorite')
31+
->setAuthor($event->getUser()->getUID())
32+
->setAffectedUser($event->getUser()->getUID())
33+
->setTimestamp(time())
34+
->setSubject(
35+
FavoriteProvider::SUBJECT_ADDED,
36+
['id' => $event->getFileId(), 'path' => $event->getPath()]
37+
);
38+
$this->activityManager->publish($activityEvent);
39+
} catch (\InvalidArgumentException $e) {
40+
} catch (\BadMethodCallException $e) {
41+
}
42+
}
43+
}
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
/**
5+
* SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors
6+
* SPDX-License-Identifier: AGPL-3.0-or-later
7+
*/
8+
namespace OCA\Files\Listener;
9+
10+
use OCA\Files\Activity\FavoriteProvider;
11+
use OCP\Activity\IManager as IActivityManager;
12+
use OCP\EventDispatcher\Event;
13+
use OCP\EventDispatcher\IEventListener;
14+
use OCP\Files\Events\NodeRemovedFromFavorite;
15+
16+
/** @template-implements IEventListener<NodeRemovedFromFavorite> */
17+
class NodeRemovedFromFavoriteListener implements IEventListener {
18+
public function __construct(
19+
private IActivityManager $activityManager,
20+
) {
21+
}
22+
public function handle(Event $event):void {
23+
if (!($event instanceof NodeRemovedFromFavorite)) {
24+
return;
25+
}
26+
$activityEvent = $this->activityManager->generateEvent();
27+
try {
28+
$activityEvent->setApp('files')
29+
->setObject('files', $event->getFileId(), $event->getPath())
30+
->setType('favorite')
31+
->setAuthor($event->getUser()->getUID())
32+
->setAffectedUser($event->getUser()->getUID())
33+
->setTimestamp(time())
34+
->setSubject(
35+
FavoriteProvider::SUBJECT_REMOVED,
36+
['id' => $event->getFileId(), 'path' => $event->getPath()]
37+
);
38+
$this->activityManager->publish($activityEvent);
39+
} catch (\InvalidArgumentException $e) {
40+
} catch (\BadMethodCallException $e) {
41+
}
42+
}
43+
}

apps/files/lib/Service/TagService.php

Lines changed: 0 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -7,15 +7,10 @@
77
*/
88
namespace OCA\Files\Service;
99

10-
use OCA\Files\Activity\FavoriteProvider;
1110
use OCP\Activity\IManager;
12-
use OCP\EventDispatcher\IEventDispatcher;
13-
use OCP\Files\Events\NodeAddedToFavorite;
14-
use OCP\Files\Events\NodeRemovedFromFavorite;
1511
use OCP\Files\Folder;
1612
use OCP\Files\NotFoundException;
1713
use OCP\ITags;
18-
use OCP\IUser;
1914
use OCP\IUserSession;
2015

2116
/**
@@ -28,7 +23,6 @@ public function __construct(
2823
private IManager $activityManager,
2924
private ?ITags $tagger,
3025
private ?Folder $homeFolder,
31-
private IEventDispatcher $dispatcher,
3226
) {
3327
}
3428

@@ -60,57 +54,15 @@ public function updateFileTags($path, $tags) {
6054

6155
$newTags = array_diff($tags, $currentTags);
6256
foreach ($newTags as $tag) {
63-
if ($tag === ITags::TAG_FAVORITE) {
64-
$this->addActivity(true, $fileId, $path);
65-
}
6657
$this->tagger->tagAs($fileId, $tag);
6758
}
6859
$deletedTags = array_diff($currentTags, $tags);
6960
foreach ($deletedTags as $tag) {
70-
if ($tag === ITags::TAG_FAVORITE) {
71-
$this->addActivity(false, $fileId, $path);
72-
}
7361
$this->tagger->unTag($fileId, $tag);
7462
}
7563

7664
// TODO: re-read from tagger to make sure the
7765
// list is up to date, in case of concurrent changes ?
7866
return $tags;
7967
}
80-
81-
/**
82-
* @param bool $addToFavorite
83-
* @param int $fileId
84-
* @param string $path
85-
*/
86-
protected function addActivity($addToFavorite, $fileId, $path) {
87-
$user = $this->userSession->getUser();
88-
if (!$user instanceof IUser) {
89-
return;
90-
}
91-
92-
if ($addToFavorite) {
93-
$event = new NodeAddedToFavorite($user, $fileId, $path);
94-
} else {
95-
$event = new NodeRemovedFromFavorite($user, $fileId, $path);
96-
}
97-
$this->dispatcher->dispatchTyped($event);
98-
99-
$event = $this->activityManager->generateEvent();
100-
try {
101-
$event->setApp('files')
102-
->setObject('files', $fileId, $path)
103-
->setType('favorite')
104-
->setAuthor($user->getUID())
105-
->setAffectedUser($user->getUID())
106-
->setTimestamp(time())
107-
->setSubject(
108-
$addToFavorite ? FavoriteProvider::SUBJECT_ADDED : FavoriteProvider::SUBJECT_REMOVED,
109-
['id' => $fileId, 'path' => $path]
110-
);
111-
$this->activityManager->publish($event);
112-
} catch (\InvalidArgumentException $e) {
113-
} catch (\BadMethodCallException $e) {
114-
}
115-
}
11668
}

0 commit comments

Comments
 (0)