ldc-qrcollector-back/app/Http/Controllers/Api/UrlController.php

140 lines
4.3 KiB
PHP

<?php
namespace App\Http\Controllers\Api;
use App\Http\Controllers\Controller;
use App\Http\Resources\UrlCollection;
use App\Http\Resources\UrlHistoryCollection;
use App\Http\Resources\UrlResource;
use App\Http\Resources\UrlStatsCollection;
use App\Models\Url;
use Carbon\Carbon;
use Carbon\CarbonPeriod;
use DateTime;
use Illuminate\Http\Request;
class UrlController extends Controller
{
/**
* Returns a listing of the urls.
*
* @return \Illuminate\Http\Response
*/
public function index()
{
return new UrlCollection(Url::paginate(25));
}
/**
* Returns the specified url.
*
* @param Url $url
* @return \Illuminate\Http\Response
*/
public function show(Url $url)
{
return new UrlResource($url);
}
/**
* Returns the history for a given url.
*
* @param Url $url
* @param Request $request
* @return \Illuminate\Http\Response
*/
public function getHistory(Url $url, Request $request)
{
// Set start date with request or now - 1 year.
if ($request->start) {
$start = $request->start;
$start = DateTime::createFromFormat('dmY', $start);
} else {
$start = now()->modify('-1 year');
}
// Set end date with request or now.
if ($request->end) {
$end = $request->end;
$end = DateTime::createFromFormat('dmY', $end)->modify('+1 day');
} else {
$end = now();
}
// Check if the difference bewteen end and start is < than 1 year.
if ($start->diff($end)->days > 366) {
return response('Date interval too long', 403);
};
$history = $url->history()
->where('start_date', '>', $start)
->where('end_date', '<', $end)
->get();
return new UrlHistoryCollection($history);
}
/**
* Returns the stats for the given url.
*
* @param Request $request
* @param Url $url
* @return \Illuminate\Http\Response
*/
public function getstats(Request $request, Url $url)
{
// Set end date with request or now.
if ($request->period) {
$period = \App\Enums\Api\ApiPeriodEnum::{$request->period}();
} else {
$period = \App\Enums\Api\ApiPeriodEnum::day();
}
// Set start date with request or now - 1 year.
if ($request->start) {
$start = $request->start;
$start = Carbon::create($start);
} else {
$start = now()->modify('-1 year');
}
// Set end date with request or now.
if ($request->end) {
$end = $request->end;
$end = Carbon::create($end);
} else {
$end = now();
}
// Check if the difference bewteen end and start is < than 1 year.
if ($start->diff($end)->days > 366) {
return response('Date interval too long', 403);
};
switch ($period->label) {
case \App\Enums\Api\ApiPeriodEnum::day()->label:
$stats = $url->stats()
->whereDate('date', '>', $start)
->whereDate('date', '<=', $end)
->get();
break;
case \App\Enums\Api\ApiPeriodEnum::week()->label:
$stats = $url->stats()
->whereIn(
'date',
CarbonPeriod::create(
$start->startOfWeek(Carbon::MONDAY)->format('Y-m-d'),
$end->endOfWeek(Carbon::SUNDAY)->format('Y-m-d')
)->toArray()
)
->get();
break;
case \App\Enums\Api\ApiPeriodEnum::month()->label:
$stats = $url->stats()
->whereIn(
'date',
CarbonPeriod::create(
$start->startOfMonth()->format('Y-m-d'),
$end->endOfMonth()->format('Y-m-d')
)->toArray()
)
->get();
break;
} //end switch
return \response()->json(new UrlStatsCollection($stats));
}
}