Skip to content
Snippets Groups Projects
AnalyticsPodcastByEpisodeModel.php 4.48 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(
    
                                    ' THEN hits END)',
                                '' . chr($letter) . 'Y',
    
                            )
                            ->select(
                                '"' .
                                    (empty($episode->season_number)
                                        ? ''
                                        : $episode->season_number) .
                                    (empty($episode->number)
                                        ? ''
                                        : '-' . $episode->number . '/ ') .
                                    $episode->title .
    
                            'podcast_id' => $podcastId,
                            'age <' => 60,
    
                        ->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,
    
                        ->groupBy('labels')
                        ->orderBy('labels', 'ASC')
    
                        ->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,