diff --git a/wcfsetup/install/files/lib/data/TCollectionCoverPhotos.class.php b/wcfsetup/install/files/lib/data/TCollectionCoverPhotos.class.php new file mode 100644 index 0000000000..bf9042952d --- /dev/null +++ b/wcfsetup/install/files/lib/data/TCollectionCoverPhotos.class.php @@ -0,0 +1,72 @@ + + * @since 6.3 + */ +trait TCollectionCoverPhotos +{ + /** + * @var array + */ + private array $coverPhotos; + + public function getCoverPhoto( + DatabaseObject $object, + string $coverPhotoIdProperty = 'coverPhotoFileID', + ): ?FileCoverPhoto { + $this->loadCoverPhotos($coverPhotoIdProperty); + + return $this->coverPhotos[$object->{$coverPhotoIdProperty}] ?? null; + } + + private function loadCoverPhotos(string $coverPhotoIdProperty): void + { + if (isset($this->coverPhotos)) { + return; + } + + $this->coverPhotos = []; + $coverPhotoIDs = $this->getCoverPhotoIDs($coverPhotoIdProperty); + if ($coverPhotoIDs === []) { + return; + } + + $fileList = new FileList(); + $fileList->setObjectIDs($coverPhotoIDs); + $fileList->readObjects(); + $files = $fileList->getObjects(); + + $thumbnailList = new FileThumbnailList(); + $thumbnailList->getConditionBuilder()->add("fileID IN (?)", [$fileList->getObjectIDs()]); + $thumbnailList->readObjects(); + foreach ($thumbnailList as $thumbnail) { + $files[$thumbnail->fileID]->addThumbnail($thumbnail); + } + + $this->coverPhotos = \array_map(fn($file) => new FileCoverPhoto($file), $files); + } + + /** + * @return int[] + */ + private function getCoverPhotoIDs(string $coverPhotoIdProperty): array + { + \assert($this instanceof DatabaseObjectCollection); + + return \array_map( + static fn(DatabaseObject $object) => $object->{$coverPhotoIdProperty}, + \array_filter($this->getObjects(), static fn(DatabaseObject $object) => $object->{$coverPhotoIdProperty} !== null) + ); + } +}