. */ namespace Poniverse\Ponyfm\Http\Controllers\Api\Web; use Illuminate\Database\Eloquent\ModelNotFoundException; use Poniverse\Ponyfm\Http\Controllers\ApiControllerBase; use Poniverse\Ponyfm\Models\ResourceLogItem; use Poniverse\Ponyfm\Models\Track; use Auth; use Cache; use DB; use Response; use Carbon\Carbon; class StatsController extends ApiControllerBase { private function getStatsData($id, $hourly = false) { $playRange = "'1 MONTH'"; if ($hourly) { $playRange = "'2 DAY'"; } $statQuery = DB::table('resource_log_items') ->selectRaw('created_at, COUNT(1) AS "plays"') ->where('track_id', '=', $id) ->where('log_type', '=', ResourceLogItem::PLAY) ->whereRaw('"created_at" > now() - INTERVAL '.$playRange) ->groupBy('created_at') ->orderBy('created_at') ->get(); return $statQuery; } private function sortTrackStatsArray($query, $hourly = false) { $now = Carbon::now(); $playsArray = []; $output = []; if ($hourly) { $playsArray = array_fill(0, 24, 0); } else { $playsArray = array_fill(0, 30, 0); } foreach ($query as $item) { $playDate = new Carbon($item->created_at); $key = 0; if ($hourly) { $key = $playDate->diffInHours($now); } else { $key = $playDate->diffInDays($now); } if (array_key_exists($key, $playsArray)) { $playsArray[$key] += $item->plays; } else { $playsArray[$key] = $item->plays; } } krsort($playsArray); // Covert playsArray into output we can understand foreach ($playsArray as $timeOffet => $plays) { if ($hourly) { $set = [ 'hours' => $timeOffet.' '.str_plural('hour', $timeOffet), 'plays' => $plays ]; } else { $set = [ 'days' => $timeOffet.' '.str_plural('day', $timeOffet), 'plays' => $plays ]; } array_push($output, $set); } if ($hourly) { return Response::json(['playStats' => $output, 'type' => 'Hourly'], 200); } else { return Response::json(['playStats' => $output, 'type' => 'Daily'], 200); } } public function getTrackStats($id) { $cachedOutput = Cache::remember('track_stats'.$id, 5, function () use ($id) { try { $track = Track::published()->findOrFail($id); } catch (ModelNotFoundException $e) { return $this->notFound('Track not found!'); } // Do we have permission to view this track? if (!$track->canView(Auth::user())) { return $this->notFound('Track not found!'); } // Run one of the functions depending on // how old the track is $now = Carbon::now(); $trackDate = $track->published_at; $hourly = true; if ($trackDate->diffInDays($now) >= 1) { $hourly = false; } $statsData = $this->getStatsData($id, $hourly); $output = $this->sortTrackStatsArray($statsData, $hourly); return $output; }); return $cachedOutput; } }