AzuraCast/src/Controller/Api/AbstractGenericCrudControll...

118 lines
3.4 KiB
PHP

<?php
namespace App\Controller\Api;
use App\Entity;
use App\Http\Request;
use App\Http\Response;
use App\Utilities;
use Azura\Doctrine\Paginator;
use Psr\Http\Message\ResponseInterface;
abstract class AbstractGenericCrudController extends AbstractCrudController
{
public function listAction(Request $request, Response $response): ResponseInterface
{
$query = $this->em->createQuery('SELECT e FROM ' . $this->entityClass . ' e');
$paginator = new Paginator($query);
$paginator->setFromRequest($request);
$is_bootgrid = $paginator->isFromBootgrid();
$router = $request->getRouter();
$paginator->setPostprocessor(function($row) use ($is_bootgrid, $router) {
$return = $this->_viewRecord($row, $router);
if ($is_bootgrid) {
return Utilities::flatten_array($return, '_');
}
return $return;
});
return $paginator->write($response);
}
/**
* @param Request $request
* @param Response $response
* @return ResponseInterface
* @throws \Azura\Exception
*/
public function createAction(Request $request, Response $response): ResponseInterface
{
$row = $this->_createRecord($request->getParsedBody());
$return = $this->_viewRecord($row, $request->getRouter());
return $response->withJson($return);
}
/**
* @param Request $request
* @param Response $response
* @param mixed $record_id
* @return ResponseInterface
*/
public function getAction(Request $request, Response $response, $record_id): ResponseInterface
{
$record = $this->_getRecord($record_id);
$return = $this->_viewRecord($record, $request->getRouter());
return $response->withJson($return);
}
/**
* @param Request $request
* @param Response $response
* @param mixed $record_id
* @return ResponseInterface
*/
public function editAction(Request $request, Response $response, $record_id): ResponseInterface
{
$record = $this->_getRecord($record_id);
if (null === $record) {
return $response
->withStatus(404)
->withJson(new Entity\Api\Error(404, 'Record not found!'));
}
$this->_editRecord($request->getParsedBody(), $record);
return $response->withJson(new Entity\Api\Status(true, 'Changes saved successfully.'));
}
/**
* @param Request $request
* @param Response $response
* @param mixed $record_id
* @return ResponseInterface
*/
public function deleteAction(Request $request, Response $response, $record_id): ResponseInterface
{
$record = $this->_getRecord($record_id);
if (null === $record) {
return $response
->withStatus(404)
->withJson(new Entity\Api\Error(404, 'Record not found!'));
}
$this->_deleteRecord($record);
return $response->withJson(new Entity\Api\Status(true, 'Record deleted successfully.'));
}
/**
* @param mixed $record_id
* @return object|null
* @throws \Doctrine\ORM\ORMException
* @throws \Doctrine\ORM\OptimisticLockException
* @throws \Doctrine\ORM\TransactionRequiredException
*/
protected function _getRecord($record_id)
{
return $this->em->find($this->entityClass, $record_id);
}
}