Added component groups API. Closes #801
This commit is contained in:
100
app/Http/Controllers/Api/ComponentGroupController.php
Normal file
100
app/Http/Controllers/Api/ComponentGroupController.php
Normal file
@@ -0,0 +1,100 @@
|
|||||||
|
<?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\Http\Controllers\Api;
|
||||||
|
|
||||||
|
use CachetHQ\Cachet\Models\ComponentGroup;
|
||||||
|
use Exception;
|
||||||
|
use GrahamCampbell\Binput\Facades\Binput;
|
||||||
|
use Illuminate\Http\Request;
|
||||||
|
use Symfony\Component\HttpKernel\Exception\BadRequestHttpException;
|
||||||
|
|
||||||
|
class ComponentGroupController extends AbstractApiController
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Get all groups.
|
||||||
|
*
|
||||||
|
* @param \Symfony\Component\HttpFoundation\Request $request
|
||||||
|
*
|
||||||
|
* @return \Illuminate\Http\JsonResponse
|
||||||
|
*/
|
||||||
|
public function getGroups(Request $request)
|
||||||
|
{
|
||||||
|
$groups = ComponentGroup::paginate(Binput::get('per_page', 20));
|
||||||
|
|
||||||
|
return $this->paginator($groups, $request);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get a single group.
|
||||||
|
*
|
||||||
|
* @param \CachetHQ\Cachet\Models\ComponentGroup $group
|
||||||
|
*
|
||||||
|
* @return \Illuminate\Http\JsonResponse
|
||||||
|
*/
|
||||||
|
public function getGroup(ComponentGroup $group)
|
||||||
|
{
|
||||||
|
return $this->item($group);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a new component group.
|
||||||
|
*
|
||||||
|
* @return \Illuminate\Http\JsonResponse
|
||||||
|
*/
|
||||||
|
public function postGroups()
|
||||||
|
{
|
||||||
|
$groupData = array_filter(Binput::only(['name', 'order']));
|
||||||
|
|
||||||
|
try {
|
||||||
|
$group = ComponentGroup::create($groupData);
|
||||||
|
} catch (Exception $e) {
|
||||||
|
throw new BadRequestHttpException();
|
||||||
|
}
|
||||||
|
|
||||||
|
return $this->item($group);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Update an existing group.
|
||||||
|
*
|
||||||
|
* @param \CachetHQ\Cachet\Models\ComponentGroup $group
|
||||||
|
*
|
||||||
|
* @return \Illuminate\Http\JsonResponse
|
||||||
|
*/
|
||||||
|
public function putGroup(ComponentGroup $group)
|
||||||
|
{
|
||||||
|
$groupData = array_filter(Binput::only(['name', 'order']));
|
||||||
|
|
||||||
|
try {
|
||||||
|
$group->update($groupData);
|
||||||
|
} catch (Exception $e) {
|
||||||
|
dd($e->getMessage());
|
||||||
|
throw new BadRequestHttpException();
|
||||||
|
}
|
||||||
|
|
||||||
|
return $this->item($group);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Delete an existing group.
|
||||||
|
*
|
||||||
|
* @param \CachetHQ\Cachet\Models\ComponentGroup $group
|
||||||
|
*
|
||||||
|
* @return \Illuminate\Http\JsonResponse
|
||||||
|
*/
|
||||||
|
public function deleteGroup(ComponentGroup $group)
|
||||||
|
{
|
||||||
|
$group->delete();
|
||||||
|
|
||||||
|
return $this->noContent();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -32,6 +32,8 @@ class ApiRoutes
|
|||||||
|
|
||||||
// Components
|
// Components
|
||||||
$router->get('components', 'ComponentController@getComponents');
|
$router->get('components', 'ComponentController@getComponents');
|
||||||
|
$router->get('components/groups', 'ComponentGroupController@getGroups');
|
||||||
|
$router->get('components/groups/{component_group}', 'ComponentGroupController@getGroup');
|
||||||
$router->get('components/{component}', 'ComponentController@getComponent');
|
$router->get('components/{component}', 'ComponentController@getComponent');
|
||||||
|
|
||||||
// Incidents
|
// Incidents
|
||||||
@@ -48,16 +50,19 @@ class ApiRoutes
|
|||||||
$router->get('subscribers', 'SubscriberController@getSubscribers');
|
$router->get('subscribers', 'SubscriberController@getSubscribers');
|
||||||
|
|
||||||
$router->post('components', 'ComponentController@postComponents');
|
$router->post('components', 'ComponentController@postComponents');
|
||||||
|
$router->post('components/groups', 'ComponentGroupController@postGroups');
|
||||||
$router->post('incidents', 'IncidentController@postIncidents');
|
$router->post('incidents', 'IncidentController@postIncidents');
|
||||||
$router->post('metrics', 'MetricController@postMetrics');
|
$router->post('metrics', 'MetricController@postMetrics');
|
||||||
$router->post('metrics/{metric}/points', 'MetricPointController@postMetricPoints');
|
$router->post('metrics/{metric}/points', 'MetricPointController@postMetricPoints');
|
||||||
$router->post('subscribers', 'SubscriberController@postSubscribers');
|
$router->post('subscribers', 'SubscriberController@postSubscribers');
|
||||||
|
|
||||||
|
$router->put('components/groups/{component_group}', 'ComponentGroupController@putGroup');
|
||||||
$router->put('components/{component}', 'ComponentController@putComponent');
|
$router->put('components/{component}', 'ComponentController@putComponent');
|
||||||
$router->put('incidents/{incident}', 'IncidentController@putIncident');
|
$router->put('incidents/{incident}', 'IncidentController@putIncident');
|
||||||
$router->put('metrics/{metric}', 'MetricController@putMetric');
|
$router->put('metrics/{metric}', 'MetricController@putMetric');
|
||||||
$router->put('metrics/{metric}/points/{metric_point}', 'MetricPointController@putMetricPoint');
|
$router->put('metrics/{metric}/points/{metric_point}', 'MetricPointController@putMetricPoint');
|
||||||
|
|
||||||
|
$router->delete('components/groups/{component_group}', 'ComponentGroupController@deleteGroup');
|
||||||
$router->delete('components/{component}', 'ComponentController@deleteComponent');
|
$router->delete('components/{component}', 'ComponentController@deleteComponent');
|
||||||
$router->delete('incidents/{incident}', 'IncidentController@deleteIncident');
|
$router->delete('incidents/{incident}', 'IncidentController@deleteIncident');
|
||||||
$router->delete('metrics/{metric}', 'MetricController@deleteMetric');
|
$router->delete('metrics/{metric}', 'MetricController@deleteMetric');
|
||||||
|
|||||||
@@ -19,12 +19,13 @@ class ComponentGroup extends Model
|
|||||||
use ValidatingTrait;
|
use ValidatingTrait;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The validation rules.
|
* The attributes that should be casted to native types.
|
||||||
*
|
*
|
||||||
* @var string[]
|
* @var string[]
|
||||||
*/
|
*/
|
||||||
public $rules = [
|
protected $casts = [
|
||||||
'name' => 'required',
|
'name' => 'string',
|
||||||
|
'order' => 'integer',
|
||||||
];
|
];
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -34,6 +35,16 @@ class ComponentGroup extends Model
|
|||||||
*/
|
*/
|
||||||
protected $fillable = ['name', 'order'];
|
protected $fillable = ['name', 'order'];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The validation rules.
|
||||||
|
*
|
||||||
|
* @var string[]
|
||||||
|
*/
|
||||||
|
public $rules = [
|
||||||
|
'name' => 'required',
|
||||||
|
'order' => 'integer',
|
||||||
|
];
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A group can have many components.
|
* A group can have many components.
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -33,6 +33,13 @@ $factory->define('CachetHQ\Cachet\Models\Component', function ($faker) {
|
|||||||
];
|
];
|
||||||
});
|
});
|
||||||
|
|
||||||
|
$factory->define('CachetHQ\Cachet\Models\ComponentGroup', function ($faker) {
|
||||||
|
return [
|
||||||
|
'name' => $faker->words(2, true),
|
||||||
|
'order' => 0,
|
||||||
|
];
|
||||||
|
});
|
||||||
|
|
||||||
$factory->define('CachetHQ\Cachet\Models\Incident', function ($faker) {
|
$factory->define('CachetHQ\Cachet\Models\Incident', function ($faker) {
|
||||||
return [
|
return [
|
||||||
'name' => $faker->sentence(),
|
'name' => $faker->sentence(),
|
||||||
|
|||||||
94
tests/Api/ComponentGroupTest.php
Normal file
94
tests/Api/ComponentGroupTest.php
Normal file
@@ -0,0 +1,94 @@
|
|||||||
|
<?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\Tests\Cachet\Api;
|
||||||
|
|
||||||
|
use CachetHQ\Tests\Cachet\AbstractTestCase;
|
||||||
|
use Illuminate\Foundation\Testing\DatabaseMigrations;
|
||||||
|
|
||||||
|
class ComponentGroupTest extends AbstractTestCase
|
||||||
|
{
|
||||||
|
use DatabaseMigrations;
|
||||||
|
|
||||||
|
public function testGetGroups()
|
||||||
|
{
|
||||||
|
$groups = factory('CachetHQ\Cachet\Models\ComponentGroup', 3)->create();
|
||||||
|
|
||||||
|
$this->get('/api/v1/components/groups');
|
||||||
|
$this->seeJson(['id' => (string) $groups[0]->id]);
|
||||||
|
$this->seeJson(['id' => (string) $groups[1]->id]);
|
||||||
|
$this->seeJson(['id' => (string) $groups[2]->id]);
|
||||||
|
$this->assertResponseOk();
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testGetInvalidGroup()
|
||||||
|
{
|
||||||
|
$this->get('/api/v1/components/groups/1');
|
||||||
|
$this->assertResponseStatus(404);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testPostGroupUnauthorized()
|
||||||
|
{
|
||||||
|
$this->post('/api/v1/components/groups');
|
||||||
|
|
||||||
|
$this->assertResponseStatus(401);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testPostGroupNoData()
|
||||||
|
{
|
||||||
|
$this->beUser();
|
||||||
|
|
||||||
|
$this->post('/api/v1/components/groups');
|
||||||
|
$this->assertResponseStatus(400);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testPostGroup()
|
||||||
|
{
|
||||||
|
$this->beUser();
|
||||||
|
|
||||||
|
$this->post('/api/v1/components/groups', [
|
||||||
|
'name' => 'Foo',
|
||||||
|
'order' => 1,
|
||||||
|
]);
|
||||||
|
$this->seeJson(['name' => 'Foo']);
|
||||||
|
$this->assertResponseOk();
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testGetNewGroup()
|
||||||
|
{
|
||||||
|
$group = factory('CachetHQ\Cachet\Models\ComponentGroup')->create();
|
||||||
|
|
||||||
|
$this->get('/api/v1/components/groups/1');
|
||||||
|
$this->seeJson(['name' => $group->name]);
|
||||||
|
$this->assertResponseOk();
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testPutGroup()
|
||||||
|
{
|
||||||
|
$this->beUser();
|
||||||
|
$group = factory('CachetHQ\Cachet\Models\ComponentGroup')->create();
|
||||||
|
|
||||||
|
$this->put('/api/v1/components/groups/1', [
|
||||||
|
'name' => 'Lorem Ipsum Groupous',
|
||||||
|
]);
|
||||||
|
$this->seeJson(['name' => 'Lorem Ipsum Groupous']);
|
||||||
|
$this->assertResponseOk();
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testDeleteGroup()
|
||||||
|
{
|
||||||
|
$this->beUser();
|
||||||
|
$group = factory('CachetHQ\Cachet\Models\ComponentGroup')->create();
|
||||||
|
|
||||||
|
$this->delete('/api/v1/components/groups/1');
|
||||||
|
$this->assertResponseStatus(204);
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user