Skip to content
Snippets Groups Projects
AnalyticsPodcastByEpisodeModel.php 4.53 KiB
Newer Older
  • Learn to ignore specific revisions
  •  * Class AnalyticsPodcastByEpisodeModel
    
     * Model for analytics_podcasts_by_episodes table in database
     * @copyright  2020 Podlibre
     * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
     * @link       https://castopod.org/
     */
    
    namespace App\Models;
    
    use CodeIgniter\Model;
    
    
    class AnalyticsPodcastByEpisodeModel extends Model
    
    {
        protected $table = 'analytics_podcasts_by_episode';
    
        protected $allowedFields = [];
    
        protected $returnType = \App\Entities\AnalyticsPodcastsByEpisode::class;
        protected $useSoftDeletes = false;
    
        protected $useTimestamps = false;
    
        /**
         * @param int $podcastId, $episodeId
         *
         * @return array
         */
        public function getDataByDay(int $podcastId, int $episodeId = null): array
        {
            if (!$episodeId) {
                if (
                    !($found = cache(
                        "{$podcastId}_analytics_podcast_by_episode_by_day"
                    ))
                ) {
                    $lastEpisodes = (new EpisodeModel())
    
                        ->select('`id`, `season_number`, `number`, `title`')
                        ->orderBy('`id`', 'DESC')
                        ->where(['`podcast_id`' => $podcastId])
    
    
                    $letter = 97;
                    foreach ($lastEpisodes as $episode) {
                        $found = $found
                            ->selectSum(
                                '(CASE WHEN `episode_id`=' .
                                    $episode->id .
                                    ' THEN `hits` END)',
    
                            )
                            ->select(
                                '"' .
                                    (empty($episode->season_number)
                                        ? ''
                                        : $episode->season_number) .
                                    (empty($episode->number)
                                        ? ''
                                        : '-' . $episode->number . '/ ') .
                                    $episode->title .
    
                        ->findAll();
    
                    cache()->save(
                        "{$podcastId}_analytics_podcast_by_episode_by_day",
                        $found,
    
                    );
                }
                return $found;
            } else {
                if (
                    !($found = cache(
                        "{$podcastId}_{$episodeId}_analytics_podcast_by_episode_by_day"
                    ))
                ) {
    
                    $found = $this->select('`date as `labels`')
                        ->selectSum('`hits`', '`values`')
    
                            '`episode_id`' => $episodeId,
                            '`podcast_id`' => $podcastId,
                            '`age` <' => 60,
    
                        ->findAll();
    
                    cache()->save(
                        "{$podcastId}_{$episodeId}_analytics_podcast_by_episode_by_day",
                        $found,
    
    
        /**
         * @param int $podcastId, $episodeId
         *
         * @return array
         */
        public function getDataByMonth(int $podcastId, int $episodeId = null): array
        {
            if (
                !($found = cache(
                    "{$podcastId}_{$episodeId}_analytics_podcast_by_episode_by_month"
                ))
            ) {
                $found = $this->select('DATE_FORMAT(`date`,"%Y-%m-01") as `labels`')
                    ->selectSum('`hits`', '`values`')
                    ->where([
                        'episode_id' => $episodeId,
                        'podcast_id' => $podcastId,
                    ])
                    ->groupBy('`labels`')
                    ->orderBy('`labels`', 'ASC')
                    ->findAll();
    
                cache()->save(
                    "{$podcastId}_{$episodeId}_analytics_podcast_by_episode_by_month",
                    $found,
                    600
                );
            }
            return $found;
        }