From 4e972094949c6a3b3e1eb3efe70f98394ab31b1c Mon Sep 17 00:00:00 2001 From: James Collins Date: Thu, 25 May 2023 07:13:35 +1000 Subject: [PATCH] fixes to support analytics --- app/Conductors/AnalyticsConductor.php | 7 +++ .../Controllers/Api/AnalyticsController.php | 50 +++++++++++++++---- routes/api.php | 1 + 3 files changed, 48 insertions(+), 10 deletions(-) diff --git a/app/Conductors/AnalyticsConductor.php b/app/Conductors/AnalyticsConductor.php index cd257da..f957b60 100644 --- a/app/Conductors/AnalyticsConductor.php +++ b/app/Conductors/AnalyticsConductor.php @@ -27,6 +27,13 @@ class AnalyticsConductor extends Conductor */ protected $sort = 'created_at'; + /** + * The default includes to include in a request. + * + * @var array + */ + protected $includes = ['duration']; + /** * Return if the current model is visible. diff --git a/app/Http/Controllers/Api/AnalyticsController.php b/app/Http/Controllers/Api/AnalyticsController.php index 8167905..541c971 100644 --- a/app/Http/Controllers/Api/AnalyticsController.php +++ b/app/Http/Controllers/Api/AnalyticsController.php @@ -3,6 +3,7 @@ namespace App\Http\Controllers\Api; use App\Conductors\AnalyticsConductor; +use App\Conductors\Conductor; use App\Enum\HttpResponseCodes; use App\Http\Requests\AnalyticsRequest; use App\Models\Media; @@ -37,14 +38,34 @@ class AnalyticsController extends ApiController */ public function index(Request $request) { - list($collection, $total) = AnalyticsConductor::request($request); + if ($request->user() !== null && $request->user()?->hasPermission('admin/analytics') === true) { + $searchFields = ['attribute', 'type', 'useragent', 'ip']; - return $this->respondAsResource( - $collection, - ['isCollection' => true, - 'appendData' => ['total' => $total] - ] - ); + $queryRequest = new Request(); + $queryRequest->merge($request->only($searchFields)); + foreach ($searchFields as $field) { + unset($request[$field]); + } + + $query = Analytics::query() + ->selectRaw('session, + MIN(created_at) as created_at, + TIMESTAMPDIFF(MINUTE, MIN(created_at), MAX(created_at)) as duration'); + $query = Conductor::filterQuery($query, $queryRequest); + + list($collection, $total) = AnalyticsConductor::collection($request, $query + ->groupBy('session') + ->get()); + + return $this->respondAsResource( + $collection, + ['isCollection' => true, + 'appendData' => ['total' => $total] + ] + ); + }//end if + + return $this->respondForbidden(); } /** @@ -54,10 +75,19 @@ class AnalyticsController extends ApiController * @param \App\Models\Analytics $analytics The analyics model. * @return \Illuminate\Http\Response */ - public function show(Request $request, Analytics $analytics) + public function show(Request $request, int $session) { - if (AnalyticsConductor::viewable($analytics) === true) { - return $this->respondAsResource(AnalyticsConductor::model($request, $analytics)); + if ($request->user() !== null && $request->user()?->hasPermission('admin/analytics') === true) { + list($collection, $total) = AnalyticsConductor::collection($request, Analytics::query() + ->where('session', $session) + ->get()); + + return $this->respondAsResource( + $collection, + ['isCollection' => true, + 'appendData' => ['total' => $total] + ] + ); } return $this->respondForbidden(); diff --git a/routes/api.php b/routes/api.php index 50c9fdc..c60f90d 100644 --- a/routes/api.php +++ b/routes/api.php @@ -27,6 +27,7 @@ Route::post('/login', [AuthController::class, 'login'])->name('login'); Route::post('/register', [UserController::class, 'register']); Route::get('/analytics', [AnalyticsController::class, 'index']); +Route::get('/analytics/{session}', [AnalyticsController::class, 'show']); Route::post('/analytics', [AnalyticsController::class, 'store']); Route::apiResource('users', UserController::class);