From 2565774fead9c30db99bcf35830d16fcb64ed6f0 Mon Sep 17 00:00:00 2001 From: James Brooks Date: Wed, 17 Feb 2016 17:07:34 +0000 Subject: [PATCH] Load metrics via AJAX. Fixes #819 --- app/Composers/MetricsComposer.php | 31 +------- app/Http/Controllers/StatusPageController.php | 55 ++++++++++++- app/Http/Routes/StatusPageRoutes.php | 5 ++ resources/views/partials/metrics.blade.php | 79 +++++++++---------- 4 files changed, 99 insertions(+), 71 deletions(-) diff --git a/app/Composers/MetricsComposer.php b/app/Composers/MetricsComposer.php index 55230890..86a5e7ee 100644 --- a/app/Composers/MetricsComposer.php +++ b/app/Composers/MetricsComposer.php @@ -12,29 +12,11 @@ namespace CachetHQ\Cachet\Composers; use CachetHQ\Cachet\Models\Metric; -use CachetHQ\Cachet\Repositories\Metric\MetricRepository; use Illuminate\Contracts\View\View; use Illuminate\Support\Facades\Config; class MetricsComposer { - /** - * @var \CachetHQ\Cachet\Repositories\Metric\MetricRepository - */ - protected $metricRepository; - - /** - * Construct a new home controller instance. - * - * @param \CachetHQ\Cachet\Repositories\Metric\MetricRepository $metricRepository - * - * @return void - */ - public function __construct(MetricRepository $metricRepository) - { - $this->metricRepository = $metricRepository; - } - /** * Metrics view composer. * @@ -45,22 +27,11 @@ class MetricsComposer public function compose(View $view) { $metrics = null; - $metricData = []; if ($displayMetrics = Config::get('setting.display_graphs')) { $metrics = Metric::where('display_chart', 1)->orderBy('id')->get(); - - $metrics->map(function ($metric) use (&$metricData) { - $metricData[$metric->id] = [ - 'last_hour' => $this->metricRepository->listPointsLastHour($metric), - 'today' => $this->metricRepository->listPointsToday($metric), - 'week' => $this->metricRepository->listPointsForWeek($metric), - 'month' => $this->metricRepository->listPointsForMonth($metric), - ]; - }); } $view->withDisplayMetrics($displayMetrics) - ->withMetrics($metrics) - ->withMetricData($metricData); + ->withMetrics($metrics); } } diff --git a/app/Http/Controllers/StatusPageController.php b/app/Http/Controllers/StatusPageController.php index 24b398bd..a288ba59 100644 --- a/app/Http/Controllers/StatusPageController.php +++ b/app/Http/Controllers/StatusPageController.php @@ -12,7 +12,10 @@ namespace CachetHQ\Cachet\Http\Controllers; use CachetHQ\Cachet\Dates\DateFactory; +use CachetHQ\Cachet\Http\Controllers\Api\AbstractApiController; use CachetHQ\Cachet\Models\Incident; +use CachetHQ\Cachet\Models\Metric; +use CachetHQ\Cachet\Repositories\Metric\MetricRepository; use Exception; use GrahamCampbell\Binput\Facades\Binput; use Illuminate\Routing\Controller; @@ -21,8 +24,25 @@ use Illuminate\Support\Facades\Config; use Illuminate\Support\Facades\View; use Jenssegers\Date\Date; -class StatusPageController extends Controller +class StatusPageController extends AbstractApiController { + /** + * @var \CachetHQ\Cachet\Repositories\Metric\MetricRepository + */ + protected $metricRepository; + + /** + * Construct a new status page controller instance. + * + * @param \CachetHQ\Cachet\Repositories\Metric\MetricRepository $metricRepository + * + * @return void + */ + public function __construct(MetricRepository $metricRepository) + { + $this->metricRepository = $metricRepository; + } + /** * Displays the status page. * @@ -100,4 +120,37 @@ class StatusPageController extends Controller return View::make('incident') ->withIncident($incident); } + + /** + * Returns metrics in a readily formatted way. + * + * @param \CachetHQ\Cachet\Models\Metric $metric + * + * @return \Illuminate\Http\JsonResponse + */ + public function getMetrics(Metric $metric) + { + $metricData = []; + $type = Binput::get('filter', 'last_hour'); + + switch ($type) { + case 'last_hour': + $metricData = $this->metricRepository->listPointsLastHour($metric); + break; + case 'today': + $metricData = $this->metricRepository->listPointsToday($metric); + break; + case 'week': + $metricData = $this->metricRepository->listPointsForWeek($metric); + break; + case 'month': + $metricData = $this->metricRepository->listPointsForMonth($metric); + break; + } + + return $this->item([ + 'metric' => $metric->toArray(), + 'items' => $metricData, + ]); + } } diff --git a/app/Http/Routes/StatusPageRoutes.php b/app/Http/Routes/StatusPageRoutes.php index d9eb3718..93ac1440 100644 --- a/app/Http/Routes/StatusPageRoutes.php +++ b/app/Http/Routes/StatusPageRoutes.php @@ -39,6 +39,11 @@ class StatusPageRoutes 'as' => 'incident', 'uses' => 'StatusPageController@showIncident', ]); + + $router->get('metrics/{metric}', [ + 'as' => 'metrics', + 'uses' => 'StatusPageController@getMetrics', + ]); }); } } diff --git a/resources/views/partials/metrics.blade.php b/resources/views/partials/metrics.blade.php index a0ff2c7b..22381fe1 100644 --- a/resources/views/partials/metrics.blade.php +++ b/resources/views/partials/metrics.blade.php @@ -33,73 +33,72 @@ @endforeach -