|
21 | 21 |
|
22 | 22 | namespace OC\Metadata; |
23 | 23 |
|
24 | | -use OC\Files\Filesystem; |
25 | 24 | use OCP\EventDispatcher\Event; |
26 | 25 | use OCP\EventDispatcher\IEventListener; |
27 | | -use OCP\Files\Events\Node\NodeDeletedEvent; |
28 | | -use OCP\Files\Events\Node\NodeWrittenEvent; |
29 | | -use OCP\Files\Events\NodeRemovedFromCache; |
| 26 | +use OCP\Files\Cache\CacheEntryInsertedEvent; |
| 27 | +use OCP\Files\Cache\CacheEntryRemovedEvent; |
| 28 | +use OCP\Files\Cache\CacheEntryUpdatedEvent; |
| 29 | +use OCP\Files\Cache\ICacheEvent; |
30 | 30 | use OCP\Files\File; |
31 | | -use OCP\Files\Node; |
32 | | -use OCP\Files\NotFoundException; |
33 | | -use OCP\Files\FileInfo; |
34 | | -use Psr\Log\LoggerInterface; |
| 31 | +use OCP\Files\IRootFolder; |
35 | 32 |
|
36 | 33 | /** |
37 | | - * @template-implements IEventListener<NodeRemovedFromCache> |
38 | | - * @template-implements IEventListener<NodeDeletedEvent> |
39 | | - * @template-implements IEventListener<NodeWrittenEvent> |
| 34 | + * @template-implements IEventListener<CacheEntryRemovedEvent> |
| 35 | + * @template-implements IEventListener<CacheEntryInsertedEvent> |
40 | 36 | */ |
41 | 37 | class FileEventListener implements IEventListener { |
| 38 | + private IRootFolder $rootFolder; |
42 | 39 | private IMetadataManager $manager; |
43 | | - private LoggerInterface $logger; |
44 | 40 |
|
45 | | - public function __construct(IMetadataManager $manager, LoggerInterface $logger) { |
| 41 | + public function __construct( |
| 42 | + IRootFolder $rootFolder, |
| 43 | + IMetadataManager $manager |
| 44 | + ) { |
| 45 | + $this->rootFolder = $rootFolder; |
46 | 46 | $this->manager = $manager; |
47 | | - $this->logger = $logger; |
48 | | - } |
49 | | - |
50 | | - private function shouldExtractMetadata(Node $node): bool { |
51 | | - try { |
52 | | - if ($node->getMimetype() === 'httpd/unix-directory') { |
53 | | - return false; |
54 | | - } |
55 | | - } catch (NotFoundException $e) { |
56 | | - return false; |
57 | | - } |
58 | | - if ($node->getSize(false) <= 0) { |
59 | | - return false; |
60 | | - } |
61 | | - |
62 | | - $path = $node->getPath(); |
63 | | - return $this->isCorrectPath($path); |
64 | 47 | } |
65 | 48 |
|
66 | 49 | private function isCorrectPath(string $path): bool { |
67 | 50 | // TODO make this more dynamic, we have the same issue in other places |
68 | | - return !str_starts_with($path, 'appdata_') && !str_starts_with($path, 'files_versions/') && !str_starts_with($path, 'files_trashbin/'); |
| 51 | + return !str_starts_with($path, 'appdata_') && !str_starts_with($path, 'files_versions/'); |
69 | 52 | } |
70 | 53 |
|
| 54 | + /** |
| 55 | + * @param ICacheEvent $event |
| 56 | + */ |
71 | 57 | public function handle(Event $event): void { |
72 | | - if ($event instanceof NodeRemovedFromCache) { |
73 | | - if (!$this->isCorrectPath($event->getPath())) { |
74 | | - // Don't listen to paths for which we don't extract metadata |
75 | | - return; |
76 | | - } |
77 | | - $view = Filesystem::getView(); |
78 | | - if (!$view) { |
79 | | - // Should not happen since a scan in the user folder should setup |
80 | | - // the file system. |
81 | | - $e = new \Exception(); // don't trigger, just get backtrace |
82 | | - $this->logger->error('Detecting deletion of a file with possible metadata but file system setup is not setup', [ |
83 | | - 'exception' => $e, |
84 | | - 'app' => 'metadata' |
85 | | - ]); |
86 | | - return; |
87 | | - } |
88 | | - $info = $view->getFileInfo($event->getPath()); |
89 | | - if ($info && $info->getType() === FileInfo::TYPE_FILE) { |
90 | | - $this->manager->clearMetadata($info->getId()); |
91 | | - } |
| 58 | + if ($event->getStorage()->is_dir($event->getPath())) { |
| 59 | + return; |
92 | 60 | } |
93 | 61 |
|
94 | | - if ($event instanceof NodeDeletedEvent) { |
95 | | - $node = $event->getNode(); |
96 | | - if ($this->shouldExtractMetadata($node)) { |
97 | | - /** @var File $node */ |
98 | | - $this->manager->clearMetadata($event->getNode()->getId()); |
99 | | - } |
| 62 | + if (!$this->isCorrectPath($event->getPath())) { |
| 63 | + return; |
| 64 | + } |
| 65 | + |
| 66 | + if ($event instanceof CacheEntryRemovedEvent) { |
| 67 | + $this->manager->clearMetadata($event->getFileId()); |
100 | 68 | } |
101 | 69 |
|
102 | | - if ($event instanceof NodeWrittenEvent) { |
103 | | - $node = $event->getNode(); |
104 | | - if ($this->shouldExtractMetadata($node)) { |
105 | | - /** @var File $node */ |
106 | | - $this->manager->generateMetadata($event->getNode(), false); |
| 70 | + if ($event instanceof CacheEntryInsertedEvent || $event instanceof CacheEntryUpdatedEvent) { |
| 71 | + if ($event->getStorage()->filesize($event->getPath()) <= 0) { |
| 72 | + return; |
| 73 | + } |
| 74 | + |
| 75 | + $owner = $event->getStorage()->getOwner($event->getPath()); |
| 76 | + $node = $this->rootFolder->getUserFolder($owner)->getById($event->getFileId())[0]; |
| 77 | + |
| 78 | + if ($node instanceof File) { |
| 79 | + $this->manager->generateMetadata($node, false); |
107 | 80 | } |
108 | 81 | } |
109 | 82 | } |
|
0 commit comments