PHP Classes

File: src/Helpers/StatsHelper.php

Recommend this page to a friend!
  Classes of Thierry Feuzeu   Polr Restful API   src/Helpers/StatsHelper.php   Download  
File: src/Helpers/StatsHelper.php
Role: Class source
Content type: text/plain
Description: Class source
Class: Polr Restful API
Provide an API for the Polr URL shortener service
Author: By
Last change:
Date: 6 years ago
Size: 3,408 bytes
 

Contents

Class file image Download
<?php
namespace Lagdo\Polr\Api\Helpers;

use
App\Models\Click;
use
App\Models\Link;

use
Carbon\Carbon;
use
Illuminate\Http\Request;
use
Illuminate\Support\Facades\DB;

class
StatsHelper
{
   
/**
     * The constructor
     *
     * @param unknown $link_id The link id
     * @param unknown $left_bound The start date
     * @param unknown $right_bound The end date
     *
     * @throws \Exception
     */
   
public function __construct($link_id, $left_bound, $right_bound)
    {
       
$this->link_id = $link_id;
       
$this->left_bound_parsed = Carbon::parse($left_bound);
       
$this->right_bound_parsed = Carbon::parse($right_bound);

        if (!
$this->left_bound_parsed->lte($this->right_bound_parsed))
        {
           
// If left bound is not less than or equal to right bound
           
throw new \Exception('Invalid bounds.');
        }

       
$days_diff = $this->left_bound_parsed->diffInDays($this->right_bound_parsed);
       
$max_days_diff = env('_ANALYTICS_MAX_DAYS_DIFF') ?: 365;

        if (
$days_diff > $max_days_diff)
        {
            throw new \
Exception('Bounds too broad.');
        }
    }

   
/**
     * Fetches base rows given left date bound, right date bound, and link id
     *
     * @return DB rows
     */
   
public function getBaseRows()
    {
       
$rows = DB::table('clicks')
           
// ->where('link_id', $this->link_id)
           
->where('created_at', '>=', $this->left_bound_parsed)
            ->
where('created_at', '<=', $this->right_bound_parsed);
       
// Filter on link id only if it is greater than or equals to 0
       
if($this->link_id >= 0)
        {
           
$rows->where('link_id', $this->link_id);
        }
        return
$rows;
    }

   
/**
     * Fetches day stats
     *
     * @return DB rows
     */
   
public function getDayStats()
    {
       
// Return stats by day from the last 30 days
        // date => x
        // clicks => y

        // Issue a different request for MySQL and PostgreSQL database drivers
       
$stats = $this->getBaseRows();
       
$db_driver = DB::connection()->getDriverName();
        switch(
$db_driver)
        {
        case
'pgsql':
           
$stats->select(DB::raw("to_char(created_at, 'yyyy-mm-dd') AS x, count(*) AS y"))
               ->
groupBy(DB::raw("to_char(created_at, 'yyyy-mm-dd')"));
            break;
        case
'mysql':
        default:
           
$stats->select(DB::raw("DATE_FORMAT(created_at, '%Y-%m-%d') AS x, count(*) AS y"))
                ->
groupBy(DB::raw("DATE_FORMAT(created_at, '%Y-%m-%d')"));
            break;
        }
               
        return
$stats->orderBy('x', 'asc')->get();
    }

   
/**
     * Fetches country stats
     *
     * @return DB rows
     */
   
public function getCountryStats()
    {
       
$stats = $this->getBaseRows()
            ->
select(DB::raw("country AS label, count(*) AS clicks"))
            ->
groupBy('country')
            ->
orderBy('clicks', 'desc')
            ->
get();

        return
$stats;
    }

   
/**
     * Fetches referer stats
     *
     * @return DB rows
     */
   
public function getRefererStats()
    {
       
$stats = $this->getBaseRows()
            ->
select(DB::raw("COALESCE(referer_host, 'Direct') as label, count(*) as clicks"))
            ->
groupBy('referer_host')
            ->
orderBy('clicks', 'desc')
            ->
get();

        return
$stats;
    }
}