From 33f6bf167c68b8ac38d961d388ca26f922a73521 Mon Sep 17 00:00:00 2001 From: Joseph Cohen Date: Sat, 16 May 2015 13:57:32 -0500 Subject: [PATCH] Make presenters work with the api --- .../Controllers/Api/AbstractApiController.php | 35 ++++++++- app/Http/Controllers/Api/MetricController.php | 4 +- app/Models/Metric.php | 20 ++++- app/Models/MetricPoint.php | 13 +++- app/Presenters/MetricPointPresenter.php | 74 +++++++++++++++++++ app/Presenters/MetricPresenter.php | 74 +++++++++++++++++++ 6 files changed, 209 insertions(+), 11 deletions(-) create mode 100644 app/Presenters/MetricPointPresenter.php create mode 100644 app/Presenters/MetricPresenter.php diff --git a/app/Http/Controllers/Api/AbstractApiController.php b/app/Http/Controllers/Api/AbstractApiController.php index 2cccc15c..6a41b84a 100644 --- a/app/Http/Controllers/Api/AbstractApiController.php +++ b/app/Http/Controllers/Api/AbstractApiController.php @@ -15,8 +15,11 @@ namespace CachetHQ\Cachet\Http\Controllers\Api; use CachetHQ\Cachet\Http\Controllers\AbstractController as BaseController; use Illuminate\Contracts\Pagination\Paginator; +use Illuminate\Contracts\Support\Arrayable; use Illuminate\Http\Request; +use Illuminate\Support\Collection; use Illuminate\Support\Facades\Response; +use McCool\LaravelAutoPresenter\Facades\AutoPresenter; abstract class AbstractApiController extends BaseController { @@ -37,9 +40,9 @@ abstract class AbstractApiController extends BaseController /** * The HTTP response data. * - * @var array + * @var mixed */ - protected $data = []; + protected $data = null; /** * The HTTP response status code. @@ -83,7 +86,7 @@ abstract class AbstractApiController extends BaseController * * @return $this */ - protected function setData(array $data) + protected function setData($data) { $this->data = $data; @@ -104,6 +107,30 @@ abstract class AbstractApiController extends BaseController return $this; } + /** + * Respond with an item response. + * + * @param mixed + * + * @return \Illuminate\Http\JsonResponse + */ + public function item($item) + { + return $this->setData(AutoPresenter::decorate($item))->respond(); + } + + /** + * Respond with a collection response. + * + * @param \Illuminate\Support\Collection $collection + * + * @return \Illuminate\Http\JsonResponse + */ + public function collection(Collection $collection) + { + return $this->setData(AutoPresenter::decorate($collection))->respond(); + } + /** * Respond with a pagination response. * @@ -134,7 +161,7 @@ abstract class AbstractApiController extends BaseController ], ]; - return $this->setMetaData($pagination)->setData($paginator->items())->respond(); + return $this->setMetaData($pagination)->setData(AutoPresenter::decorate($paginator->getCollection()))->respond(); } /** diff --git a/app/Http/Controllers/Api/MetricController.php b/app/Http/Controllers/Api/MetricController.php index 7f91af3e..c7e3119e 100644 --- a/app/Http/Controllers/Api/MetricController.php +++ b/app/Http/Controllers/Api/MetricController.php @@ -57,7 +57,7 @@ class MetricController extends AbstractApiController */ public function getMetric($id) { - return $this->metric->findOrFail($id); + return $this->item($this->metric->findOrFail($id)); } /** @@ -69,7 +69,7 @@ class MetricController extends AbstractApiController */ public function getMetricPoints($id) { - return $this->metric->points($id); + return $this->collection($this->metric->points($id)); } /** diff --git a/app/Models/Metric.php b/app/Models/Metric.php index 7f442bb6..37547215 100644 --- a/app/Models/Metric.php +++ b/app/Models/Metric.php @@ -13,11 +13,13 @@ namespace CachetHQ\Cachet\Models; +use CachetHQ\Cachet\Facades\Setting; use DateInterval; -use DateTime; use Illuminate\Database\Eloquent\Model; use Illuminate\Support\Facades\Config; use Illuminate\Support\Facades\DB; +use Jenssegers\Date\Date; +use McCool\LaravelAutoPresenter\HasPresenter; use Watson\Validating\ValidatingTrait; /** @@ -31,7 +33,7 @@ use Watson\Validating\ValidatingTrait; * @property \Carbon\Carbon $created_at * @property \Carbon\Carbon $updated_at */ -class Metric extends Model +class Metric extends Model implements HasPresenter { use ValidatingTrait; @@ -88,8 +90,8 @@ class Metric extends Model */ public function getValues($hour) { - $dateTime = new DateTime(); - $dateTime->sub(new DateInterval('PT'.$hour.'H')); + $dateTimeZone = Setting::get('app_timezone'); + $dateTime = (new Date())->setTimezone($dateTimeZone)->sub(new DateInterval('PT'.$hour.'H')); $hourInterval = $dateTime->sub(new DateInterval('PT'.$hour.'H'))->format('YmdH'); @@ -140,4 +142,14 @@ class Metric extends Model { return $this->display_chart === 1; } + + /** + * Get the presenter class. + * + * @return string + */ + public function getPresenterClass() + { + return 'CachetHQ\Cachet\Presenters\MetricPresenter'; + } } diff --git a/app/Models/MetricPoint.php b/app/Models/MetricPoint.php index ecf32f9d..53f101f8 100644 --- a/app/Models/MetricPoint.php +++ b/app/Models/MetricPoint.php @@ -14,6 +14,7 @@ namespace CachetHQ\Cachet\Models; use Illuminate\Database\Eloquent\Model; +use McCool\LaravelAutoPresenter\HasPresenter; use Watson\Validating\ValidatingTrait; /** @@ -23,7 +24,7 @@ use Watson\Validating\ValidatingTrait; * @property \Carbon\Carbon $created_at * @property \Carbon\Carbon $updated_at */ -class MetricPoint extends Model +class MetricPoint extends Model implements HasPresenter { use ValidatingTrait; @@ -52,4 +53,14 @@ class MetricPoint extends Model { return $this->belongsTo('CachetHQ\Cachet\Models\Metric', 'id', 'metric_id'); } + + /** + * Get the presenter class. + * + * @return string + */ + public function getPresenterClass() + { + return 'CachetHQ\Cachet\Presenters\MetricPointPresenter'; + } } diff --git a/app/Presenters/MetricPointPresenter.php b/app/Presenters/MetricPointPresenter.php new file mode 100644 index 00000000..0f5b4e19 --- /dev/null +++ b/app/Presenters/MetricPointPresenter.php @@ -0,0 +1,74 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace CachetHQ\Cachet\Presenters; + +use CachetHQ\Cachet\Facades\Setting; +use Illuminate\Contracts\Support\Arrayable; +use Jenssegers\Date\Date; +use McCool\LaravelAutoPresenter\BasePresenter; + +class MetricPointPresenter extends BasePresenter implements Arrayable +{ + /** + * Time zone setting. + * + * @var string + */ + protected $tz; + + /** + * Create a incident presenter instance. + * + * @param object $resource + */ + public function __construct($resource) + { + parent::__construct($resource); + + $this->tz = Setting::get('app_timezone'); + } + + /** + * Present formatted date time. + * + * @return string + */ + public function created_at() + { + return (new Date($this->wrappedObject->created_at)) + ->setTimezone($this->tz)->toDateTimeString(); + } + + /** + * Present formatted date time. + * + * @return string + */ + public function updated_at() + { + return (new Date($this->wrappedObject->updated_at)) + ->setTimezone($this->tz)->toDateTimeString(); + } + + /** + * Convert the presenter instance to an array. + * + * @return array + */ + public function toArray() + { + return array_merge($this->wrappedObject->toArray(), [ + 'created_at' => $this->created_at(), + 'updated_at' => $this->updated_at(), + ]); + } +} diff --git a/app/Presenters/MetricPresenter.php b/app/Presenters/MetricPresenter.php new file mode 100644 index 00000000..122ca0f6 --- /dev/null +++ b/app/Presenters/MetricPresenter.php @@ -0,0 +1,74 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace CachetHQ\Cachet\Presenters; + +use CachetHQ\Cachet\Facades\Setting; +use Illuminate\Contracts\Support\Arrayable; +use Jenssegers\Date\Date; +use McCool\LaravelAutoPresenter\BasePresenter; + +class MetricPresenter extends BasePresenter implements Arrayable +{ + /** + * Time zone setting. + * + * @var string + */ + protected $tz; + + /** + * Create a incident presenter instance. + * + * @param object $resource + */ + public function __construct($resource) + { + parent::__construct($resource); + + $this->tz = Setting::get('app_timezone'); + } + + /** + * Present formatted date time. + * + * @return string + */ + public function created_at() + { + return (new Date($this->wrappedObject->created_at)) + ->setTimezone($this->tz)->toDateTimeString(); + } + + /** + * Present formatted date time. + * + * @return string + */ + public function updated_at() + { + return (new Date($this->wrappedObject->updated_at)) + ->setTimezone($this->tz)->toDateTimeString(); + } + + /** + * Convert the presenter instance to an array. + * + * @return array + */ + public function toArray() + { + return array_merge($this->wrappedObject->toArray(), [ + 'created_at' => $this->created_at(), + 'updated_at' => $this->updated_at(), + ]); + } +}