PHP Classes

File: src/Http/Controllers/StatsController.php

Recommend this page to a friend!
  Classes of Thierry Feuzeu   Polr Restful API   src/Http/Controllers/StatsController.php   Download  
File: src/Http/Controllers/StatsController.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: 7 years ago
Size: 5,678 bytes
 

Contents

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

use
Illuminate\Http\Request;

use
App\Http\Controllers\Controller;
use
App\Helpers\LinkHelper;
use
Lagdo\Polr\Api\Helpers\UserHelper;
use
Lagdo\Polr\Api\Helpers\ResponseHelper;
use
Lagdo\Polr\Api\Helpers\StatsHelper;

class
StatsController extends Controller
{
   
/**
     * Fetch stats from the database
     *
     * @param Request $request The Laravel Request object
     * @param App\Model\Link $link The link to get stats of, or null
     *
     * @return Response
     */
   
protected function fetchStats(Request $request, $link = null)
    {
       
$validator = \Validator::make($request->all(), [
           
'type' => 'required|in:day,country,referer',
           
'left_bound' => 'required|date',
           
'right_bound' => 'required|date'
       
]);
        if(
$validator->fails())
        {
            return
ResponseHelper::make('MISSING_PARAMETERS', 'Invalid or missing parameters.', 400);
        }

       
$left_bound = $request->input('left_bound');
       
$right_bound = $request->input('right_bound');
        try
        {
           
$stats = new StatsHelper(($link) ? $link->id : -1, $left_bound, $right_bound);
        }
        catch (\
Exception $e)
        {
            return
ResponseHelper::make('ANALYTICS_ERROR', $e->getMessage(), 400);
        }

       
$stats_type = $request->input('type');
        if(
$stats_type == 'day')
        {
           
$fetched_stats = $stats->getDayStats();
        }
        else if(
$stats_type == 'country')
        {
           
$fetched_stats = $stats->getCountryStats();
        }
        else if(
$stats_type == 'referer')
        {
           
$fetched_stats = $stats->getRefererStats();
        }
        else
        {
            return
ResponseHelper::make('MISSING_PARAMETERS', 'Invalid analytics type requested.', 400);
        }

        return
ResponseHelper::make(($fetched_stats) ? : []);
    }

   
/**
     * @api {get} /stats Get Stats
     * @apiDescription Fetch stats of a given type.
     * @apiName GetStats
     * @apiGroup Stats
     *
     * @apiParam {String} key The user API key.
     * @apiParam {String} type The type of stats to fetch.
     * @apiParam {String} left_bound The start date.
     * @apiParam {String} right_bound The end date.
     *
     * @apiSuccess {String} message The response message.
     * @apiSuccess {Object} settings The Polr instance config options.
     * @apiSuccess {Mixed} result The stats data.
     *
     * @apiError (Error 401) {Object} AccessDenied The user does not have permission to view stats.
     * @apiError (Error 400) {Object} AnalyticsError An error occurs while fetching stats from the database.
     * @apiError (Error 400) {Object} MissingParameters There is a missing or invalid parameter.
     */
   
public function getStats(Request $request)
    {
        if(!
UserHelper::userIsAdmin($request->user))
        {
            return
ResponseHelper::make('ACCESS_DENIED', 'You do not have permission to view stats for all links.', 401);
        }

       
// Validate the stats type
       
$validator = \Validator::make($request->all(), ['type' => 'required:in:day,country,referer']);
        if(
$validator->fails())
        {
            return
ResponseHelper::make('MISSING_PARAMETERS', 'Invalid or missing parameters.', 400);
        }

        return
$this->fetchStats($request);
    }

   
/**
     * @api {get} /links/:ending/stats Get Link Stats
     * @apiDescription Fetch stats of a given type for a single link.
     * @apiName GetLinkStats
     * @apiGroup Stats
     *
     * @apiParam {String} key The user API key.
     * @apiParam {String} type The type of stats to fetch.
     * @apiParam {String} ending The short URL id of the link.
     * @apiParam {String} left_bound The start date.
     * @apiParam {String} right_bound The end date.
     *
     * @apiSuccess {String} message The response message.
     * @apiSuccess {Object} settings The Polr instance config options.
     * @apiSuccess {Mixed} result The stats data.
     *
     * @apiError (Error 401) {Object} AccessDenied The user does not have permission to view stats.
     * @apiError (Error 400) {Object} AnalyticsError An error occurs while fetching stats from the database.
     * @apiError (Error 400) {Object} MissingParameters There is a missing or invalid parameter.
     */
   
public function getLinkStats(Request $request, $ending)
    {
       
// Validate the stats type
       
$validator = \Validator::make($request->all(), ['type' => 'required:in:day,country,referer']);
        if(
$validator->fails())
        {
            return
ResponseHelper::make('MISSING_PARAMETERS', 'Invalid or missing parameters.', 400);
        }
       
// Validate the link ending
       
$validator = \Validator::make(['ending' => $ending], ['ending' => 'alpha_dash']);
        if(
$validator->fails())
        {
            return
ResponseHelper::make('MISSING_PARAMETERS', 'Invalid or missing parameters.', 400);
        }

       
$link = LinkHelper::linkExists($ending);
        if(
$link === false)
        {
            return
ResponseHelper::make('NOT_FOUND', 'Link not found.', 404);
        }

        if(
$request->user->username != $link->creator && !UserHelper::userIsAdmin($request->user))
        {
            return
ResponseHelper::make('ACCESS_DENIED', 'You do not have permission to view stats for this link.', 401);
        }

        return
$this->fetchStats($request, $link);
    }
}