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))) { $builder = $this->where([ 'id' => $mediaId, ]); /** @var object $result */ $result = $builder->first(); $mediaClass = $this->returnType; $found = new $mediaClass($result->toArray(false, true)); 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 if (! $media->saveFile()) { return false; } // insert record in database if (! $mediaId = $this->insert($media, true)) { $this->db->transRollback(); return false; } return $mediaId; } /** * @param Document|Audio|Video|Image|Transcript|Chapters $media */ public function updateMedia(object $media): bool { // save file first if (! $media->saveFile()) { return false; } 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; } }