Merge pull request #651 from cachethq/incident-visibility

Incident visibility
This commit is contained in:
Joe Cohen
2015-06-11 16:59:14 -05:00
9 changed files with 89 additions and 6 deletions

View File

@@ -24,13 +24,16 @@ class IncidentController extends AbstractApiController
* Get all incidents.
*
* @param \Symfony\Component\HttpFoundation\Request $request
* @param \CachetHQ\Cachet\Models\Incident $incident
* @param \Illuminate\Contracts\Auth\Guard $auth
*
* @return \Illuminate\Database\Eloquent\Collection
*/
public function getIncidents(Request $request)
public function getIncidents(Request $request, Guard $auth)
{
$incidents = Incident::paginate(Binput::get('per_page', 20));
$incidentVisiblity = $auth->check() ? 0 : 1;
$incidents = Incident::where('visible', '>=', $incidentVisiblity)
->paginate(Binput::get('per_page', 20));
return $this->paginator($incidents, $request);
}

View File

@@ -19,6 +19,7 @@ use CachetHQ\Cachet\Models\Metric;
use Exception;
use GrahamCampbell\Binput\Facades\Binput;
use GrahamCampbell\Markdown\Facades\Markdown;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\View;
use Jenssegers\Date\Date;
@@ -65,7 +66,9 @@ class HomeController extends AbstractController
$incidentDays = range(0, $daysToShow - 1);
$dateTimeZone = Setting::get('app_timezone');
$allIncidents = Incident::notScheduled()->whereBetween('created_at', [
$incidentVisiblity = Auth::check() ? 0 : 1;
$allIncidents = Incident::notScheduled()->where('visible', '>=', $incidentVisiblity)->whereBetween('created_at', [
$startDate->copy()->subDays($daysToShow)->format('Y-m-d').' 00:00:00',
$startDate->format('Y-m-d').' 23:59:59',
])->orderBy('created_at', 'desc')->get()->groupBy(function (Incident $incident) use ($dateTimeZone) {

View File

@@ -42,6 +42,7 @@ class Incident extends Model implements HasPresenter
'component_id' => 'integer',
'name' => 'required',
'status' => 'required|integer',
'visible' => 'required|boolean',
'message' => 'required',
];
@@ -54,6 +55,7 @@ class Incident extends Model implements HasPresenter
'component_id',
'name',
'status',
'visible',
'message',
'scheduled_at',
'created_at',
@@ -74,6 +76,18 @@ class Incident extends Model implements HasPresenter
*/
protected $dates = ['scheduled_at', 'deleted_at'];
/**
* Finds all visible incidents.
*
* @param \Illuminate\Database\Eloquent\Builder $query
*
* @return \Illuminate\Database\Eloquent\Builder
*/
public function scopeVisible($query)
{
return $query->where('visible', 1);
}
/**
* Finds all scheduled incidents (maintenance).
*

View File

@@ -36,6 +36,7 @@ $factory->define('CachetHQ\Cachet\Models\Incident', function ($faker) {
'name' => $faker->sentence(),
'message' => $faker->paragraph(),
'status' => 1,
'visible' => 1,
];
});

View File

@@ -0,0 +1,45 @@
<?php
/*
* This file is part of Cachet.
*
* (c) James Brooks <james@cachethq.io>
* (c) Joseph Cohen <joseph.cohen@dinkbit.com>
* (c) Graham Campbell <graham@mineuk.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class AlterTableIncidentsAddVisibileColumn extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::table('incidents', function (Blueprint $table) {
$table->boolean('visible')->after('status')->default(1);
$table->index('visible');
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::table('incidents', function (Blueprint $table) {
$table->dropColumn('visible');
});
}
}

View File

@@ -45,8 +45,10 @@ return [
'scheduled_at' => 'When to schedule the maintenance for?',
'incident_time' => 'When did this incident occur?',
'notify_subscribers' => 'Notify subscribers',
'templates' => [
'visibility' => 'Incident Visibility',
'public' => 'Viewable by public',
'logged_in_only' => 'Only visible logged in users',
'templates' => [
'name' => 'Name',
'template' => 'Template',
],

View File

@@ -55,6 +55,13 @@
{{ trans('cachet.incidents.status')[4] }}
</label>
</div>
<div class="form-group">
<label for="incident-name">{{ trans('forms.incidents.visibility') }}</label>
<select name='incident[visible]' class="form-control">
<option value='1' selected>{{ trans('forms.incidents.public') }}</option>
<option value='0'>{{ trans('forms.incidents.logged_in_only') }}</option>
</select>
</div>
@if(!$componentsInGroups->isEmpty() || !$componentsOutGroups->isEmpty())
<div class="form-group">
<label>{{ trans('forms.incidents.component') }}</label>

View File

@@ -44,6 +44,13 @@
{{ trans('cachet.incidents.status')[4] }}
</label>
</div>
<div class="form-group">
<label for="incident-visibility">{{ trans('forms.incidents.visibility') }}</label>
<select name='incident[visible]' id="incident-visibility" class="form-control">
<option value='1' {{ $incident->visible === 1 ? 'selected' : null }}>{{ trans('forms.incidents.public') }}</option>
<option value='0' {{ $incident->visible === 0 ? 'selected' : null }}>{{ trans('forms.incidents.logged_in_only') }}</option>
</select>
</div>
<div class="form-group">
<label>{{ trans('forms.incidents.message') }}</label>
<div class='markdown-control'>

View File

@@ -58,6 +58,7 @@ class IncidentTest extends AbstractTestCase
'name' => 'Foo',
'message' => 'Lorem ipsum dolor sit amet',
'status' => 1,
'visible' => 1,
]);
$this->seeJson(['name' => 'Foo']);
$this->assertResponseOk();