Skip to content
Snippets Groups Projects
MediaModel.php 4.23 KiB
Newer Older
  • Learn to ignore specific revisions
  •  * @copyright  2020 Ad Aures
    
     * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
     * @link       https://castopod.org/
     */
    
    
    namespace Modules\Media\Models;
    
    
    use CodeIgniter\Database\ConnectionInterface;
    use CodeIgniter\Model;
    use CodeIgniter\Validation\ValidationInterface;
    
    use Modules\Media\Entities\Audio;
    use Modules\Media\Entities\Chapters;
    use Modules\Media\Entities\Document;
    use Modules\Media\Entities\Image;
    use Modules\Media\Entities\Transcript;
    use Modules\Media\Entities\Video;
    
    
    class MediaModel extends Model
    {
        /**
         * @var string
         */
        protected $table = 'media';
    
    
        protected $returnType = Document::class;
    
        protected $useSoftDeletes = false;
    
    
        /**
         * @var bool
         */
        protected $useTimestamps = true;
    
        /**
         * The column used for insert timestamps
         *
         * @var string
         */
        protected $createdField = 'uploaded_at';
    
    
            'file_metadata',
            'type',
            'description',
            'language_code',
            'uploaded_by',
            'updated_by',
        ];
    
    
        /**
         * clear cache before update if by any chance, the podcast name changes, so will the podcast link
         *
    
         */
        protected $beforeUpdate = ['clearCache'];
    
        /**
    
         */
        protected $beforeDelete = ['clearCache'];
    
    
        /**
         * @param ConnectionInterface|null $db         DB Connection
         * @param ValidationInterface|null $validation Validation
         */
        public function __construct(
    
            protected string $fileType = 'document',
    
            ConnectionInterface &$db = null,
            ValidationInterface $validation = null
        ) {
    
            $this->returnType = match ($fileType) {
    
                'audio'      => Audio::class,
                'video'      => Video::class,
                'image'      => Image::class,
    
                'transcript' => Transcript::class,
    
                'chapters'   => Chapters::class,
                default      => Document::class
    
        public function getMediaById(int $mediaId): mixed
    
        {
            $cacheName = "media#{$mediaId}";
            if (! ($found = cache($cacheName))) {
    
         * @param Document|Audio|Video|Image|Transcript|Chapters $media
    
         */
        public function saveMedia(object $media): int | false
        {
    
            // save file first
    
            /** @var int|false $mediaId */
            $mediaId = $this->insert($media, true);
    
            if (! $mediaId) {
    
                $this->db->transRollback();
    
    
    
        /**
         * @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();
    
            return $this->update($media->id, $media);
        }
    
    
        /**
         * @return array<mixed>
         */
        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;
        }