Skip to content
Snippets Groups Projects
EpisodePersonModel.php 4.09 KiB
Newer Older
  • Learn to ignore specific revisions
  • <?php
    
    /**
     * @copyright  2021 Podlibre
     * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
     * @link       https://castopod.org/
     */
    
    namespace App\Models;
    
    use CodeIgniter\Model;
    
    class EpisodePersonModel extends Model
    {
        protected $table = 'episodes_persons';
        protected $primaryKey = 'id';
    
        protected $allowedFields = [
            'id',
            'podcast_id',
            'episode_id',
            'person_id',
            'person_group',
            'person_role',
        ];
    
        protected $returnType = \App\Entities\EpisodePerson::class;
        protected $useSoftDeletes = false;
    
        protected $useTimestamps = false;
    
        protected $validationRules = [
            'episode_id' => 'required',
            'person_id' => 'required',
        ];
        protected $validationMessages = [];
    
        protected $afterInsert = ['clearCache'];
        protected $beforeDelete = ['clearCache'];
    
        public function getPersonsByEpisodeId($podcastId, $episodeId)
        {
            if (
                !($found = cache(
                    "podcast{$podcastId}_episodes{$episodeId}_persons"
                ))
            ) {
                $found = $this->select('episodes_persons.*')
                    ->where('episode_id', $episodeId)
                    ->join(
                        'persons',
                        'person_id=persons.id'
                    )
                    ->orderby('full_name')
                    ->findAll();
    
                cache()->save(
                    "podcast{$podcastId}_episodes{$episodeId}_persons",
                    $found,
                    DECADE
                );
            }
            return $found;
        }
    
        /**
         * Add persons to episode
         *
         * @param int podcastId
         * @param int $episodeId
         * @param array $persons
         * @param array $groups_roles
         *
         * @return integer|false Number of rows inserted or FALSE on failure
         */
        public function addEpisodePersons(
            $podcastId,
            $episodeId,
            $persons,
            $groups_roles
        ) {
            if (!empty($persons)) {
                $this->clearCache([
                    'id' => [
                        'podcast_id' => $podcastId,
                        'episode_id' => $episodeId,
                    ],
                ]);
                $data = [];
                foreach ($persons as $person) {
                    if ($groups_roles) {
                        foreach ($groups_roles as $group_role) {
                            $group_role = explode(',', $group_role);
                            $data[] = [
                                'podcast_id' => $podcastId,
                                'episode_id' => $episodeId,
                                'person_id' => $person,
                                'person_group' => $group_role[0],
                                'person_role' => $group_role[1],
                            ];
                        }
                    } else {
                        $data[] = [
                            'podcast_id' => $podcastId,
                            'episode_id' => $episodeId,
                            'person_id' => $person,
                        ];
                    }
                }
                return $this->insertBatch($data);
            }
            return 0;
        }
    
        public function removeEpisodePersons(
            $podcastId,
            $episodeId,
            $episodePersonId
        ) {
            return $this->delete([
                'podcast_id' => $podcastId,
                'episode_id' => $episodeId,
                'id' => $episodePersonId,
            ]);
        }
    
        protected function clearCache(array $data)
        {
            $podcastId = null;
            $episodeId = null;
            if (
                isset($data['id']['podcast_id']) &&
                isset($data['id']['episode_id'])
            ) {
                $podcastId = $data['id']['podcast_id'];
                $episodeId = $data['id']['episode_id'];
            } else {
                $episodePerson = (new EpisodePersonModel())->find(
                    is_array($data['id']) ? $data['id']['id'] : $data['id']
                );
                $podcastId = $episodePerson->podcast_id;
                $episodeId = $episodePerson->episode_id;
            }
    
            cache()->delete("podcast{$podcastId}_episodes{$episodeId}_persons");
            (new EpisodeModel())->clearCache(['id' => $episodeId]);
    
            return $data;
        }
    }