mirror of
https://github.com/CachetHQ/Cachet.git
synced 2025-04-20 23:41:52 +02:00
Added component groups API. Closes #801
This commit is contained in:
parent
0a682a00f7
commit
4b3ec45b03
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
|
||||
$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');
|
||||
|
@ -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.
|
||||
*
|
||||
|
@ -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(),
|
||||
|
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);
|
||||
}
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user