Skip to content

Commit

Permalink
Merge listeners related to albums
Browse files Browse the repository at this point in the history
Signed-off-by: Louis Chemineau <louis@chmn.me>
  • Loading branch information
artonge committed May 6, 2023
1 parent dca71f7 commit 1802ead
Show file tree
Hide file tree
Showing 5 changed files with 57 additions and 132 deletions.
15 changes: 4 additions & 11 deletions lib/AppInfo/Application.php
Original file line number Diff line number Diff line change
Expand Up @@ -28,10 +28,7 @@
use OCA\DAV\Events\SabrePluginAuthInitEvent;
use OCA\Photos\Listener\SabrePluginAuthInitListener;
use OCA\DAV\Connector\Sabre\Principal;
use OCA\Photos\Listener\NodeDeletedListener;
use OCA\Photos\Listener\TagListener;
use OCA\Photos\Listener\GroupUserRemovedListener;
use OCA\Photos\Listener\GroupDeletedListener;
use OCA\Photos\Listener\PlaceManagerEventListener;
use OCA\Photos\Listener\AlbumsManagementEventListener;
use OCP\AppFramework\App;
Expand All @@ -43,7 +40,6 @@
use OCP\Group\Events\UserRemovedEvent;
use OCP\Group\Events\GroupDeletedEvent;
use OCP\Files\Events\Node\NodeWrittenEvent;
use OCP\Files\Cache\CacheEntryRemovedEvent;
use OCP\Share\Events\ShareDeletedEvent;
use OCP\User\Events\UserDeletedEvent;

Expand Down Expand Up @@ -79,18 +75,15 @@ public function register(IRegistrationContext $context): void {
/** Register $principalBackend for the DAV collection */
$context->registerServiceAlias('principalBackend', Principal::class);

$context->registerEventListener(NodeDeletedEvent::class, NodeDeletedListener::class);

$context->registerEventListener(UserRemovedEvent::class, GroupUserRemovedListener::class);

$context->registerEventListener(GroupDeletedEvent::class, GroupDeletedListener::class);

// Priority of -1 to be triggered after event listeners populating metadata.
$context->registerEventListener(NodeWrittenEvent::class, PlaceManagerEventListener::class, -1);

$context->registerEventListener(CacheEntryRemovedEvent::class, AlbumsManagementEventListener::class);
$context->registerEventListener(NodeDeletedEvent::class, AlbumsManagementEventListener::class);
$context->registerEventListener(UserRemovedEvent::class, AlbumsManagementEventListener::class);
$context->registerEventListener(GroupDeletedEvent::class, AlbumsManagementEventListener::class);
$context->registerEventListener(UserDeletedEvent::class, AlbumsManagementEventListener::class);
$context->registerEventListener(ShareDeletedEvent::class, AlbumsManagementEventListener::class);

$context->registerEventListener(SabrePluginAuthInitEvent::class, SabrePluginAuthInitListener::class);

$context->registerEventListener(MapperEvent::EVENT_ASSIGN, TagListener::class);
Expand Down
59 changes: 53 additions & 6 deletions lib/Listener/AlbumsManagementEventListener.php
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,9 @@
use OCP\Files\Node;
use OCP\EventDispatcher\Event;
use OCP\EventDispatcher\IEventListener;
use OCP\Files\Cache\CacheEntryRemovedEvent;
use OCP\Files\Events\Node\NodeDeletedEvent;
use OCP\Group\Events\GroupDeletedEvent;
use OCP\Group\Events\UserRemovedEvent;
use OCP\Share\Events\ShareDeletedEvent;
use OCP\User\Events\UserDeletedEvent;

Expand All @@ -20,11 +22,17 @@ public function __construct(AlbumMapper $albumMapper) {
}

public function handle(Event $event): void {
if ($event instanceof CacheEntryRemovedEvent) {
// Remove node from all albums containing it.
$albums = $this->albumMapper->getForFile($event->getFileId());
foreach ($albums as $album) {
$this->albumMapper->removeFile($album->getId(), $event->getFileId());
if ($event instanceof NodeDeletedEvent) {
try {
// Remove node from all albums containing it.
$albums = $this->albumMapper->getForFile($event->getNode()->getId());

foreach ($albums as $album) {
$this->albumMapper->removeFile($album->getId(), $event->getNode()->getId());
}
} catch(\Throwable $ex) {
// If an error occur, return silently as we don't want to block the rest of the deletion process.
// It happened already during migrations when the albums table is not yet created, but a folder is deleted by the theming app.
}
}

Expand All @@ -44,6 +52,45 @@ public function handle(Event $event): void {
fn ($node) => $this->albumMapper->removeFileWithOwner($node->getId(), $receiverId),
);
}

if ($event instanceof UserRemovedEvent) {
// Get all shared albums for this group:
$albums_group = $this->albumMapper->getSharedAlbumsForCollaborator($event->getGroup()->getGID(), AlbumMapper::TYPE_GROUP);
// Get all albums shared with this specific user:
$albums_user = $this->albumMapper->getSharedAlbumsForCollaborator($event->getUser()->getUID(), AlbumMapper::TYPE_USER);
// Get all group-shared albums that are not directly shared with the removed user in addition
$albums = array_udiff($albums_group, $albums_user, fn ($a, $b) => ($a->getId() - $b->getId()));

// Remove their photos from theses albums:
foreach ($albums as $album) {
$this->albumMapper->removeFilesForUser($album->getId(), $event->getUser()->getUID());
}
}

if ($event instanceof GroupDeletedEvent) {
// Get all shared albums for this group:
$albums_group = $this->albumMapper->getSharedAlbumsForCollaborator($event->getGroup()->getGID(), AlbumMapper::TYPE_GROUP);

// Get all users of this group:
$users = $event->getGroup()->getUsers();

foreach ($users as $user) {
// Get all albums shared with this specific user:
$albums_user = $this->albumMapper->getSharedAlbumsForCollaborator($user->getUID(), AlbumMapper::TYPE_USER);

// Get all group-shared albums that are not directly shared with the removed user in addition
$albums = array_udiff($albums_group, $albums_user, fn ($a, $b) => ($a->getId() - $b->getId()));

// Remove their photos from theses albums:
foreach ($albums as $album) {
$this->albumMapper->removeFilesForUser($album->getId(), $user->getUID());
}
}

foreach ($albums_group as $album) {
$this->albumMapper->deleteGroupFromAlbumCollaboratorsList($event->getGroup()->getGID(), $album->getId());
}
}
}

private function forEachSubNode(Node $node, callable $callback): void {
Expand Down
47 changes: 0 additions & 47 deletions lib/Listener/GroupDeletedListener.php

This file was deleted.

34 changes: 0 additions & 34 deletions lib/Listener/GroupUserRemovedListener.php

This file was deleted.

34 changes: 0 additions & 34 deletions lib/Listener/NodeDeletedListener.php

This file was deleted.

0 comments on commit 1802ead

Please sign in to comment.