Skip to content

Commit

Permalink
Listen to more events for 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 Feb 2, 2023
1 parent abc4f5f commit f5ddfa8
Show file tree
Hide file tree
Showing 4 changed files with 97 additions and 30 deletions.
27 changes: 27 additions & 0 deletions lib/Album/AlbumMapper.php
Original file line number Diff line number Diff line change
Expand Up @@ -273,6 +273,33 @@ public function removeFile(int $albumId, int $fileId): void {
$query->executeStatement();
}

public function removeFileWithOwner(int $fileId, string $ownerId): void {
// Get concerned albums before deleting them.
$query = $this->connection->getQueryBuilder();
$albumsRows = $query->select('album_id')
->from("photos_albums_files")
->where($query->expr()->eq("owner_id", $query->createNamedParameter($ownerId)))
->andWhere($query->expr()->eq("file_id", $query->createNamedParameter($fileId, IQueryBuilder::PARAM_INT)))
->executeQuery()
->fetchAll();

// Remove any occurrence of fileId when owner is ownerId.
$query = $this->connection->getQueryBuilder();
$query->delete("photos_albums_files")
->where($query->expr()->eq("owner_id", $query->createNamedParameter($ownerId)))
->andWhere($query->expr()->eq("file_id", $query->createNamedParameter($fileId, IQueryBuilder::PARAM_INT)))
->executeStatement();

// Update last_added_photo for concerned albums.
foreach ($albumsRows as $row) {
$query = $this->connection->getQueryBuilder();
$query->update("photos_albums")
->set('last_added_photo', $query->createNamedParameter($this->getLastAdded($row['album_id']), IQueryBuilder::PARAM_INT))
->where($query->expr()->eq('album_id', $query->createNamedParameter($row['album_id'], IQueryBuilder::PARAM_INT)));
$query->executeStatement();
}
}

private function getLastAdded(int $albumId): int {
$query = $this->connection->getQueryBuilder();
$query->select("file_id")
Expand Down
8 changes: 6 additions & 2 deletions lib/AppInfo/Application.php
Original file line number Diff line number Diff line change
Expand Up @@ -28,12 +28,14 @@
use OCA\DAV\Events\SabrePluginAuthInitEvent;
use OCA\Photos\Listener\SabrePluginAuthInitListener;
use OCA\DAV\Connector\Sabre\Principal;
use OCA\Photos\Listener\CacheEntryRemovedListener;
use OCA\Photos\Listener\AlbumsManagementFileEventListener;
use OCP\AppFramework\App;
use OCP\AppFramework\Bootstrap\IBootContext;
use OCP\AppFramework\Bootstrap\IBootstrap;
use OCP\AppFramework\Bootstrap\IRegistrationContext;
use OCP\Files\Cache\CacheEntryRemovedEvent;
use OCP\Share\Events\ShareDeletedEvent;
use OCP\User\Events\UserDeletedEvent;

class Application extends App implements IBootstrap {
public const APP_ID = 'photos';
Expand Down Expand Up @@ -65,7 +67,9 @@ public function __construct() {
public function register(IRegistrationContext $context): void {
/** Register $principalBackend for the DAV collection */
$context->registerServiceAlias('principalBackend', Principal::class);
$context->registerEventListener(CacheEntryRemovedEvent::class, CacheEntryRemovedListener::class);
$context->registerEventListener(CacheEntryRemovedEvent::class, AlbumsManagementFileEventListener::class);
$context->registerEventListener(UserDeletedEvent::class, AlbumsManagementFileEventListener::class);
$context->registerEventListener(ShareDeletedEvent::class, AlbumsManagementFileEventListener::class);
$context->registerEventListener(SabrePluginAuthInitEvent::class, SabrePluginAuthInitListener::class);
}

Expand Down
64 changes: 64 additions & 0 deletions lib/Listener/AlbumsManagementFileEventListener.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
<?php

namespace OCA\Photos\Listener;

use OCA\Photos\Album\AlbumMapper;
use OCP\Files\File;
use OCP\Files\Folder;
use OCP\Files\Node;
use OCP\EventDispatcher\Event;
use OCP\EventDispatcher\IEventListener;
use OCP\Files\Cache\CacheEntryRemovedEvent;
use OCP\Share\Events\ShareDeletedEvent;
use OCP\User\Events\UserDeletedEvent;

class AlbumsManagementFileEventListener implements IEventListener {
private AlbumMapper $albumMapper;

public function __construct(AlbumMapper $albumMapper) {
$this->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 UserDeletedEvent) {
// Delete all user's albums.
$albums = $this->albumMapper->getForUser($event->getUser()->getUID());
foreach ($albums as $album) {
$this->albumMapper->delete($album->getId());
}
}

if ($event instanceof ShareDeletedEvent) {
$receiverId = $event->getShare()->getSharedWith();
$this->forEachSubNode(
$event->getShare()->getNode(),
// Remove node from any album when the owner is $receiverId.
fn ($node) => $this->albumMapper->removeFileWithOwner($node->getId(), $receiverId),
);
}
}

private function forEachSubNode(Node $node, callable $callback): void {
if ($node instanceof Folder) {
foreach ($node->getDirectoryListing() as $subNode) {
$this->forEachSubNode($subNode, $callback);
}
}

if ($node instanceof File) {
if (!str_starts_with($node->getMimeType(), 'image')) {
return;
}

$callback($node);
}
}
}
28 changes: 0 additions & 28 deletions lib/Listener/CacheEntryRemovedListener.php

This file was deleted.

0 comments on commit f5ddfa8

Please sign in to comment.