returnType = match ($fileType) { 'audio' => Audio::class, 'video' => Video::class, 'image' => Image::class, 'transcript' => Transcript::class, 'chapters' => Chapters::class, default => Document::class }; parent::__construct($db, $validation); } public function getMediaById(int $mediaId): mixed { $cacheName = "media#{$mediaId}"; if (! ($found = cache($cacheName))) { $found = $this->find($mediaId); cache() ->save($cacheName, $found, DECADE); } return $found; } /** * @param Document|Audio|Video|Image|Transcript|Chapters $media */ public function saveMedia(object $media): int | false { // save file first $media->saveFile(); // insert record in database /** @var int|false $mediaId */ $mediaId = $this->insert($media, true); if (! $mediaId) { $this->db->transRollback(); return false; } return $mediaId; } /** * @param Document|Audio|Video|Image|Transcript|Chapters $media */ public function updateMedia(object $media): bool { // save file first // FIXME: what if file is not set? $media->saveFile(); // update record in database return $this->update($media->id, $media); } /** * @return array */ public function getAllOfType(): array { $result = $this->where('type', $this->fileType) ->findAll(); $mediaClass = $this->returnType; foreach ($result as $key => $media) { $result[$key] = new $mediaClass($media->toArray(false, true)); } return $result; } /** * @param Document|Audio|Video|Image|Transcript|Chapters $media */ public function deleteMedia($media): bool|BaseResult { if (! $media->deleteFile()) { return false; } return $this->delete($media->id); } /** * @param mixed[] $data * * @return mixed[] */ protected function clearCache(array $data): array { $mediaId = (is_array($data['id']) ? $data['id'][0] : $data['id']); cache() ->delete("media#{$mediaId}"); return $data; } }