2121
2222namespace OC \Metadata ;
2323
24- use OC \Files \Filesystem ;
2524use OCP \EventDispatcher \Event ;
2625use 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 ;
3028use OCP \Files \File ;
29+ use OCP \Files \IRootFolder ;
3130use OCP \Files \Node ;
3231use OCP \Files \NotFoundException ;
33- use OCP \Files \FileInfo ;
34- use Psr \Log \LoggerInterface ;
3532
3633/**
3734 * @template-implements IEventListener<NodeRemovedFromCache>
3835 * @template-implements IEventListener<NodeDeletedEvent>
3936 * @template-implements IEventListener<NodeWrittenEvent>
4037 */
4138class FileEventListener implements IEventListener {
39+ private IRootFolder $ rootFolder ;
4240 private IMetadataManager $ manager ;
43- private LoggerInterface $ logger ;
4441
45- public function __construct (IMetadataManager $ manager , LoggerInterface $ logger ) {
42+ public function __construct (
43+ IRootFolder $ rootFolder ,
44+ IMetadataManager $ manager
45+ ) {
46+ $ this ->rootFolder = $ rootFolder ;
4647 $ this ->manager = $ manager ;
47- $ this ->logger = $ logger ;
4848 }
4949
50- private function shouldExtractMetadata (Node $ node ): bool {
50+ private function shouldExtractMetadata (? Node $ node ): bool {
5151 try {
52+ if ($ node === null ) {
53+ return false ;
54+ }
55+
5256 if ($ node ->getMimetype () === 'httpd/unix-directory ' ) {
5357 return false ;
5458 }
@@ -69,41 +73,22 @@ private function isCorrectPath(string $path): bool {
6973 }
7074
7175 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- }
92- }
76+ if ($ event instanceof CacheEntryRemovedEvent) {
77+ $ owner = $ event ->getStorage ()->getOwner ($ event ->getPath ());
78+ $ node = $ this ->rootFolder ->getUserFolder ($ owner )->getById ($ event ->getFileId ())[0 ];
9379
94- if ($ event instanceof NodeDeletedEvent) {
95- $ node = $ event ->getNode ();
9680 if ($ this ->shouldExtractMetadata ($ node )) {
97- /** @var File $node */
98- $ this ->manager ->clearMetadata ($ event ->getNode ()->getId ());
81+ $ this ->manager ->clearMetadata ($ event ->getFileId ());
9982 }
10083 }
10184
102- if ($ event instanceof NodeWrittenEvent) {
103- $ node = $ event ->getNode ();
85+ if ($ event instanceof CacheEntryInsertedEvent) {
86+ $ owner = $ event ->getStorage ()->getOwner ($ event ->getPath ());
87+ $ node = $ this ->rootFolder ->getUserFolder ($ owner )->getById ($ event ->getFileId ())[0 ];
88+
10489 if ($ this ->shouldExtractMetadata ($ node )) {
10590 /** @var File $node */
106- $ this ->manager ->generateMetadata ($ event -> getNode () , false );
91+ $ this ->manager ->generateMetadata ($ node , false );
10792 }
10893 }
10994 }
0 commit comments