Added component groups API. Closes #801

This commit is contained in:
James Brooks 2015-08-08 15:36:48 +01:00
parent 0a682a00f7
commit 4b3ec45b03
5 changed files with 220 additions and 3 deletions

View 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();
}
}

View File

@ -32,6 +32,8 @@ class ApiRoutes
// Components
$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');
// Incidents
@ -48,16 +50,19 @@ class ApiRoutes
$router->get('subscribers', 'SubscriberController@getSubscribers');
$router->post('components', 'ComponentController@postComponents');
$router->post('components/groups', 'ComponentGroupController@postGroups');
$router->post('incidents', 'IncidentController@postIncidents');
$router->post('metrics', 'MetricController@postMetrics');
$router->post('metrics/{metric}/points', 'MetricPointController@postMetricPoints');
$router->post('subscribers', 'SubscriberController@postSubscribers');
$router->put('components/groups/{component_group}', 'ComponentGroupController@putGroup');
$router->put('components/{component}', 'ComponentController@putComponent');
$router->put('incidents/{incident}', 'IncidentController@putIncident');
$router->put('metrics/{metric}', 'MetricController@putMetric');
$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('incidents/{incident}', 'IncidentController@deleteIncident');
$router->delete('metrics/{metric}', 'MetricController@deleteMetric');

View File

@ -19,12 +19,13 @@ class ComponentGroup extends Model
use ValidatingTrait;
/**
* The validation rules.
* The attributes that should be casted to native types.
*
* @var string[]
*/
public $rules = [
'name' => 'required',
protected $casts = [
'name' => 'string',
'order' => 'integer',
];
/**
@ -34,6 +35,16 @@ class ComponentGroup extends Model
*/
protected $fillable = ['name', 'order'];
/**
* The validation rules.
*
* @var string[]
*/
public $rules = [
'name' => 'required',
'order' => 'integer',
];
/**
* A group can have many components.
*

View File

@ -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) {
return [
'name' => $faker->sentence(),

View 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);
}
}