Skip to content
Snippets Groups Projects
Verified Commit 9c350454 authored by Sofiane Lasri's avatar Sofiane Lasri
Browse files

feat: Refactor HomeController to improve visit tracking logic

- Simplified the filtering of public routes by using a single chain of methods.
- Optimized the selection of visit data with raw SQL and aggregate functions.
- Replaced manual counting of visits by day and country with collection methods for better readability and performance.
- Removed unnecessary logging of most visited pages, now handled more efficiently with grouping and sorting.
parent 619b2cc3
Branches
No related tags found
1 merge request!57Resolve "Compléter home dashboard admin avec les stats journaliers du site"
Pipeline #1013 passed
......@@ -3,7 +3,7 @@
namespace App\Http\Controllers\Admin;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Log;
use Carbon\Carbon;
use Illuminate\Support\Facades\Route;
use Illuminate\Support\Str;
use Illuminate\View\View;
......@@ -13,77 +13,50 @@ class HomeController extends Controller
{
public function index(): View
{
$publicRoutes = collect(Route::getRoutes()->getRoutes());
$publicRoutes = $publicRoutes->filter(function ($route) {
$isNotAdmin = ! Str::startsWith($route->uri, 'admin');
$isNotEmpty = $route->uri !== '/' && ! empty($route->uri);
$isNotApi = ! Str::startsWith($route->uri, 'api');
return $isNotAdmin && $isNotEmpty && $isNotApi;
});
$visits = LoggedRequest::select('url_id', 'ip_address_id', 'created_at', 'country_code', 'urls.url')
->distinct('url_id', 'ip_address_id')
$publicRoutes = collect(Route::getRoutes()->getRoutes())
->filter(fn ($route) => ! Str::startsWith($route->uri, ['admin', 'api']) && ! empty($route->uri) && $route->uri !== '/')
->pluck('uri');
$visits = LoggedRequest::selectRaw('
logged_requests.url_id,
logged_requests.ip_address_id,
logged_requests.country_code,
logged_requests.created_at,
urls.url
')
->distinct('logged_requests.url_id', 'logged_requests.ip_address_id')
->join('urls', 'logged_requests.url_id', '=', 'urls.id')
->where(function ($query) use ($publicRoutes) {
foreach ($publicRoutes as $route) {
$query->orWhere('urls.url', 'like', '%'.$route->uri.'%');
foreach ($publicRoutes as $uri) {
$query->orWhere('urls.url', 'like', "%$uri%");
}
})
->get();
$totalVisitsPastTwentyFourHours = $visits->where('created_at', '>=', now()->subDay());
$totalVisitsPastSevenDays = $visits->where('created_at', '>=', now()->subDays(7));
$totalVisitsPastThirtyDays = $visits->where('created_at', '>=', now()->subDays(30));
$totalVisitsAllTime = $visits;
$visitsPerDay = [];
foreach ($visits as $visit) {
$date = $visit->created_at->format('Y-m-d');
if (! isset($visitsPerDay[$date])) {
$visitsPerDay[$date] = 0;
}
$visitsPerDay[$date]++;
}
$visitsPerDay = collect($visitsPerDay)->map(function ($count, $date) {
return ['date' => $date, 'count' => $count];
})->values();
$visitsByCountry = [];
$now = now();
$totalVisitsPastTwentyFourHours = $visits->where('created_at', '>=', $now->subDay())->count();
$totalVisitsPastSevenDays = $visits->where('created_at', '>=', $now->subDays(7))->count();
$totalVisitsPastThirtyDays = $visits->where('created_at', '>=', $now->subDays(30))->count();
$totalVisitsAllTime = $visits->count();
foreach ($visits as $visit) {
if (! isset($visitsByCountry[$visit->country_code])) {
$visitsByCountry[$visit->country_code] = 0;
}
$visitsByCountry[$visit->country_code]++;
}
$visitsByCountry = collect($visitsByCountry)->map(function ($count, $country) {
return ['country' => $country, 'count' => $count];
})->values();
$mostVisitedPages = [];
foreach ($visits as $visit) {
if (! isset($mostVisitedPages[$visit->url])) {
$mostVisitedPages[$visit->url] = 0;
}
$mostVisitedPages[$visit->url]++;
}
$visitsPerDay = $visits->groupBy(fn ($visit) => Carbon::parse($visit->created_at)->format('Y-m-d'))
->map(fn ($group) => ['date' => $group->first()->created_at->format('Y-m-d'), 'count' => $group->count()])
->values();
$mostVisitedPages = collect($mostVisitedPages)->map(function ($count, $url) {
return ['url' => $url, 'count' => $count];
})->values();
$visitsByCountry = $visits->groupBy('country_code')
->map(fn ($group, $country) => ['country' => $country, 'count' => $group->count()])
->values();
Log::info(json_encode($mostVisitedPages));
$mostVisitedPages = $visits->groupBy('url')
->map(fn ($group, $url) => ['url' => $url, 'count' => $group->count()])
->sortByDesc('count')
->values();
return view('admin.home', [
'totalVisitsPastTwentyFourHours' => $totalVisitsPastTwentyFourHours->count(),
'totalVisitsPastSevenDays' => $totalVisitsPastSevenDays->count(),
'totalVisitsPastThirtyDays' => $totalVisitsPastThirtyDays->count(),
'totalVisitsAllTime' => $totalVisitsAllTime->count(),
'totalVisitsPastTwentyFourHours' => $totalVisitsPastTwentyFourHours,
'totalVisitsPastSevenDays' => $totalVisitsPastSevenDays,
'totalVisitsPastThirtyDays' => $totalVisitsPastThirtyDays,
'totalVisitsAllTime' => $totalVisitsAllTime,
'visitsPerDay' => $visitsPerDay,
'visitsByCountry' => $visitsByCountry,
'mostVisitedPages' => $mostVisitedPages,
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please to comment