Skip to content

Commit e96dc20

Browse files
committed
fix(dav): add activity logging for favorites in dav
Signed-off-by: grnd-alt <salimbelakkaf@outlook.de>
1 parent 74cd6e2 commit e96dc20

File tree

11 files changed

+155
-53
lines changed

11 files changed

+155
-53
lines changed

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

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

136136
if ($this->userSession->isLoggedIn()) {
137-
$server->addPlugin(new TagsPlugin($objectTree, $this->tagManager));
137+
$server->addPlugin(new TagsPlugin($objectTree, $this->tagManager, $this->eventDispatcher, $this->userSession));
138138
$server->addPlugin(new SharesPlugin(
139139
$objectTree,
140140
$this->userSession,

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

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,12 @@
2727
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
2828
*
2929
*/
30+
use OCP\EventDispatcher\IEventDispatcher;
31+
use OCP\Files\Events\NodeAddedToFavorite;
32+
use OCP\Files\Events\NodeRemovedFromFavorite;
3033
use OCP\ITagManager;
3134
use OCP\ITags;
35+
use OCP\IUserSession;
3236
use Sabre\DAV\PropFind;
3337
use Sabre\DAV\PropPatch;
3438

@@ -67,6 +71,8 @@ class TagsPlugin extends \Sabre\DAV\ServerPlugin {
6771
public function __construct(
6872
private \Sabre\DAV\Tree $tree,
6973
private ITagManager $tagManager,
74+
private IEventDispatcher $eventDispatcher,
75+
private IUserSession $userSession,
7076
) {
7177
$this->tagger = null;
7278
$this->cachedTags = [];
@@ -251,11 +257,13 @@ public function handleUpdateProperties($path, PropPatch $propPatch) {
251257
return true;
252258
});
253259

254-
$propPatch->handle(self::FAVORITE_PROPERTYNAME, function ($favState) use ($node) {
260+
$propPatch->handle(self::FAVORITE_PROPERTYNAME, function ($favState) use ($node, $path) {
255261
if ((int)$favState === 1 || $favState === 'true') {
256262
$this->getTagger()->tagAs($node->getId(), self::TAG_FAVORITE);
263+
$this->eventDispatcher->dispatchTyped(new NodeAddedToFavorite($this->userSession->getUser(), $node->getId(), $path));
257264
} else {
258265
$this->getTagger()->unTag($node->getId(), self::TAG_FAVORITE);
266+
$this->eventDispatcher->dispatchTyped(new NodeRemovedFromFavorite($this->userSession->getUser(), $node->getId(), $path));
259267
}
260268

261269
if (is_null($favState)) {

apps/dav/lib/Server.php

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

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
@@ -63,6 +63,8 @@
6363
'OCA\\Files\\Listener\\DeclarativeSettingsSetValueEventListener' => $baseDir . '/../lib/Listener/DeclarativeSettingsSetValueEventListener.php',
6464
'OCA\\Files\\Listener\\LoadSearchPluginsListener' => $baseDir . '/../lib/Listener/LoadSearchPluginsListener.php',
6565
'OCA\\Files\\Listener\\LoadSidebarListener' => $baseDir . '/../lib/Listener/LoadSidebarListener.php',
66+
'OCA\\Files\\Listener\\NodeAddedToFavoriteListener' => $baseDir . '/../lib/Listener/NodeAddedToFavoriteListener.php',
67+
'OCA\\Files\\Listener\\NodeRemovedFromFavoriteListener' => $baseDir . '/../lib/Listener/NodeRemovedFromFavoriteListener.php',
6668
'OCA\\Files\\Listener\\RenderReferenceEventListener' => $baseDir . '/../lib/Listener/RenderReferenceEventListener.php',
6769
'OCA\\Files\\Listener\\SyncLivePhotosListener' => $baseDir . '/../lib/Listener/SyncLivePhotosListener.php',
6870
'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
@@ -78,6 +78,8 @@ class ComposerStaticInitFiles
7878
'OCA\\Files\\Listener\\DeclarativeSettingsSetValueEventListener' => __DIR__ . '/..' . '/../lib/Listener/DeclarativeSettingsSetValueEventListener.php',
7979
'OCA\\Files\\Listener\\LoadSearchPluginsListener' => __DIR__ . '/..' . '/../lib/Listener/LoadSearchPluginsListener.php',
8080
'OCA\\Files\\Listener\\LoadSidebarListener' => __DIR__ . '/..' . '/../lib/Listener/LoadSidebarListener.php',
81+
'OCA\\Files\\Listener\\NodeAddedToFavoriteListener' => __DIR__ . '/..' . '/../lib/Listener/NodeAddedToFavoriteListener.php',
82+
'OCA\\Files\\Listener\\NodeRemovedFromFavoriteListener' => __DIR__ . '/..' . '/../lib/Listener/NodeRemovedFromFavoriteListener.php',
8183
'OCA\\Files\\Listener\\RenderReferenceEventListener' => __DIR__ . '/..' . '/../lib/Listener/RenderReferenceEventListener.php',
8284
'OCA\\Files\\Listener\\SyncLivePhotosListener' => __DIR__ . '/..' . '/../lib/Listener/SyncLivePhotosListener.php',
8385
'OCA\\Files\\Migration\\Version11301Date20191205150729' => __DIR__ . '/..' . '/../lib/Migration/Version11301Date20191205150729.php',

apps/files/lib/AppInfo/Application.php

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@
2121
use OCA\Files\Listener\DeclarativeSettingsSetValueEventListener;
2222
use OCA\Files\Listener\LoadSearchPluginsListener;
2323
use OCA\Files\Listener\LoadSidebarListener;
24+
use OCA\Files\Listener\NodeAddedToFavoriteListener;
25+
use OCA\Files\Listener\NodeRemovedFromFavoriteListener;
2426
use OCA\Files\Listener\RenderReferenceEventListener;
2527
use OCA\Files\Listener\SyncLivePhotosListener;
2628
use OCA\Files\Notification\Notifier;
@@ -41,6 +43,8 @@
4143
use OCP\Files\Events\Node\BeforeNodeDeletedEvent;
4244
use OCP\Files\Events\Node\BeforeNodeRenamedEvent;
4345
use OCP\Files\Events\Node\NodeCopiedEvent;
46+
use OCP\Files\Events\NodeAddedToFavorite;
47+
use OCP\Files\Events\NodeRemovedFromFavorite;
4448
use OCP\Files\IRootFolder;
4549
use OCP\IConfig;
4650
use OCP\IL10N;
@@ -122,7 +126,8 @@ public function register(IRegistrationContext $context): void {
122126
$context->registerEventListener(DeclarativeSettingsRegisterFormEvent::class, DeclarativeSettingsRegisterFormEventListener::class);
123127
$context->registerEventListener(DeclarativeSettingsGetValueEvent::class, DeclarativeSettingsGetValueEventListener::class);
124128
$context->registerEventListener(DeclarativeSettingsSetValueEvent::class, DeclarativeSettingsSetValueEventListener::class);
125-
129+
$context->registerEventListener(NodeAddedToFavorite::class, NodeAddedToFavoriteListener::class);
130+
$context->registerEventListener(NodeRemovedFromFavorite::class, NodeRemovedFromFavoriteListener::class);
126131
$context->registerSearchProvider(FilesSearchProvider::class);
127132

128133
$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: 2 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -7,15 +7,13 @@
77
*/
88
namespace OCA\Files\Service;
99

10-
use OCA\Files\Activity\FavoriteProvider;
1110
use OCP\Activity\IManager;
1211
use OCP\EventDispatcher\IEventDispatcher;
1312
use OCP\Files\Events\NodeAddedToFavorite;
1413
use OCP\Files\Events\NodeRemovedFromFavorite;
1514
use OCP\Files\Folder;
1615
use OCP\Files\NotFoundException;
1716
use OCP\ITags;
18-
use OCP\IUser;
1917
use OCP\IUserSession;
2018

2119
/**
@@ -61,14 +59,14 @@ public function updateFileTags($path, $tags) {
6159
$newTags = array_diff($tags, $currentTags);
6260
foreach ($newTags as $tag) {
6361
if ($tag === ITags::TAG_FAVORITE) {
64-
$this->addActivity(true, $fileId, $path);
62+
$this->dispatcher->dispatchTyped(new NodeAddedToFavorite($this->userSession->getUser(), $fileId, $path));
6563
}
6664
$this->tagger->tagAs($fileId, $tag);
6765
}
6866
$deletedTags = array_diff($currentTags, $tags);
6967
foreach ($deletedTags as $tag) {
7068
if ($tag === ITags::TAG_FAVORITE) {
71-
$this->addActivity(false, $fileId, $path);
69+
$this->dispatcher->dispatchTyped(new NodeRemovedFromFavorite($this->userSession->getUser(), $fileId, $path));
7270
}
7371
$this->tagger->unTag($fileId, $tag);
7472
}
@@ -77,40 +75,4 @@ public function updateFileTags($path, $tags) {
7775
// list is up to date, in case of concurrent changes ?
7876
return $tags;
7977
}
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-
}
11678
}

0 commit comments

Comments
 (0)