<?php
namespace Lagdo\Polr\Admin\App;
use Carbon\Carbon;
use Jaxon\Sentry\Armada as JaxonClass;
class Stats extends JaxonClass
{
const DAYS_TO_FETCH = 30;
private function checkInputs(array $dates, $short_url)
{
if(!$this->validator->validateStatsDate($dates))
{
$this->notify->error('Invalid date bounds.', 'Error');
return false;
}
$user_left_bound = array_key_exists('left_bound', $dates) ? $dates['left_bound'] : '';
$user_right_bound = array_key_exists('right_bound', $dates) ? $dates['right_bound'] : '';
// Carbon bounds for StatHelper
$this->left_bound = $user_left_bound ?: Carbon::now()->subDays(self::DAYS_TO_FETCH);
$this->right_bound = $user_right_bound ?: Carbon::now();
if(Carbon::parse($this->right_bound)->gt(Carbon::now()))
{
// Right bound must not be greater than current time
// i.e cannot be in the future
$this->notify->error('Invalid date bounds. The right date bound cannot be in the future.', 'Error');
return false;
}
$this->short_url = trim($short_url);
$this->link = null;
if($this->short_url !== '')
{
// Fetch the link from the Polr instance
$apiResponse = $this->apiClient->get('links/' . $this->short_url,
['query' => ['key' => $this->apiKey]]);
$jsonResponse = json_decode($apiResponse->getBody()->getContents());
$this->link = $jsonResponse->result;
if($this->link == null)
{
$this->notify->error('Cannot show stats for nonexistent link.', 'Error');
return false;
}
$this->short_url = $short_url;
}
return true;
}
private function showStatsContent()
{
$path = ($this->short_url === '' ? 'stats' : 'links/' . $this->short_url . '/stats');
$parameters = [
'key' => $this->apiKey,
'left_bound' => (string)$this->left_bound,
'right_bound' => (string)$this->right_bound,
];
// Fetch the stats from the Polr instance
$parameters['type'] = 'day';
$apiResponse = $this->apiClient->get($path, ['query' => $parameters]);
$jsonResponse = json_decode($apiResponse->getBody()->getContents());
$day_stats = $jsonResponse->result;
// Fetch the stats from the Polr instance
$parameters['type'] = 'country';
$apiResponse = $this->apiClient->get($path, ['query' => $parameters]);
$jsonResponse = json_decode($apiResponse->getBody()->getContents());
$country_stats = $jsonResponse->result;
// Fetch the stats from the Polr instance
$parameters['type'] = 'referer';
$apiResponse = $this->apiClient->get($path, ['query' => $parameters]);
$jsonResponse = json_decode($apiResponse->getBody()->getContents());
$referer_stats = $jsonResponse->result;
$clicks = 0;
foreach($referer_stats as $stats)
{
$clicks += $stats->clicks;
}
$content = $this->view()->render('polr_admin::stats.content', [
'clicks' => $clicks,
'referer_stats' => $referer_stats,
]);
// Set the stats content
$this->response->html('stats-content', $content);
// Set the datepickers, the table and the graphs
// The dates must explicitely be converted to strings, or else they will be sent as JSON objects.
// The polr.stats.initData() function takes strings as date parameters.
$this->response->call("polr.stats.initData", $day_stats, $referer_stats,
$country_stats, (string)$this->left_bound, (string)$this->right_bound);
$this->response->script("polr.stats.initCharts()");
}
public function refreshStats(array $dates, $short_url)
{
if(!$this->checkInputs($dates, $short_url))
{
return $this->response;
}
// Set the table and the graphs
$this->showStatsContent();
return $this->response;
}
public function showStats($short_url)
{
if(!$this->checkInputs([], $short_url))
{
return $this->response;
}
// Set the stats header
if(($this->link))
{
$header = $this->view()->render('polr_admin::stats.link.header', [
'link' => $this->link,
'endpoint' => $this->polr->endpoint(),
]);
$this->response->html('stats-filter', $header);
// Show the stats tab and clear button
$this->jq('.admin-nav .stats a')->tab('show');
$this->jq('#stats-buttons .clear-stats')->show();
}
// Set the click handler on the refresh button
$this->response->script("polr.stats.short_url='$short_url'");
// Set the table and the graphs
$this->showStatsContent();
// Set the datepickers
$this->response->script("polr.stats.initDatePickers()");
return $this->response;
}
}
|