Skip to content

Commit

Permalink
Enabled package to use Route::resource by default when inheriting fro…
Browse files Browse the repository at this point in the history
…m JsonApiController
  • Loading branch information
nilportugues committed Dec 27, 2015
1 parent d8d1639 commit b0b273a
Show file tree
Hide file tree
Showing 7 changed files with 146 additions and 182 deletions.
79 changes: 5 additions & 74 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -80,43 +80,8 @@ This is how our `app/Http/routes.php` will look:

```php
<?php
Route::group(['prefix' => 'api/v1/','namespace' => 'Api'], function() {
Route::post(
'employees', [
'as' => 'employees.post',
'uses' => 'EmployeesController@postAction'
]);

Route::get(
'employees', [
'as' => 'employees.list',
'uses' => 'EmployeesController@listAction'
]);

Route::get(
'employees/{id}', [
'as' => 'employees.get',
'uses' => 'EmployeesController@getAction'
]);

Route::put(
'employees/{id}',[
'as' => 'employees.put',
'uses' => 'EmployeesController@putAction'
]);

Route::patch(
'employees/{id}', [
'as' => 'employees.patch',
'uses' => 'EmployeesController@patchAction'
]);

Route::delete(
'employees/{id}', [
'as' => 'employees.delete',
'uses' => 'EmployeesController@deleteAction'
]);

Route::group(['namespace' => 'Api'], function() {
Route::resource('employees', 'EmployeesController');
Route::get(
'employees/{employee_id}/orders', [
'as' => 'employees.orders',
Expand Down Expand Up @@ -466,43 +431,9 @@ This is how our `app/Http/routes.php` will look:
```php
<?php
$app->group(
['prefix' => 'api/v1/' , 'namespace' => 'Api'], function($app) {
$app->post(
'employees', [
'as' => 'employees.post',
'uses' => 'EmployeesController@postAction'
]);

$app->get(
'employees', [
'as' => 'employees.list',
'uses' => 'EmployeesController@listAction'
]);

$app->get(
'employees/{id}', [
'as' => 'employees.get',
'uses' => 'EmployeesController@getAction'
]);

$app->put(
'employees/{id}', [
'as' => 'employees.put',
'uses' => 'EmployeesController@putAction'
]);

$app->patch(
'employees/{id}', [
'as' => 'employees.patch',
'uses' => 'EmployeesController@patchAction'
]);

$app->delete(
'employees/{id}', [
'as' => 'employees.delete',
'uses' => 'EmployeesController@deleteAction'
]);

['namespace' => 'Api'], function($app) {
$app->resource('employees', 'EmployeesController');

$app->get(
'employees/{employee_id}/orders', [
'as' => 'employees.orders',
Expand Down
171 changes: 99 additions & 72 deletions src/NilPortugues/Laravel5/JsonApi/Controller/JsonApiController.php
Original file line number Diff line number Diff line change
Expand Up @@ -14,10 +14,11 @@
use Illuminate\Database\Eloquent\Model;
use Illuminate\Http\Request;
use NilPortugues\Api\JsonApi\Http\Factory\RequestFactory;
use NilPortugues\Api\JsonApi\Http\Response\ResourceNotFound;
use NilPortugues\Api\JsonApi\Server\Actions\CreateResource;
use NilPortugues\Api\JsonApi\Server\Actions\DeleteResource;
use NilPortugues\Api\JsonApi\Server\Actions\ListResource;
use NilPortugues\Api\JsonApi\Server\Actions\GetResource;
use NilPortugues\Api\JsonApi\Server\Actions\ListResource;
use NilPortugues\Api\JsonApi\Server\Actions\PatchResource;
use NilPortugues\Api\JsonApi\Server\Actions\PutResource;
use NilPortugues\Api\JsonApi\Server\Errors\Error;
Expand Down Expand Up @@ -45,36 +46,35 @@ public function __construct(JsonApiSerializer $serializer)
}

/**
* Get many resources.
*
* @param int $pageSize
*
* @return \Symfony\Component\HttpFoundation\Response
*/
public function listAction($pageSize = 10)
public function index($pageSize = 10)
{
$apiRequest = RequestFactory::create();
$page = $apiRequest->getPage();

$page = $apiRequest->getPage();
if (!$page->size()) {
$page->setSize($pageSize);
}

$resource = new ListResource(
$this->serializer,
$page,
$apiRequest->getFields(),
$apiRequest->getSort(),
$apiRequest->getIncludedRelationships(),
$apiRequest->getFilters()
);
$fields = $apiRequest->getFields();
$sorting = $apiRequest->getSort();
$included = $apiRequest->getIncludedRelationships();
$filters = $apiRequest->getFilters();

$response = $resource->get(
$this->totalAmountResourceCallable(),
$this->listResourceCallable(),
action('\\'.get_class($this).'@listAction', []),
get_class($this->getDataModel())
);
$resource = new ListResource($this->serializer, $page, $fields, $sorting, $included, $filters);

return $this->addHeaders($response);
$totalAmount = $this->totalAmountResourceCallable();
$results = $this->listResourceCallable();

$controllerAction = '\\'.get_class($this).'@index';
$uri = action($controllerAction, []);

return $this->addHeaders($resource->get($totalAmount, $results, $uri, get_class($this->getDataModel())));
}

/**
Expand Down Expand Up @@ -123,11 +123,21 @@ protected function addHeaders(Response $response)
}

/**
* @return ResourceNotFound
*/
public function create()
{
return new ResourceNotFound();
}

/**
* Get single resource.
*
* @param Request $request
*
* @return \Symfony\Component\HttpFoundation\Response
*/
public function getAction(Request $request)
public function show($id)
{
$apiRequest = RequestFactory::create();

Expand All @@ -137,13 +147,9 @@ public function getAction(Request $request)
$apiRequest->getIncludedRelationships()
);

$response = $resource->get(
$request->id,
get_class($this->getDataModel()),
$this->findResourceCallable($request)
);
$find = $this->findResourceCallable($id);

return $this->addHeaders($response);
return $this->addHeaders($resource->get($id, get_class($this->getDataModel()), $find));
}

/**
Expand All @@ -152,32 +158,31 @@ public function getAction(Request $request)
* @return callable
* @codeCoverageIgnore
*/
protected function findResourceCallable(Request $request)
protected function findResourceCallable($id)
{
return function () use ($request) {
return function () use ($id) {
$idKey = $this->getDataModel()->getKeyName();
$model = $this->getDataModel()->query()->where($idKey, $request->id)->first();
$model = $this->getDataModel()->query()->where($idKey, $id)->first();

return $model;
};
}

/**
* Post Action.
*
* @param Request $request
*
* @return \Symfony\Component\HttpFoundation\Response
*/
public function postAction(Request $request)
public function store(Request $request)
{
$createResource = $this->createResourceCallable();
$resource = new CreateResource($this->serializer);

$response = $resource->get(
(array) $request->get('data'),
get_class($this->getDataModel()),
$this->createResourceCallable()
return $this->addHeaders(
$resource->get((array) $request->get('data'), get_class($this->getDataModel()), $createResource)
);

return $this->addHeaders($response);
}

/**
Expand Down Expand Up @@ -210,24 +215,38 @@ protected function createResourceCallable()
};
}

/**
* @param $id
*
* @return Response
*/
public function update(Request $request, $id)
{
return (strtoupper($request->getMethod()) === 'PUT') ? $this->putAction($request,
$id) : $this->patchAction($request, $id);
}

/**
* @param Request $request
*
* @return \Symfony\Component\HttpFoundation\Response
*/
public function patchAction(Request $request)
protected function putAction(Request $request, $id)
{
$resource = new PatchResource($this->serializer);
$find = $this->findResourceCallable($id);
$update = $this->updateResourceCallable();

$response = $resource->get(
$request->id,
(array) $request->get('data'),
get_class($this->getDataModel()),
$this->findResourceCallable($request),
$this->updateResourceCallable()
);
$resource = new PutResource($this->serializer);

return $this->addHeaders($response);
return $this->addHeaders(
$resource->get(
$id,
(array) $request->get('data'),
get_class($this->getDataModel()),
$find,
$update
)
);
}

/**
Expand All @@ -251,54 +270,62 @@ protected function updateResourceCallable()

/**
* @param Request $request
* @param $id
*
* @return \Symfony\Component\HttpFoundation\Response
* @return Response
*/
public function putAction(Request $request)
protected function patchAction(Request $request, $id)
{
$resource = new PutResource($this->serializer);
$find = $this->findResourceCallable($id);
$update = $this->updateResourceCallable();

$resource = new PatchResource($this->serializer);

$response = $resource->get(
$request->id,
(array) $request->get('data'),
get_class($this->getDataModel()),
$this->findResourceCallable($request),
$this->updateResourceCallable()
return $this->addHeaders(
$resource->get(
$id,
(array) $request->get('data'),
get_class($this->getDataModel()),
$find,
$update
)
);
}

return $this->addHeaders($response);
/**
* @return ResourceNotFound
*/
public function edit()
{
return new ResourceNotFound();
}

/**
* @param Request $request
* @param $id
*
* @return \Symfony\Component\HttpFoundation\Response
* @return Response
*/
public function deleteAction(Request $request)
public function destroy($id)
{
$resource = new DeleteResource($this->serializer);
$find = $this->findResourceCallable($id);

$response = $resource->get(
$request->id,
get_class($this->getDataModel()),
$this->findResourceCallable($request),
$this->deleteResourceCallable($request)
);
$delete = $this->deleteResourceCallable($id);

return $this->addHeaders($response);
$resource = new DeleteResource($this->serializer);

return $this->addHeaders($resource->get($id, get_class($this->getDataModel()), $find, $delete));
}

/**
* @param Request $request
* @param $id
*
* @return callable
* @codeCoverageIgnore
* @return \Closure
*/
protected function deleteResourceCallable(Request $request)
protected function deleteResourceCallable($id)
{
return function () use ($request) {
return function () use ($id) {
$idKey = $this->getDataModel()->getKeyName();
$model = $this->getDataModel()->query()->where($idKey, $request->id)->first();
$model = $this->getDataModel()->query()->where($idKey, $id)->first();

return $model->delete();
};
Expand Down
Loading

0 comments on commit b0b273a

Please sign in to comment.