Updated DingoAPI to .7

Rename component.component to component_id with relationship name change

Rename more instances of parent to component

Working on Incident Repository

Fix Incident seeder

component_id is fillable within the model

Fix bad relationship

Finished Incident repository

Added Metric repository

Updated tests for new dingo release
This commit is contained in:
Elliot Hesp
2014-12-01 12:03:32 +00:00
committed by James Brooks
parent 692d2fc0fe
commit b2e1d2750c
13 changed files with 195 additions and 127 deletions

View File

@@ -3,18 +3,17 @@
namespace CachetHQ\Cachet\Controllers\Api;
use Input;
use Dingo\Api\Routing\Controller as DingoController;
use Dingo\Api\Auth\Shield;
use Dingo\Api\Routing\ControllerTrait;
use Illuminate\Routing\Controller;
use CachetHQ\Cachet\Repositories\Component\ComponentRepository;
class ComponentController extends DingoController {
class ComponentController extends Controller {
protected $auth;
use ControllerTrait;
protected $component;
public function __construct(Shield $auth, ComponentRepository $component) {
$this->auth = $auth;
public function __construct(ComponentRepository $component) {
$this->component = $component;
}
@@ -38,6 +37,11 @@ class ComponentController extends DingoController {
return $this->component->findOrFail($id);
}
/**
* Return a component with incidents
* @param [type] $id [description]
* @return [type] [description]
*/
public function getComponentIncidents($id) {
return $this->component->with($id, ['incidents']);
}

View File

@@ -2,16 +2,19 @@
namespace CachetHQ\Cachet\Controllers\Api;
use Input, Incident;
use Dingo\Api\Routing\Controller as DingoController;
use Dingo\Api\Auth\Shield;
use Input;
use Dingo\Api\Routing\ControllerTrait;
use Illuminate\Routing\Controller;
use CachetHQ\Cachet\Repositories\Incident\IncidentRepository;
class IncidentController extends DingoController {
class IncidentController extends Controller {
protected $auth;
use ControllerTrait;
public function __construct(Shield $auth) {
$this->auth = $auth;
protected $incident;
public function __construct(IncidentRepository $incident) {
$this->incident = $incident;
}
/**
@@ -20,7 +23,7 @@ class IncidentController extends DingoController {
* @return \Illuminate\Database\Eloquent\Collection
*/
public function getIncidents() {
return Incident::all();
return $this->incident->all();
}
/**
@@ -31,11 +34,7 @@ class IncidentController extends DingoController {
* @return Incident
*/
public function getIncident($id) {
if ($incident = Incident::find($id)) {
return $incident;
} else {
App::abort(404, 'Incident not found');
}
return $this->incident->findOrFail($id);
}
/**
@@ -44,9 +43,7 @@ class IncidentController extends DingoController {
* @return Incident
*/
public function postIncidents() {
$incident = new Incident(Input::all());
$incident->user_id = $this->auth->user()->id;
return $this->_saveIncident($incident);
return $this->incident->create($this->auth->user()->id, Input::all());
}
/**
@@ -57,35 +54,6 @@ class IncidentController extends DingoController {
* @return Incident
*/
public function putIncident($id) {
$incident = $this->getIncident($id);
$incident->fill(Input::all());
return $this->_saveIncident($incident);
}
/**
* Function for saving the incident, and returning appropriate error codes
*
* @param Incident $incident
*
* @return Incident
*/
private function _saveIncident($incident) {
if ($incident->isValid()) {
try {
$component = $incident->component;
if (!$component) {
App::abort(400, 'Invalid component specified');
}
$incident->saveOrFail();
return $incident;
} catch (Exception $e) {
App::abort(500, $e->getMessage());
}
} else {
App::abort(404, $incident->getErrors()->first());
}
return $this->incident->update($id, Input::all());
}
}

View File

@@ -2,18 +2,27 @@
namespace CachetHQ\Cachet\Controllers\Api;
use Input, Metric;
use Dingo\Api\Routing\Controller as DingoController;
use Input;
use Dingo\Api\Routing\ControllerTrait;
use Illuminate\Routing\Controller;
use CachetHQ\Cachet\Repositories\Metric\MetricRepository;
class MetricController extends DingoController {
class MetricController extends Controller {
use ControllerTrait;
protected $metric;
public function __construct(MetricRepository $metric) {
$this->metric = $metric;
}
/**
* Get all metrics
*
* @return \Illuminate\Database\Eloquent\Collection
*/
public function getMetrics() {
return Metric::all();
return $this->metric->all();
}
/**
@@ -24,11 +33,7 @@ class MetricController extends DingoController {
* @return Metric
*/
public function getMetric($id) {
if ($metric = Metric::find($id)) {
return $metric;
} else {
App::abort(404, 'Metric not found');
}
return $this->metric->findOrFail($id);
}
/**
@@ -37,8 +42,7 @@ class MetricController extends DingoController {
* @return Metric
*/
public function postMetrics() {
$metric = new Metric(Input::all());
return $this->_saveMetric($metric);
return $this->metric->create(Input::all());
}
/**
@@ -49,28 +53,6 @@ class MetricController extends DingoController {
* @return Metric
*/
public function putMetric($id) {
$metric = $this->getMetric($id);
$metric->fill(Input::all());
return $this->_saveMetric($metric);
}
/**
* Function for saving a metric, and returning appropriate error codes
*
* @param Metric $metric
*
* @return Metric
*/
private function _saveMetric($metric) {
if ($metric->isValid()) {
try {
$metric->saveOrFail();
return $metric;
} catch (Exception $e) {
App::abort(500, $e->getMessage());
}
} else {
App::abort(404, $metric->getErrors()->first());
}
return $this->metric->update($id, Input::all());
}
}

View File

@@ -91,16 +91,6 @@ abstract class EloquentRepository {
$this->model->delete($id);
}
/**
* Updates a given model by ID with an array of updates
* @param inetegr $id
* @param array $array Key Value pairs to update
*/
public function update($id, array $array) {
$model = $this->model->whereId($id)->first(['id']);
$model->update($array);
}
/**
* Validate a given model with Watson validation
* @param object $model
@@ -110,5 +100,21 @@ abstract class EloquentRepository {
if ($model->isInvalid()) {
throw new Exception('Invalid model validation');
}
return $this;
}
/**
* Validate whether a model has a correct relationship
* @param object $model
* @param string $relationship Name of the relationship to validate against
* @return Exception
*/
public function hasRelationship($model, $relationship) {
if (! $model->$relationship) {
throw new Exception('Invalid relationship exception');
}
return $this;
}
}

View File

@@ -0,0 +1,35 @@
<?php
namespace CachetHQ\Cachet\Repositories\Incident;
use CachetHQ\Cachet\Repositories\EloquentRepository;
use Incident;
class EloquentIncidentRepository extends EloquentRepository implements IncidentRepository {
protected $model;
public function __construct(Incident $model) {
$this->model = $model;
}
public function create($user_id, array $array) {
$incident = new $this->model($array);
$incident->user_id = $user_id;
$this->validate($incident)->hasRelationship($incident, 'component');
$incident->saveOrFail();
return $incident;
}
public function update($id, array $array) {
$incident = $this->model->findOrFail($id);
$incident->fill($array);
$this->validate($incident)->hasRelationship($incident, 'component');
$incident->update($array);
return $incident;
}
}

View File

@@ -0,0 +1,14 @@
<?php
namespace CachetHQ\Cachet\Repositories\Incident;
interface IncidentRepository {
public function all();
public function create($id, array $array);
public function findOrFail($id);
public function update($id, array $with);
}

View File

@@ -0,0 +1,34 @@
<?php
namespace CachetHQ\Cachet\Repositories\Metric;
use CachetHQ\Cachet\Repositories\EloquentRepository;
use Metric;
class EloquentMetricRepository extends EloquentRepository implements MetricRepository {
protected $model;
public function __construct(Metric $model) {
$this->model = $model;
}
public function create(array $array) {
$metric = new $this->model($array);
$this->validate($metric);
$metric->saveOrFail();
return $metric;
}
public function update($id, array $array) {
$metric = $this->model->findOrFail($id);
$metric->fill($array);
$this->validate($metric);
$metric->update($array);
return $metric;
}
}

View File

@@ -0,0 +1,14 @@
<?php
namespace CachetHQ\Cachet\Repositories\Metric;
interface MetricRepository {
public function all();
public function create(array $array);
public function findOrFail($id);
public function update($id, array $with);
}

View File

@@ -10,5 +10,13 @@ class RepositoryServiceProvider extends ServiceProvider {
'CachetHQ\Cachet\Repositories\Component\ComponentRepository',
'CachetHQ\Cachet\Repositories\Component\EloquentComponentRepository'
);
$this->app->bind(
'CachetHQ\Cachet\Repositories\Incident\IncidentRepository',
'CachetHQ\Cachet\Repositories\Incident\EloquentIncidentRepository'
);
$this->app->bind(
'CachetHQ\Cachet\Repositories\Metric\MetricRepository',
'CachetHQ\Cachet\Repositories\Metric\EloquentMetricRepository'
);
}
}

View File

@@ -122,7 +122,7 @@ return array(
'Illuminate\View\ViewServiceProvider',
'Illuminate\Workbench\WorkbenchServiceProvider',
'Dingo\Api\ApiServiceProvider',
'Dingo\Api\Provider\ApiServiceProvider',
'Thujohn\Rss\RssServiceProvider',
'CachetHQ\Cachet\Support\ServiceProviders\RepositoryServiceProvider',

View File

@@ -14,7 +14,7 @@ class ComponentControllerTest extends TestCase {
public function test_get_components_method() {
$this->repo->shouldReceive('all')->once()->andReturn('foo');
$controller = new CachetHQ\Cachet\Controllers\Api\ComponentController($this->dingo, $this->repo);
$controller = new CachetHQ\Cachet\Controllers\Api\ComponentController($this->repo);
$response = $controller->getComponents();
$this->assertEquals('foo', $response);
@@ -23,9 +23,10 @@ class ComponentControllerTest extends TestCase {
public function test_get_component_method() {
$this->repo->shouldReceive('findOrFail')->with(1)->once()->andReturn('foo');
$controller = new CachetHQ\Cachet\Controllers\Api\ComponentController($this->dingo, $this->repo);
$controller = new CachetHQ\Cachet\Controllers\Api\ComponentController($this->repo);
$response = $controller->getComponent(1);
$this->assertEquals('foo', $response);
}
}

View File

@@ -10,7 +10,7 @@
"require": {
"laravel/framework": "4.2.*",
"guzzlehttp/guzzle": "~5.0",
"dingo/api": "0.6.*",
"dingo/api": "0.7.*",
"watson/validating": "0.10.*",
"thujohn/rss": "dev-master"
},

56
composer.lock generated
View File

@@ -4,7 +4,7 @@
"Read more about it at http://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file",
"This file is @generated automatically"
],
"hash": "bceebea08594f491daed4b104ec0cbc0",
"hash": "6a8ddbabbd2a61cd7be7327e895cd682",
"packages": [
{
"name": "classpreloader/classpreloader",
@@ -89,43 +89,45 @@
},
{
"name": "dingo/api",
"version": "v0.6.6",
"version": "v0.7.1",
"source": {
"type": "git",
"url": "https://github.com/dingo/api.git",
"reference": "87ce1b823941deddf266d2fcbf537145c0530716"
"reference": "def08e52a6582d8f60c12ebc509ed7d6e8a7f81b"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/dingo/api/zipball/87ce1b823941deddf266d2fcbf537145c0530716",
"reference": "87ce1b823941deddf266d2fcbf537145c0530716",
"url": "https://api.github.com/repos/dingo/api/zipball/def08e52a6582d8f60c12ebc509ed7d6e8a7f81b",
"reference": "def08e52a6582d8f60c12ebc509ed7d6e8a7f81b",
"shasum": ""
},
"require": {
"illuminate/support": "~4.1|~5.0",
"league/fractal": "0.8.*",
"illuminate/support": "~4.1",
"league/fractal": "0.10.*",
"php": ">=5.4.0"
},
"require-dev": {
"illuminate/auth": "~4.1",
"illuminate/console": "~4.1",
"illuminate/database": "~4.1",
"illuminate/events": "~4.1",
"illuminate/pagination": "~4.1",
"illuminate/routing": "~4.1",
"lucadegasperi/oauth2-server-laravel": "1.0.*",
"illuminate/auth": "4.2.*",
"illuminate/console": "4.2.*",
"illuminate/database": "4.2.*",
"illuminate/events": "4.2.*",
"illuminate/filesystem": "4.2.*",
"illuminate/pagination": "4.2.*",
"illuminate/routing": "4.2.*",
"lucadegasperi/oauth2-server-laravel": "3.0.*",
"mockery/mockery": "~0.9",
"phpunit/phpunit": "~4.0",
"squizlabs/php_codesniffer": "1.*"
"squizlabs/php_codesniffer": "~1.5",
"tymon/jwt-auth": "0.3.*"
},
"suggest": {
"lucadegasperi/oauth2-server-laravel": "Use the League OAuth 2.0 server to protect your API."
"lucadegasperi/oauth2-server-laravel": "Use the League OAuth 2.0 server to protect your API.",
"tymon/jwt-auth": "Protect your API with JSON Web Tokens"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "0.6-dev",
"dev-develop": "0.7-dev"
"dev-master": "0.7-dev"
}
},
"autoload": {
@@ -150,7 +152,7 @@
"laravel",
"restful"
],
"time": "2014-09-29 00:06:33"
"time": "2014-12-01 01:04:27"
},
{
"name": "filp/whoops",
@@ -575,16 +577,16 @@
},
{
"name": "league/fractal",
"version": "0.8.3",
"version": "0.10.0",
"source": {
"type": "git",
"url": "https://github.com/thephpleague/fractal.git",
"reference": "9985eee7efc42ef472da07856cdd3fd29c57642c"
"reference": "557e1803dabe8ce252a4549a29da6d439f62d3c2"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/thephpleague/fractal/zipball/9985eee7efc42ef472da07856cdd3fd29c57642c",
"reference": "9985eee7efc42ef472da07856cdd3fd29c57642c",
"url": "https://api.github.com/repos/thephpleague/fractal/zipball/557e1803dabe8ce252a4549a29da6d439f62d3c2",
"reference": "557e1803dabe8ce252a4549a29da6d439f62d3c2",
"shasum": ""
},
"require": {
@@ -602,7 +604,7 @@
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "0.8-dev"
"dev-master": "0.10-dev"
}
},
"autoload": {
@@ -617,8 +619,8 @@
"authors": [
{
"name": "Phil Sturgeon",
"email": "email@philsturgeon.co.uk",
"homepage": "http://philsturgeon.co.uk/",
"email": "me@philsturgeon.uk",
"homepage": "http://philsturgeon.uk/",
"role": "Developer"
}
],
@@ -630,7 +632,7 @@
"league",
"rest"
],
"time": "2014-06-14 11:11:41"
"time": "2014-10-17 17:12:38"
},
{
"name": "monolog/monolog",