From f9ec06bb7bef77408dd68b75d631e9a2b10fd9d2 Mon Sep 17 00:00:00 2001 From: Maxence Lange Date: Sat, 18 Nov 2023 21:31:59 -0100 Subject: [PATCH] add named metadata event Signed-off-by: Maxence Lange --- apps/files/lib/Command/Scan.php | 15 ++-- lib/composer/composer/autoload_classmap.php | 1 + lib/composer/composer/autoload_static.php | 1 + .../FilesMetadata/FilesMetadataManager.php | 8 ++- lib/public/FilesMetadata/AMetadataEvent.php | 4 +- .../Event/MetadataNamedEvent.php | 69 +++++++++++++++++++ .../FilesMetadata/IFilesMetadataManager.php | 7 +- 7 files changed, 96 insertions(+), 9 deletions(-) create mode 100644 lib/public/FilesMetadata/Event/MetadataNamedEvent.php diff --git a/apps/files/lib/Command/Scan.php b/apps/files/lib/Command/Scan.php index 7cdaf75e9bc58..a33dcd7c8a44b 100644 --- a/apps/files/lib/Command/Scan.php +++ b/apps/files/lib/Command/Scan.php @@ -96,8 +96,8 @@ protected function configure(): void { ->addOption( 'generate-metadata', null, - InputOption::VALUE_NONE, - 'Generate metadata for all scanned files' + InputOption::VALUE_OPTIONAL, + 'Generate metadata for all scanned files; if specified only generate for named value' ) ->addOption( 'all', @@ -122,7 +122,7 @@ protected function configure(): void { ); } - protected function scanFiles(string $user, string $path, bool $scanMetadata, OutputInterface $output, bool $backgroundScan = false, bool $recursive = true, bool $homeOnly = false): void { + protected function scanFiles(string $user, string $path, string $scanMetadata, OutputInterface $output, bool $backgroundScan = false, bool $recursive = true, bool $homeOnly = false): void { $connection = $this->reconnectToDatabase($output); $scanner = new \OC\Files\Utils\Scanner( $user, @@ -140,7 +140,8 @@ protected function scanFiles(string $user, string $path, bool $scanMetadata, Out $node = $this->rootFolder->get($path); $this->filesMetadataManager->refreshMetadata( $node, - IFilesMetadataManager::PROCESS_LIVE | IFilesMetadataManager::PROCESS_BACKGROUND + ($scanMetadata !== '_LIVE_') ? IFilesMetadataManager::PROCESS_NAMED : IFilesMetadataManager::PROCESS_LIVE | IFilesMetadataManager::PROCESS_BACKGROUND, + $scanMetadata ); } }); @@ -221,6 +222,10 @@ protected function execute(InputInterface $input, OutputInterface $output): int $this->initTools($output); + if ($input->hasOption('generate-metadata')) { + $metadata = $input->getOption('generate-metadata') ?? '_LIVE_'; + } + $user_count = 0; foreach ($users as $user) { if (is_object($user)) { @@ -230,7 +235,7 @@ protected function execute(InputInterface $input, OutputInterface $output): int ++$user_count; if ($this->userManager->userExists($user)) { $output->writeln("Starting scan for user $user_count out of $users_total ($user)"); - $this->scanFiles($user, $path, $input->getOption('generate-metadata'), $output, $input->getOption('unscanned'), !$input->getOption('shallow'), $input->getOption('home-only')); + $this->scanFiles($user, $path, $metadata ?? '', $output, $input->getOption('unscanned'), !$input->getOption('shallow'), $input->getOption('home-only')); $output->writeln('', OutputInterface::VERBOSITY_VERBOSE); } else { $output->writeln("Unknown user $user_count $user"); diff --git a/lib/composer/composer/autoload_classmap.php b/lib/composer/composer/autoload_classmap.php index 39a3f2638f4ce..b4897900aea04 100644 --- a/lib/composer/composer/autoload_classmap.php +++ b/lib/composer/composer/autoload_classmap.php @@ -290,6 +290,7 @@ 'OCP\\FilesMetadata\\AMetadataEvent' => $baseDir . '/lib/public/FilesMetadata/AMetadataEvent.php', 'OCP\\FilesMetadata\\Event\\MetadataBackgroundEvent' => $baseDir . '/lib/public/FilesMetadata/Event/MetadataBackgroundEvent.php', 'OCP\\FilesMetadata\\Event\\MetadataLiveEvent' => $baseDir . '/lib/public/FilesMetadata/Event/MetadataLiveEvent.php', + 'OCP\\FilesMetadata\\Event\\MetadataNamedEvent' => $baseDir . '/lib/public/FilesMetadata/Event/MetadataNamedEvent.php', 'OCP\\FilesMetadata\\Exceptions\\FilesMetadataException' => $baseDir . '/lib/public/FilesMetadata/Exceptions/FilesMetadataException.php', 'OCP\\FilesMetadata\\Exceptions\\FilesMetadataKeyFormatException' => $baseDir . '/lib/public/FilesMetadata/Exceptions/FilesMetadataKeyFormatException.php', 'OCP\\FilesMetadata\\Exceptions\\FilesMetadataNotFoundException' => $baseDir . '/lib/public/FilesMetadata/Exceptions/FilesMetadataNotFoundException.php', diff --git a/lib/composer/composer/autoload_static.php b/lib/composer/composer/autoload_static.php index 4a09a5db6da19..89f92f0917777 100644 --- a/lib/composer/composer/autoload_static.php +++ b/lib/composer/composer/autoload_static.php @@ -323,6 +323,7 @@ class ComposerStaticInit749170dad3f5e7f9ca158f5a9f04f6a2 'OCP\\FilesMetadata\\AMetadataEvent' => __DIR__ . '/../../..' . '/lib/public/FilesMetadata/AMetadataEvent.php', 'OCP\\FilesMetadata\\Event\\MetadataBackgroundEvent' => __DIR__ . '/../../..' . '/lib/public/FilesMetadata/Event/MetadataBackgroundEvent.php', 'OCP\\FilesMetadata\\Event\\MetadataLiveEvent' => __DIR__ . '/../../..' . '/lib/public/FilesMetadata/Event/MetadataLiveEvent.php', + 'OCP\\FilesMetadata\\Event\\MetadataNamedEvent' => __DIR__ . '/../../..' . '/lib/public/FilesMetadata/Event/MetadataNamedEvent.php', 'OCP\\FilesMetadata\\Exceptions\\FilesMetadataException' => __DIR__ . '/../../..' . '/lib/public/FilesMetadata/Exceptions/FilesMetadataException.php', 'OCP\\FilesMetadata\\Exceptions\\FilesMetadataKeyFormatException' => __DIR__ . '/../../..' . '/lib/public/FilesMetadata/Exceptions/FilesMetadataKeyFormatException.php', 'OCP\\FilesMetadata\\Exceptions\\FilesMetadataNotFoundException' => __DIR__ . '/../../..' . '/lib/public/FilesMetadata/Exceptions/FilesMetadataNotFoundException.php', diff --git a/lib/private/FilesMetadata/FilesMetadataManager.php b/lib/private/FilesMetadata/FilesMetadataManager.php index f90693359950e..8bdfc30d77a9d 100644 --- a/lib/private/FilesMetadata/FilesMetadataManager.php +++ b/lib/private/FilesMetadata/FilesMetadataManager.php @@ -44,6 +44,7 @@ use OCP\Files\NotFoundException; use OCP\FilesMetadata\Event\MetadataBackgroundEvent; use OCP\FilesMetadata\Event\MetadataLiveEvent; +use OCP\FilesMetadata\Event\MetadataNamedEvent; use OCP\FilesMetadata\Exceptions\FilesMetadataException; use OCP\FilesMetadata\Exceptions\FilesMetadataNotFoundException; use OCP\FilesMetadata\IFilesMetadataManager; @@ -89,7 +90,8 @@ public function __construct( */ public function refreshMetadata( Node $node, - int $process = self::PROCESS_LIVE + int $process = self::PROCESS_LIVE, + string $namedEvent = '' ): IFilesMetadata { try { $metadata = $this->metadataRequestService->getMetadataFromFileId($node->getId()); @@ -98,8 +100,12 @@ public function refreshMetadata( } // if $process is LIVE, we enforce LIVE + // if $process is NAMED and a named is set, we go NAMED + // else BACKGROUND if ((self::PROCESS_LIVE & $process) !== 0) { $event = new MetadataLiveEvent($node, $metadata); + } elseif ((self::PROCESS_NAMED & $process) !== 0 && $namedEvent !== '') { + $event = new MetadataNamedEvent($node, $metadata, $namedEvent); } else { $event = new MetadataBackgroundEvent($node, $metadata); } diff --git a/lib/public/FilesMetadata/AMetadataEvent.php b/lib/public/FilesMetadata/AMetadataEvent.php index 87abc60a983db..8cb8ea8d1b8dc 100644 --- a/lib/public/FilesMetadata/AMetadataEvent.php +++ b/lib/public/FilesMetadata/AMetadataEvent.php @@ -39,8 +39,8 @@ abstract class AMetadataEvent extends Event { * @since 28.0.0 */ public function __construct( - private Node $node, - private IFilesMetadata $metadata + protected Node $node, + protected IFilesMetadata $metadata ) { parent::__construct(); } diff --git a/lib/public/FilesMetadata/Event/MetadataNamedEvent.php b/lib/public/FilesMetadata/Event/MetadataNamedEvent.php new file mode 100644 index 0000000000000..df42064b8f8d8 --- /dev/null +++ b/lib/public/FilesMetadata/Event/MetadataNamedEvent.php @@ -0,0 +1,69 @@ + + * + * @author Maxence Lange + * + * @license GNU AGPL version 3 or any later version + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + * + */ + +namespace OCP\FilesMetadata\Event; + +use OCP\Files\Node; +use OCP\FilesMetadata\AMetadataEvent; +use OCP\FilesMetadata\Model\IFilesMetadata; + +/** + * MetadataNamedEvent is an event similar to MetadataBackgroundEvent completed with a target name, + * used to identify the designed app to refresh file's metadata. + * Meaning that when using this event, your app should implement a filter on the event's registered name + * + * @see AMetadataEvent::getMetadata() + * @see AMetadataEvent::getNode() + * @see MetadataNamedEvent::getName() + * @since 28.0.0 + */ +class MetadataNamedEvent extends AMetadataEvent { + /** + * @param Node $node + * @param IFilesMetadata $metadata + * @param string $name name assigned to the event + * + * @since 28.0.0 + */ + public function __construct( + Node $node, + IFilesMetadata $metadata, + private string $name = '' + ) { + parent::__construct($node, $metadata); + } + + /** + * get the assigned name for the event. + * This is used to know if your app is the called one when running the + * ./occ files:scan --generate-metadata [name] + * + * @return string + * @since 28.0.0 + */ + public function getName(): string { + return $this->name; + } +} diff --git a/lib/public/FilesMetadata/IFilesMetadataManager.php b/lib/public/FilesMetadata/IFilesMetadataManager.php index 6664c049d917c..de6fc62ba944f 100644 --- a/lib/public/FilesMetadata/IFilesMetadataManager.php +++ b/lib/public/FilesMetadata/IFilesMetadataManager.php @@ -42,6 +42,8 @@ interface IFilesMetadataManager { public const PROCESS_LIVE = 1; /** @since 28.0.0 */ public const PROCESS_BACKGROUND = 2; + /** @since 28.0.0 */ + public const PROCESS_NAMED = 4; /** * initiate the process of refreshing the metadata in relation to a node @@ -54,15 +56,18 @@ interface IFilesMetadataManager { * * @param Node $node related node * @param int $process type of process + * @param string $namedEvent limit process to a named event * * @return IFilesMetadata * @see self::PROCESS_BACKGROUND * @see self::PROCESS_LIVE + * @see self::PROCESS_NAMED * @since 28.0.0 */ public function refreshMetadata( Node $node, - int $process = self::PROCESS_LIVE + int $process = self::PROCESS_LIVE, + string $namedEvent = '' ): IFilesMetadata; /**