File: /home/xedaptot/be.naniguide.com/app/Http/Controllers/Refactor/DashboardController.php
<?php
namespace App\Http\Controllers\Refactor;
use App\Http\Controllers\Controller;
use App\Jobs\RefreshCacheableJob;
use App\Library\Cache\AppCache;
use App\Services\Customer\DashboardService;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
class DashboardController extends Controller
{
private const ALLOWED_DAYS = [7, 30, 90];
private const DEFAULT_DAYS = 7;
public function index(Request $request)
{
$customer = $request->user()->customer;
$service = new DashboardService($customer);
$quota = $service->getQuotaUsage();
$bannerContext = $service->getBannerContext();
$emailMetrics = $service->getEmailMetrics();
$sendingTrend = $service->getSendingTrend(7);
$campaignPerformance = $service->getCampaignPerformance(self::DEFAULT_DAYS);
$campaignPerformanceComputedAt = AppCache::for($customer->local())
->lastUpdatedAt('SentByDay_' . self::DEFAULT_DAYS);
$topCampaigns = $service->getTopCampaigns(5);
$topCountries = $service->getTopCountries(5);
$recentCampaigns = $service->getRecentCampaigns(5);
$activityLogs = $service->getActivityLogs(10);
$setupChecklist = $service->getSetupChecklist();
$subscriberBreakdown = $service->getSubscriberBreakdown();
$currentTimezone = $customer->getTimezone();
$dashboardComputedAt = $service->getDashboardComputedAt();
return view('refactor.pages.dashboard_v2', compact(
'customer',
'quota',
'bannerContext',
'emailMetrics',
'sendingTrend',
'campaignPerformance',
'campaignPerformanceComputedAt',
'topCampaigns',
'topCountries',
'recentCampaigns',
'activityLogs',
'setupChecklist',
'subscriberBreakdown',
'currentTimezone',
'dashboardComputedAt'
));
}
public function chartData(Request $request): JsonResponse
{
$days = $this->resolveDays($request);
$customer = $request->user()->customer;
$service = new DashboardService($customer);
$data = $service->getCampaignPerformance($days);
$computedAt = AppCache::for($customer->local())->lastUpdatedAt('SentByDay_' . $days);
return response()->json([
'data' => $data,
'computed_at' => $computedAt ? $customer->formatDateTime($computedAt, 'datetime_full') : null,
'computed_at_relative' => $computedAt?->diffForHumans(),
'computed_at_iso' => $computedAt?->toIso8601String(),
]);
}
public function refreshChart(Request $request): JsonResponse
{
$customer = $request->user()->customer;
$lc = $customer->local();
if ($request->has('days')) {
$days = $this->resolveDays($request);
RefreshCacheableJob::dispatch($lc, 'SentByDay_' . $days);
} else {
RefreshCacheableJob::dispatchAll($lc);
}
return response()->json([
'message' => trans('refactor/dashboard_v2.performance.refresh_dispatched'),
], 202);
}
private function resolveDays(Request $request): int
{
$days = (int) $request->input('days', self::DEFAULT_DAYS);
return in_array($days, self::ALLOWED_DAYS, true) ? $days : self::DEFAULT_DAYS;
}
}