diff --git a/app/Http/Controllers/Api/IncidentController.php b/app/Http/Controllers/Api/IncidentController.php index abf8e6dd..743317fd 100644 --- a/app/Http/Controllers/Api/IncidentController.php +++ b/app/Http/Controllers/Api/IncidentController.php @@ -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); } diff --git a/app/Http/Controllers/HomeController.php b/app/Http/Controllers/HomeController.php index b38de0e8..59307cf1 100644 --- a/app/Http/Controllers/HomeController.php +++ b/app/Http/Controllers/HomeController.php @@ -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) { diff --git a/app/Models/Incident.php b/app/Models/Incident.php index 6c0e166f..10db9647 100644 --- a/app/Models/Incident.php +++ b/app/Models/Incident.php @@ -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). * diff --git a/database/factories/ModelFactory.php b/database/factories/ModelFactory.php index d8a68400..567b9559 100644 --- a/database/factories/ModelFactory.php +++ b/database/factories/ModelFactory.php @@ -36,6 +36,7 @@ $factory->define('CachetHQ\Cachet\Models\Incident', function ($faker) { 'name' => $faker->sentence(), 'message' => $faker->paragraph(), 'status' => 1, + 'visible' => 1, ]; }); diff --git a/database/migrations/2015_05_20_073041_AlterTableIncidentsAddVisibileColumn.php b/database/migrations/2015_05_20_073041_AlterTableIncidentsAddVisibileColumn.php new file mode 100644 index 00000000..eed70699 --- /dev/null +++ b/database/migrations/2015_05_20_073041_AlterTableIncidentsAddVisibileColumn.php @@ -0,0 +1,45 @@ + + * (c) Joseph Cohen + * (c) Graham Campbell + * + * 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'); + }); + } +} diff --git a/resources/lang/en/forms.php b/resources/lang/en/forms.php index 0e2a83b0..d5f34487 100755 --- a/resources/lang/en/forms.php +++ b/resources/lang/en/forms.php @@ -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', ], diff --git a/resources/views/dashboard/incidents/add.blade.php b/resources/views/dashboard/incidents/add.blade.php index a0525c03..b4f0c341 100644 --- a/resources/views/dashboard/incidents/add.blade.php +++ b/resources/views/dashboard/incidents/add.blade.php @@ -55,6 +55,13 @@ {{ trans('cachet.incidents.status')[4] }} +
+ + +
@if(!$componentsInGroups->isEmpty() || !$componentsOutGroups->isEmpty())
diff --git a/resources/views/dashboard/incidents/edit.blade.php b/resources/views/dashboard/incidents/edit.blade.php index 738c57f9..cd4874ac 100644 --- a/resources/views/dashboard/incidents/edit.blade.php +++ b/resources/views/dashboard/incidents/edit.blade.php @@ -44,6 +44,13 @@ {{ trans('cachet.incidents.status')[4] }}
+
+ + +
diff --git a/tests/Api/IncidentTest.php b/tests/Api/IncidentTest.php index 52316391..0d90c958 100644 --- a/tests/Api/IncidentTest.php +++ b/tests/Api/IncidentTest.php @@ -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();