Skip to content

Commit

Permalink
Add visibility to component groups (#2027)
Browse files Browse the repository at this point in the history
Implement visibility for the components groups. Closes #1892

Add functional test that asserts a guest can only see public items.

* Fix tests not running due to hitting the Setup page.

The missing `boostrap/cachet/testing.php` file is now generated the first time tests are ran.

* Add a functional test that asserts logged in users can see all items.

Add constants for possible values for the visible column/field of the ComponentGroup model.
Code review changes.

* Add API tests for component group visibility feature.

* Implement the visibility hidden option for a component group. Fixes #1892.

Add migration for the created_by column, in component_groups table.
Add methods to the ComponentGroup and User models to be able to work with the created_by column.
Hidden component groups are no longer displayed on the index page for loggedin users.
Add functional test for the dashboard page.
Save owner on create/edit component group.
Update the API tests for Component group visibility feature.

* Replace auth() usage with app(Guard::class).

* Apply StyleCI fixes.

* Drop the hidden visibility feature and fix all tests.

Some code review fixes too.

* Rename public to visible since it's a reserved keyword. Apply StyleCI fixes and correct typo.

* Code review changes.

* Tidy up component and component groups gathering.

* Code review changes and StyleCI fixes.

* Code review changes.

* Remove extra whitespace

* Remove useless method.
  • Loading branch information
Marius Palade authored and jbrooksuk committed Oct 2, 2016
1 parent bf769e1 commit ad0954e
Show file tree
Hide file tree
Showing 22 changed files with 602 additions and 27 deletions.
12 changes: 11 additions & 1 deletion app/Bus/Commands/ComponentGroup/AddComponentGroupCommand.php
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,13 @@ final class AddComponentGroupCommand
*/
public $collapsed;

/**
* Is the component visible to public?
*
* @var int
*/
public $visible;

/**
* The validation rules.
*
Expand All @@ -48,6 +55,7 @@ final class AddComponentGroupCommand
'name' => 'required|string',
'order' => 'int',
'collapsed' => 'int|between:0,3',
'visible' => 'bool',
];

/**
Expand All @@ -56,13 +64,15 @@ final class AddComponentGroupCommand
* @param string $name
* @param int $order
* @param int $collapsed
* @param int $visible
*
* @return void
*/
public function __construct($name, $order, $collapsed)
public function __construct($name, $order, $collapsed, $visible)
{
$this->name = $name;
$this->order = (int) $order;
$this->collapsed = $collapsed;
$this->visible = (int) $visible;
}
}
12 changes: 11 additions & 1 deletion app/Bus/Commands/ComponentGroup/UpdateComponentGroupCommand.php
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,13 @@ final class UpdateComponentGroupCommand
*/
public $collapsed;

/**
* Is the component visible to public?
*
* @var int
*/
public $visible;

/**
* The validation rules.
*
Expand All @@ -57,6 +64,7 @@ final class UpdateComponentGroupCommand
'name' => 'string',
'order' => 'int',
'collapsed' => 'int|between:0,3',
'visible' => 'bool',
];

/**
Expand All @@ -66,14 +74,16 @@ final class UpdateComponentGroupCommand
* @param string $name
* @param int $order
* @param int $collapsed
* @param int $visible
*
* @return void
*/
public function __construct(ComponentGroup $group, $name, $order, $collapsed)
public function __construct(ComponentGroup $group, $name, $order, $collapsed, $visible)
{
$this->group = $group;
$this->name = $name;
$this->order = (int) $order;
$this->collapsed = $collapsed;
$this->visible = (int) $visible;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ public function handle(AddComponentGroupCommand $command)
'name' => $command->name,
'order' => $command->order,
'collapsed' => $command->collapsed,
'visible' => $command->visible,
]);

event(new ComponentGroupWasAddedEvent($group));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,7 @@ protected function filter(UpdateComponentGroupCommand $command)
'name' => $command->name,
'order' => $command->order,
'collapsed' => $command->collapsed,
'visible' => $command->visible,
];

return array_filter($params, function ($val) {
Expand Down
44 changes: 40 additions & 4 deletions app/Composers/Modules/ComponentsComposer.php
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@

use CachetHQ\Cachet\Models\Component;
use CachetHQ\Cachet\Models\ComponentGroup;
use Illuminate\Contracts\Auth\Guard;
use Illuminate\Contracts\View\View;

/**
Expand All @@ -23,6 +24,25 @@
*/
class ComponentsComposer
{
/**
* The user session object.
*
* @var \Illuminate\Contracts\Auth\Guard
*/
protected $guard;

/**
* Creates a new components composer instance.
*
* @param \Illuminate\Contracts\Auth\Guard $guard
*
* @return void
*/
public function __construct(Guard $guard)
{
$this->guard = $guard;
}

/**
* Index page view composer.
*
Expand All @@ -32,12 +52,28 @@ class ComponentsComposer
*/
public function compose(View $view)
{
// Component & Component Group lists.
$usedComponentGroups = Component::enabled()->where('group_id', '>', 0)->groupBy('group_id')->pluck('group_id');
$componentGroups = ComponentGroup::whereIn('id', $usedComponentGroups)->orderBy('order')->get();
$ungroupedComponents = Component::enabled()->where('group_id', 0)->orderBy('order')->orderBy('created_at')->get();
$componentGroups = $this->getVisibleGroupedComponents();
$ungroupedComponents = Component::ungrouped()->get();

$view->withComponentGroups($componentGroups)
->withUngroupedComponents($ungroupedComponents);
}

/**
* Get visible grouped components.
*
* @return \Illuminate\Support\Collection
*/
protected function getVisibleGroupedComponents()
{
$componentGroupsBuilder = ComponentGroup::query();
if (!$this->guard->check()) {
$componentGroupsBuilder->visible();
}

$usedComponentGroups = Component::grouped()->pluck('group_id');

return $componentGroupsBuilder->used($usedComponentGroups)
->get();
}
}
2 changes: 2 additions & 0 deletions app/Console/Commands/DemoSeederCommand.php
Original file line number Diff line number Diff line change
Expand Up @@ -106,10 +106,12 @@ protected function seedComponentGroups()
'name' => 'Websites',
'order' => 1,
'collapsed' => 0,
'visible' => ComponentGroup::VISIBLE_AUTHENTICATED,
], [
'name' => 'Alt Three',
'order' => 2,
'collapsed' => 1,
'visible' => ComponentGroup::VISIBLE_GUEST,
],
];

Expand Down
27 changes: 25 additions & 2 deletions app/Http/Controllers/Api/ComponentGroupController.php
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
use CachetHQ\Cachet\Bus\Commands\ComponentGroup\UpdateComponentGroupCommand;
use CachetHQ\Cachet\Models\ComponentGroup;
use GrahamCampbell\Binput\Facades\Binput;
use Illuminate\Contracts\Auth\Guard;
use Illuminate\Database\QueryException;
use Illuminate\Support\Facades\Request;
use Symfony\Component\HttpKernel\Exception\BadRequestHttpException;
Expand All @@ -29,6 +30,23 @@
*/
class ComponentGroupController extends AbstractApiController
{
/**
* The user session object.
*
* @var \Illuminate\Contracts\Auth\Guard
*/
protected $guard;

/**
* Creates a new component group controller instance.
*
* @param \Illuminate\Contracts\Auth\Guard $guard
*/
public function __construct(Guard $guard)
{
$this->guard = $guard;
}

/**
* Get all groups.
*
Expand All @@ -37,6 +55,9 @@ class ComponentGroupController extends AbstractApiController
public function getGroups()
{
$groups = ComponentGroup::query();
if (!$this->guard->check()) {
$groups = ComponentGroup::visible();
}

$groups->search(Binput::except(['sort', 'order', 'per_page']));

Expand Down Expand Up @@ -74,7 +95,8 @@ public function postGroups()
$group = dispatch(new AddComponentGroupCommand(
Binput::get('name'),
Binput::get('order', 0),
Binput::get('collapsed', 0)
Binput::get('collapsed', 0),
Binput::get('visible', ComponentGroup::VISIBLE_AUTHENTICATED)
));
} catch (QueryException $e) {
throw new BadRequestHttpException();
Expand All @@ -97,7 +119,8 @@ public function putGroup(ComponentGroup $group)
$group,
Binput::get('name'),
Binput::get('order'),
Binput::get('collapsed')
Binput::get('collapsed'),
Binput::get('visible')
));
} catch (QueryException $e) {
throw new BadRequestHttpException();
Expand Down
6 changes: 4 additions & 2 deletions app/Http/Controllers/Dashboard/ComponentController.php
Original file line number Diff line number Diff line change
Expand Up @@ -277,7 +277,8 @@ public function postAddComponentGroup()
$group = dispatch(new AddComponentGroupCommand(
Binput::get('name'),
Binput::get('order', 0),
Binput::get('collapsed')
Binput::get('collapsed'),
Binput::get('visible')
));
} catch (ValidationException $e) {
return Redirect::route('dashboard.components.groups.add')
Expand All @@ -304,7 +305,8 @@ public function updateComponentGroupAction(ComponentGroup $group)
$group,
Binput::get('name'),
$group->order,
Binput::get('collapsed')
Binput::get('collapsed'),
Binput::get('visible')
));
} catch (ValidationException $e) {
return Redirect::route('dashboard.components.groups.edit', ['id' => $group->id])
Expand Down
36 changes: 32 additions & 4 deletions app/Http/Controllers/Dashboard/DashboardController.php
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
use CachetHQ\Cachet\Models\ComponentGroup;
use CachetHQ\Cachet\Models\Incident;
use CachetHQ\Cachet\Models\Subscriber;
use Illuminate\Contracts\Auth\Guard;
use Illuminate\Routing\Controller;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Config;
Expand Down Expand Up @@ -52,16 +53,25 @@ class DashboardController extends Controller
*/
protected $feed;

/**
* The user session object.
*
* @var \Illuminate\Contracts\Auth\Guard
*/
protected $guard;

/**
* Creates a new dashboard controller instance.
*
* @param \CachetHQ\Cachet\Integrations\Feed $feed
* @param \Illuminate\Contracts\Auth\Guard $guard
*
* @return void
*/
public function __construct(Feed $feed)
public function __construct(Feed $feed, Guard $guard)
{
$this->feed = $feed;
$this->guard = $guard;
$this->startDate = new Date();
$this->dateTimeZone = Config::get('cachet.timezone');
}
Expand All @@ -86,9 +96,9 @@ public function showDashboard()
$components = Component::orderBy('order')->get();
$incidents = $this->getIncidents();
$subscribers = $this->getSubscribers();
$usedComponentGroups = Component::enabled()->where('group_id', '>', 0)->groupBy('group_id')->pluck('group_id');
$componentGroups = ComponentGroup::whereIn('id', $usedComponentGroups)->orderBy('order')->get();
$ungroupedComponents = Component::enabled()->where('group_id', 0)->orderBy('order')->orderBy('created_at')->get();

$componentGroups = $this->getVisibleGroupedComponents();
$ungroupedComponents = Component::ungrouped()->get();

$welcomeUser = !Auth::user()->welcomed;
if ($welcomeUser) {
Expand Down Expand Up @@ -174,4 +184,22 @@ protected function getSubscribers()

return $allSubscribers;
}

/**
* Get visible grouped components.
*
* @return \Illuminate\Support\Collection
*/
protected function getVisibleGroupedComponents()
{
$componentGroupsBuilder = ComponentGroup::query();
if (!$this->guard->check()) {
$componentGroupsBuilder = ComponentGroup::visible();
}

$usedComponentGroups = Component::grouped()->pluck('group_id');

return $componentGroupsBuilder->used($usedComponentGroups)
->get();
}
}
29 changes: 29 additions & 0 deletions app/Models/Component.php
Original file line number Diff line number Diff line change
Expand Up @@ -188,6 +188,35 @@ public function scopeDisabled(Builder $query)
return $query->where('enabled', false);
}

/**
* Finds all ungrouped components.
*
* @param \Illuminate\Database\Eloquent\Builder $query
*
* @return \Illuminate\Database\Eloquent\Builder
*/
public function scopeUngrouped(Builder $query)
{
return $query->enabled()
->where('group_id', 0)
->orderBy('order')
->orderBy('created_at');
}

/**
* Finds all grouped components.
*
* @param \Illuminate\Database\Eloquent\Builder $query
*
* @return \Illuminate\Database\Eloquent\Builder
*/
public function scopeGrouped(Builder $query)
{
return $query->enabled()
->where('group_id', '>', 0)
->groupBy('group_id');
}

/**
* Returns all of the tags on this component.
*
Expand Down
Loading

0 comments on commit ad0954e

Please sign in to comment.