cleanupProcessedFiles($event->getFile()); } #[AsEventListener('delete-processed-files-after-replace')] public function cleanupProcessedFilesPostFileReplace(AfterFileReplacedEvent $event): void { $this->cleanupProcessedFiles($event->getFile()); } #[AsEventListener('delete-processed-files-after-delete')] public function removeFromRepositoryAfterFileDeleted(AfterFileDeletedEvent $event): void { $this->removeFromRepository($event->getFile()); } /** * Cleanup database record for a deleted file */ private function removeFromRepository(FileInterface $fileObject): void { // remove file from repository if ($fileObject instanceof File) { $this->cleanupProcessedFiles($fileObject); $this->cleanupCategoryReferences($fileObject); $this->fileIndexRepository->remove($fileObject->getUid()); $this->metaDataRepository->removeByFileUid($fileObject->getUid()); // remove all references $this->connectionPool->getConnectionForTable('sys_file_reference')->delete( 'sys_file_reference', [ 'uid_local' => $fileObject->getUid(), ] ); } elseif ($fileObject instanceof ProcessedFile) { $this->processedFileRepository->remove($fileObject); } } /** * Remove all category references of the deleted file. */ private function cleanupCategoryReferences(File $fileObject): void { // Retrieve the file metadata uid which is different from the file uid. $metadataProperties = $fileObject->getMetaData()->get(); $metaDataUid = (int)($metadataProperties['_ORIG_uid'] ?? $metadataProperties['uid'] ?? 0); if ($metaDataUid <= 0) { // No metadata record exists for the given file. The file might not // have been indexed or the metadata record was deleted manually. return; } $this->connectionPool->getConnectionForTable('sys_category_record_mm')->delete( 'sys_category_record_mm', [ 'uid_foreign' => $metaDataUid, 'tablenames' => 'sys_file_metadata', ] ); } /** * Remove all processed files that belong to the given File object */ private function cleanupProcessedFiles(FileInterface $fileObject): void { // only delete processed files of File objects if (!$fileObject instanceof File) { return; } foreach ($this->processedFileRepository->findAllByOriginalFile($fileObject) as $processedFile) { if ($processedFile->exists()) { $processedFile->delete(true); } $this->removeFromRepository($processedFile); } } }