diff options
| author | Jan-Hendrik Willms <tleilax+github@gmail.com> | 2021-07-22 16:07:19 +0200 |
|---|---|---|
| committer | Jan-Hendrik Willms <tleilax+github@gmail.com> | 2021-07-22 16:19:12 +0200 |
| commit | a3da1483a9e689846179159355badfec8073dbec (patch) | |
| tree | 770dcca6bdf5f6f2a11b0e7fcbbeda6919a3fc52 /lib/classes/FilesSearch/NotificationObserver.php | |
current code from svn, revision 62608
Diffstat (limited to 'lib/classes/FilesSearch/NotificationObserver.php')
| -rw-r--r-- | lib/classes/FilesSearch/NotificationObserver.php | 102 |
1 files changed, 102 insertions, 0 deletions
diff --git a/lib/classes/FilesSearch/NotificationObserver.php b/lib/classes/FilesSearch/NotificationObserver.php new file mode 100644 index 0000000..26eaf80 --- /dev/null +++ b/lib/classes/FilesSearch/NotificationObserver.php @@ -0,0 +1,102 @@ +<?php + +namespace FilesSearch; + +use NotificationCenter; + +/** + * This class observes changes in file refs and folders and re-indexes + * if applicable. + * + * @license GPL2 or any later version + * + * @since Stud.IP 4.1 + */ +class NotificationObserver +{ + /** + * Observe every change in files, file refs and folders. + */ + public static function initialize() + { + NotificationCenter::addObserver(self::class, 'observeFileRef', 'FileRefDidCreate'); + NotificationCenter::addObserver(self::class, 'observeFileRef', 'FileRefDidDelete'); + NotificationCenter::addObserver(self::class, 'observeFileRef', 'FileRefDidUpdate'); + + NotificationCenter::addObserver(self::class, 'observeFolder', 'FolderDidCreate'); + NotificationCenter::addObserver(self::class, 'observeFolder', 'FolderDidDelete'); + NotificationCenter::addObserver(self::class, 'observeFolder', 'FolderDidUpdate'); + } + + /** + * Observe changes of FileRefs. Depending on the event either + * create, drop or update the index. + * + * @param FileRef $fileRef the observed file + */ + public static function observeFileRef($event, \FileRef $fileRef) + { + switch ($event) { + case 'FileRefDidCreate': + FilesIndexManager::indexFile($fileRef); + break; + + case 'FileRefDidDelete': + FilesIndexManager::dropIndexForFile($fileRef); + break; + + case 'FileRefDidUpdate': + if (self::isFileRefStale($fileRef)) { + FilesIndexManager::dropIndexForFile($fileRef); + FilesIndexManager::indexFile($fileRef); + } + break; + } + } + + /** + * Observe changes of Folders. Depending on the event either + * create, drop or update the indexes. + * + * @param Folder $folder the observed folder + */ + public static function observeFolder($event, \Folder $folder) + { + switch ($event) { + case 'FolderDidCreate': + FilesIndexManager::indexFolder($folder); + break; + + case 'FolderDidDelete': + FilesIndexManager::dropIndexForFolder($folder); + break; + + case 'FolderDidUpdate': + if (self::isFolderStale($folder)) { + FilesIndexManager::dropIndexForFolder($folder); + FilesIndexManager::indexFolder($folder); + } + break; + } + } + + private static function isFileRefStale(\FileRef $fileRef) + { + return self::isStale($fileRef, ['user_id', 'mkdate', 'chdate', 'folder_id', 'name', 'description']); + } + + private static function isFolderStale(\Folder $folder) + { + return self::isStale($folder, ['range_id', 'range_type', 'folder_type']); + } + + private static function isStale(\SimpleORMap $resource, array $fields) + { + foreach ($fields as $field) { + if ($resource->isFieldDirty($field)) { + return true; + } + } + return false; + } +} |
