mirror of
https://github.com/nextcloud/server.git
synced 2026-03-27 04:43:20 -04:00
add named metadata event
Signed-off-by: Maxence Lange <maxence@artificial-owl.com>
This commit is contained in:
parent
0da05fc73b
commit
22d6c8dcd4
7 changed files with 105 additions and 10 deletions
|
|
@ -96,8 +96,9 @@ class Scan extends Base {
|
|||
->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 +123,7 @@ class Scan extends Base {
|
|||
);
|
||||
}
|
||||
|
||||
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,
|
||||
|
|
@ -136,11 +137,12 @@ class Scan extends Base {
|
|||
$output->writeln("\tFile\t<info>$path</info>", OutputInterface::VERBOSITY_VERBOSE);
|
||||
++$this->filesCounter;
|
||||
$this->abortIfInterrupted();
|
||||
if ($scanMetadata) {
|
||||
if ($scanMetadata !== null) {
|
||||
$node = $this->rootFolder->get($path);
|
||||
$this->filesMetadataManager->refreshMetadata(
|
||||
$node,
|
||||
IFilesMetadataManager::PROCESS_LIVE | IFilesMetadataManager::PROCESS_BACKGROUND
|
||||
($scanMetadata !== '') ? IFilesMetadataManager::PROCESS_NAMED : IFilesMetadataManager::PROCESS_LIVE | IFilesMetadataManager::PROCESS_BACKGROUND,
|
||||
$scanMetadata
|
||||
);
|
||||
}
|
||||
});
|
||||
|
|
@ -221,6 +223,12 @@ class Scan extends Base {
|
|||
|
||||
$this->initTools($output);
|
||||
|
||||
// getOption() logic on VALUE_OPTIONAL
|
||||
$metadata = null; // null if --generate-metadata is not set, empty if option have no value, value if set
|
||||
if ($input->getOption('generate-metadata') !== '') {
|
||||
$metadata = $input->getOption('generate-metadata') ?? '';
|
||||
}
|
||||
|
||||
$user_count = 0;
|
||||
foreach ($users as $user) {
|
||||
if (is_object($user)) {
|
||||
|
|
@ -230,7 +238,7 @@ class Scan extends Base {
|
|||
++$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("<error>Unknown user $user_count $user</error>");
|
||||
|
|
|
|||
|
|
@ -290,6 +290,7 @@ return array(
|
|||
'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',
|
||||
|
|
|
|||
|
|
@ -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',
|
||||
|
|
|
|||
|
|
@ -44,6 +44,7 @@ use OCP\Files\Node;
|
|||
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 @@ class FilesMetadataManager implements IFilesMetadataManager {
|
|||
*/
|
||||
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 @@ class FilesMetadataManager implements IFilesMetadataManager {
|
|||
}
|
||||
|
||||
// if $process is LIVE, we enforce LIVE
|
||||
// if $process is NAMED, we go NAMED
|
||||
// else BACKGROUND
|
||||
if ((self::PROCESS_LIVE & $process) !== 0) {
|
||||
$event = new MetadataLiveEvent($node, $metadata);
|
||||
} elseif ((self::PROCESS_NAMED & $process) !== 0) {
|
||||
$event = new MetadataNamedEvent($node, $metadata, $namedEvent);
|
||||
} else {
|
||||
$event = new MetadataBackgroundEvent($node, $metadata);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
}
|
||||
|
|
|
|||
74
lib/public/FilesMetadata/Event/MetadataNamedEvent.php
Normal file
74
lib/public/FilesMetadata/Event/MetadataNamedEvent.php
Normal file
|
|
@ -0,0 +1,74 @@
|
|||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
/**
|
||||
* @copyright 2023 Maxence Lange <maxence@artificial-owl.com>
|
||||
*
|
||||
* @author Maxence Lange <maxence@artificial-owl.com>
|
||||
*
|
||||
* @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 <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
|
||||
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 limit the refresh of metadata only listeners capable of filtering themselves out.
|
||||
*
|
||||
* Meaning that when using this event, your app must implement a filter on the event's registered
|
||||
* name returned by getName()
|
||||
*
|
||||
* This event is mostly triggered when a registered name is added to the files scan
|
||||
* i.e. ./occ files:scan --generate-metadata [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;
|
||||
}
|
||||
}
|
||||
|
|
@ -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;
|
||||
|
||||
/**
|
||||
|
|
|
|||
Loading…
Reference in a new issue