Cachet/app/Presenters/IncidentPresenter.php
2017-06-13 22:51:30 +01:00

312 lines
7.3 KiB
PHP

<?php
/*
* This file is part of Cachet.
*
* (c) Alt Three Services Limited
*
* 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\Models\Incident;
use CachetHQ\Cachet\Presenters\Traits\TimestampsTrait;
use CachetHQ\Cachet\Services\Dates\DateFactory;
use GrahamCampbell\Markdown\Facades\Markdown;
use Illuminate\Contracts\Support\Arrayable;
use McCool\LaravelAutoPresenter\BasePresenter;
class IncidentPresenter extends BasePresenter implements Arrayable
{
use TimestampsTrait;
/**
* The date factory instance.
*
* @var \CachetHQ\Cachet\Services\Dates\DateFactory
*/
protected $dates;
/**
* Incident icon lookup.
*
* @var array
*/
protected $icons = [
0 => 'icon ion-android-calendar', // Scheduled
1 => 'icon ion-flag oranges', // Investigating
2 => 'icon ion-alert yellows', // Identified
3 => 'icon ion-eye blues', // Watching
4 => 'icon ion-checkmark greens', // Fixed
];
/**
* Create a new presenter.
*
* @param \CachetHQ\Cachet\Services\Dates\DateFactory $dates
* @param \CachetHQ\Cachet\Models\Incident $resource
*
* @return void
*/
public function __construct(DateFactory $dates, Incident $resource)
{
$this->dates = $dates;
}
/**
* Renders the message from Markdown into HTML.
*
* @return string
*/
public function formatted_message()
{
return Markdown::convertToHtml($this->wrappedObject->message);
}
/**
* Return the raw text of the message, even without Markdown.
*
* @return string
*/
public function raw_message()
{
return strip_tags($this->formatted_message());
}
/**
* Present formatted occurred_at date time.
*
* @return string
*/
public function occurred_at()
{
return $this->dates->make($this->wrappedObject->occurred_at)->toDateTimeString();
}
/**
* Present diff for humans date time.
*
* @return string
*/
public function occurred_at_diff()
{
return $this->dates->make($this->wrappedObject->occurred_at)->diffForHumans();
}
/**
* Present formatted date time.
*
* @return string
*/
public function occurred_at_formatted()
{
return ucfirst($this->dates->make($this->wrappedObject->occurred_at)->format($this->incidentDateFormat()));
}
/**
* Formats the occurred_at time ready to be used by bootstrap-datetimepicker.
*
* @return string
*/
public function occurred_at_datetimepicker()
{
return $this->dates->make($this->wrappedObject->occurred_at)->format('Y-m-d H:i');
}
/**
* Present formatted date time.
*
* @return string
*/
public function occurred_at_iso()
{
return $this->dates->make($this->wrappedObject->occurred_at)->toISO8601String();
}
/**
* Present diff for humans date time.
*
* @return string
*/
public function created_at_diff()
{
return $this->dates->make($this->wrappedObject->created_at)->diffForHumans();
}
/**
* Present formatted date time.
*
* @return string
*/
public function created_at_formatted()
{
return ucfirst($this->dates->make($this->wrappedObject->created_at)->format($this->incidentDateFormat()));
}
/**
* Present formatted date time.
*
* @return string
*/
public function created_at_iso()
{
return $this->dates->make($this->wrappedObject->created_at)->toISO8601String();
}
/**
* Returns a formatted timestamp for use within the timeline.
*
* @return string
*/
public function timestamp_formatted()
{
return $this->occurred_at_formatted;
}
/**
* Return the iso timestamp for use within the timeline.
*
* @return string
*/
public function timestamp_iso()
{
return $this->occurred_at_iso;
}
/**
* Present the status with an icon.
*
* @return string
*/
public function icon()
{
if (isset($this->icons[$this->wrappedObject->status])) {
return $this->icons[$this->wrappedObject->status];
}
}
/**
* Returns a human readable version of the status.
*
* @return string
*/
public function human_status()
{
return trans('cachet.incidents.status.'.$this->wrappedObject->status);
}
/**
* Returns the latest update.
*
* @return int|null
*/
public function latest_status()
{
if ($update = $this->latest()) {
return $update->status;
}
return $this->wrappedObject->status;
}
/**
* Returns the latest update.
*
* @return string|null
*/
public function latest_human_status()
{
if ($update = $this->latest()) {
return trans('cachet.incidents.status.'.$update->status);
}
return $this->human_status();
}
/**
* Present the latest icon.
*
* @return string
*/
public function latest_icon()
{
if ($update = $this->latest()) {
if (isset($this->icons[$update->status])) {
return $this->icons[$update->status];
}
}
return $this->icon();
}
/**
* Fetch the latest incident update.
*
* @return \CachetHQ\Cachet\Models\IncidentUpdate|void
*/
public function latest()
{
if ($update = $this->wrappedObject->updates()->orderBy('created_at', 'desc')->first()) {
return $update;
}
}
/**
* Get the incident permalink.
*
* @return string
*/
public function permalink()
{
return cachet_route('incident', [$this->wrappedObject->id]);
}
/**
* The duration since the last update (in seconds).
*
* @return int
*/
public function duration()
{
if ($update = $this->latest()) {
return $this->wrappedObject->created_at->diffInSeconds($update->occurred_at);
}
return 0;
}
/**
* Return the meta in a key value pair.
*
* @return array
*/
public function meta()
{
return $this->wrappedObject->meta->pluck('value', 'key')->all();
}
/**
* Convert the presenter instance to an array.
*
* @return string[]
*/
public function toArray()
{
return array_merge($this->wrappedObject->toArray(), [
'human_status' => $this->human_status(),
'latest_update_id' => $this->latest() ? $this->latest()->id : null,
'latest_status' => $this->latest_status(),
'latest_human_status' => $this->latest_human_status(),
'latest_icon' => $this->latest_icon(),
'permalink' => $this->permalink(),
'duration' => $this->duration(),
'meta' => $this->meta(),
'occurred_at' => $this->occurred_at(),
'created_at' => $this->created_at(),
'updated_at' => $this->updated_at(),
]);
}
}