Skip to content

Commit

Permalink
Added api platform, rewrite.
Browse files Browse the repository at this point in the history
  • Loading branch information
voslartomas committed Feb 9, 2017
1 parent c81fc8b commit bdce410
Show file tree
Hide file tree
Showing 7 changed files with 117 additions and 289 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -29,180 +29,27 @@ class MenuContentProviderSettingsController extends BaseRestController
* Get single settings for menu content provider.
*
* @param int $id Id of the desired settings.
*
* @ApiDoc(
* description="Return single settings.",
* parameters={
* {"name"="PageId", "dataType"="integer", "required"=true, "description"="Page id."},
* {"name"="SectionId", "dataType"="integer", "required"=true, "description"="Section id."}
* }
* )
* @Get("/content-providers/menu/settings/{pageId}/{sectionId}", options={"i18n"=false})
*/
public function getMenuContentProviderSettingsAction($pageId, $sectionId)
public function getMenuSettingsAction($pageId = null, $sectionId = null)
{
$this->checkPermission(WebcookCmsVoter::ACTION_VIEW);

$page = $this->getEntityManager()->getRepository('Webcook\Cms\CoreBundle\Entity\Page')->find($pageId);
$section = $this->getEntityManager()->getRepository('Webcook\Cms\CoreBundle\Entity\Section')->find($sectionId);

$settings = $this->getEntityManager()->getRepository('Webcook\Cms\CoreBundle\Entity\MenuContentProviderSettings')->findOneBy(array(
'page' => $page,
'section' => $section
));
$settings = null;
if (!is_null($pageId) && !is_null($sectionId)) {
$page = $this->getEntityManager()->getRepository('Webcook\Cms\CoreBundle\Entity\Page')->find($pageId);
$section = $this->getEntityManager()->getRepository('Webcook\Cms\CoreBundle\Entity\Section')->find($sectionId);

$settings = $this->getEntityManager()->getRepository('Webcook\Cms\CoreBundle\Entity\MenuContentProviderSettings')->findOneBy(array(
'page' => $page,
'section' => $section
));
}


if (is_null($settings)) {
$view = $this->getViewWithMessage(null, 400, 'Settings not found.');
$view = $this->getViewWithMessage(null, 404, 'Settings not found.');
} else {
$view = $this->view($settings, 200);
}

return $this->handleView($view);
}

/**
* Save new settings.
*
* @ApiDoc(
* description="Create a new menu content provider settings.",
* input="Webcook\Cms\CoreBundle\Form\Type\MenuContentProviderSettingsType",
* output="Webcook\Cms\CoreBundle\Entity\MenuContentProviderSettings",
* )
* @Post("/content-providers/menu/settings", options={"i18n"=false})
*/
public function postMenuContentProviderSettingsAction()
{
$this->checkPermission(WebcookCmsVoter::ACTION_INSERT);

$response = $this->processSettingsForm(new MenuContentProviderSettings(), 'POST');

if ($response instanceof MenuContentProviderSettings) {
$statusCode = 200;
$message = 'Settings has been added.';
} else {
$statusCode = 400;
$message = 'Error while adding new settings.';
}

$view = $this->getViewWithMessage($response, $statusCode, $message);

return $this->handleView($view);
}

/**
* Update settings.
*
* @param int $id Id of the desired settings.
*
* @ApiDoc(
* description="Update existing settings.",
* input="Webcook\Cms\CoreBundle\Form\Type\MenuContentProviderSettingsType",
* output="Webcook\Cms\CoreBundle\Entity\MenuContentProviderSettings"
* )
* @Put("/content-providers/menu/settings/{id}", options={"i18n"=false})
*/
public function putMenuContentProviderSettingsAction($id)
{
$this->checkPermission(WebcookCmsVoter::ACTION_EDIT);

try {
$settings = $this->getSettingsById($id, $this->getLockVersion((string) new MenuContentProviderSettings()));
} catch (NotFoundHttpException $e) {
$settings = new MenuContentProviderSettings();
}

$response = $this->processSettingsForm($settings, 'PUT');

if ($response instanceof MenuContentProviderSettings) {
$statusCode = 204;
$message = 'Settings has been updated.';
} else {
$statusCode = 400;
$message = 'Error while updating settings.';
}

$view = $this->getViewWithMessage($response, $statusCode, $message);

return $this->handleView($view);
}

/**
* Delete settings.
*
* @param int $id Id of the desired settings.
*
* @ApiDoc(
* description="Delete settings.",
* parameters={
* {"name"="SettingId", "dataType"="integer", "required"=true, "description"="Page id."}
* }
* )
* @Delete("/content-providers/menu/settings/{id}", options={"i18n"=false})
*/
public function deleteMenuContentProviderSettingsAction($id)
{
$this->checkPermission(WebcookCmsVoter::ACTION_DELETE);

$settings = $this->getSettingsById($id);

$this->getEntityManager()->remove($settings);
$this->getEntityManager()->flush();

$view = $this->getViewWithMessage(array(), 200, 'Settings has been deleted.');

return $this->handleView($view);
}

/**
* Return form if is not valid, otherwise process form and return Page object.
*
* @param Page $settings
* @param string $method Method of request
*
* @return \Symfony\Component\Form\Form [description]
*/
private function processSettingsForm(MenuContentProviderSettings $settings, String $method = 'POST')
{
$form = $this->createForm(MenuContentProviderSettingsType::class, $settings);
$form = $this->formSubmit($form, $method);
if ($form->isValid()) {
$settings = $form->getData();

if ($settings instanceof MenuContentProviderSettings) {
$this->getEntityManager()->persist($settings);
}

$this->getEntityManager()->flush();

return $settings;
}

return $form;
}

/**
* Get Settings by id.
*
* @param int $id Identificator.
*
* @return MenuContentProviderSettings
*
* @throws NotFoundHttpException If settings object doesn't exist.
*/
private function getSettingsById(int $id, int $expectedVersion = null)
{
if ($expectedVersion) {
$settings = $this->getEntityManager()->getRepository('Webcook\Cms\CoreBundle\Entity\MenuContentProviderSettings')->find($id, LockMode::OPTIMISTIC, $expectedVersion);
} else {
$settings = $this->getEntityManager()->getRepository('Webcook\Cms\CoreBundle\Entity\MenuContentProviderSettings')->find($id);
}

if (!$settings instanceof MenuContentProviderSettings) {
throw new NotFoundHttpException('Settings not found.');
}

$this->saveLockVersion($settings);

return $settings;
}
}
61 changes: 10 additions & 51 deletions src/Webcook/Cms/CoreBundle/Controller/PageController.php
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@

use Webcook\Cms\CoreBundle\Base\BaseRestController;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
use Symfony\Component\HttpKernel\Exception\BadRequestHttpException;
use Webcook\Cms\CoreBundle\Entity\Page;
use Webcook\Cms\CoreBundle\Entity\PageSection;
use Webcook\Cms\CoreBundle\Form\Type\PageType;
Expand All @@ -28,69 +29,27 @@
class PageController extends BaseRestController
{
/**
* Update Page.
* Update page section order.
*
* @param int $id Id of the desired Page.
*
* @ApiDoc(
* description="Update order of page section.",
* input="Webcook\Cms\CoreBundle\Form\Type\PageSectionType"
* )
* @Put("/page-section/order/{id}", options={"i18n"=false})
*/
public function putPageSectionOrderAction($id)
public function orderAction($id)
{
$this->checkPermission(WebcookCmsVoter::ACTION_EDIT);

$order = $this->getPutParameters('order');
$pageSection = $this->getEntityManager()->getRepository('Webcook\Cms\CoreBundle\Entity\PageSection')->find($id);

if (!is_null($pageSection)) {
$form = $this->createForm(PageSectionType::class);
$form = $this->formSubmit($form, 'PUT');
if ($form->isValid()) {
$data = $form->getData();
$pageSection->setOrder($data['order']);
$this->getEntityManager()->flush();

$statusCode = 204;
$message = 'Page section has been updated.';
} else {
$statusCode = 400;
$message = 'Given data are not valid.';
if (!is_numeric($order)) {
throw new BadRequestHttpException('Order is not numeric.');
}
} else {
$statusCode = 404;
$message = 'Page section not found.';
}

$view = $this->getViewWithMessage(null, $statusCode, $message);

return $this->handleView($view);
}

/**
* Get Page by id.
*
* @param int $id [description]
*
* @return Page
*
* @throws NotFoundHttpException If Page doesn't exist
*/
private function getPageById($id, $expectedVersion = null)
{
if ($expectedVersion) {
$page = $this->getEntityManager()->getRepository('Webcook\Cms\CoreBundle\Entity\Page')->find($id, LockMode::OPTIMISTIC, $expectedVersion);
$pageSection->setOrder($order);
$this->getEntityManager()->flush();
} else {
$page = $this->getEntityManager()->getRepository('Webcook\Cms\CoreBundle\Entity\Page')->find($id);
}

if (!$page instanceof Page) {
throw new NotFoundHttpException('Page not found.');
throw new NotFoundHttpException('Page section does not exist.');
}

$this->saveLockVersion($page);

return $page;
return $pageSection;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,18 @@

use Doctrine\ORM\Mapping as ORM;
use Webcook\Cms\CoreBundle\Base\BasicEntity;
use ApiPlatform\Core\Annotation\ApiResource;

/**
* Content provider settings abstract entity.
*
* @ApiResource(
* itemOperations={
* "get"={"method"="GET"},
* "put"={"method"="PUT"},
* "delete"={"method"="DELETE"},
* "menu_content_get"={"route_name"="menu_content"}
* })
* @ORM\Entity()
*/
class MenuContentProviderSettings extends ContentProviderSettings
Expand Down
12 changes: 9 additions & 3 deletions src/Webcook/Cms/CoreBundle/Entity/Page.php
Original file line number Diff line number Diff line change
Expand Up @@ -13,10 +13,16 @@
use Symfony\Component\Validator\Constraints as Assert;

/**
* @Gedmo\Tree(type="nested")
* @ApiResource(attributes={
* "denormalization_context"={"groups"={"write"}}
* @ApiResource(
* itemOperations={
* "get"={"method"="GET"},
* "put"={"method"="PUT"},
* "delete"={"method"="DELETE"},
* "section_order"={"route_name"="page_section_order"}
* })
*
* @Gedmo\Tree(type="nested")
*
* @ORM\Table(name="Page")
* @ORM\Entity(repositoryClass="Gedmo\Tree\Entity\Repository\NestedTreeRepository")
* @ORM\HasLifecycleCallbacks
Expand Down
16 changes: 16 additions & 0 deletions src/Webcook/Cms/CoreBundle/Resources/config/routing.yml
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,22 @@ webcook_cms_core_frontend_page:
resource: "."
type: webcookcms_page

page_section_order:
path: '/api/page-section/{id}/order.{_format}'
methods: ['PUT']
defaults:
_controller: 'WebcookCmsCoreBundle:Page:order'
_api_resource_class: 'Webcook\Cms\CoreBundle\Entity\Page'
_api_item_operation_name: 'section_order'

menu_content:
path: '/api/content-providers/menu/settings/{pageId}/{sectionId}.{_format}'
methods: ['GET']
defaults:
_controller: 'WebcookCmsCoreBundle:MenuContentProviderSettings:getMenuSettings'
_api_resource_class: 'Webcook\Cms\CoreBundle\Entity\MenuContentProviderSettings'
_api_item_operation_name: 'menu_content_get'

api_platform:
resource: '.'
type: 'api_platform'
Expand Down
14 changes: 6 additions & 8 deletions tests/Controller/MenuContentProviderSettingsControllerTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,10 @@ class MenuContentProviderSettingsControllerTest extends \Webcook\Cms\CoreBundle\
public function testGetSettings()
{
$this->createTestClient();
$this->client->request('GET', '/api/content-providers/menu/settings/1/1');
$this->client->request('GET', '/api/content-providers/menu/settings/1/1.json');

$settings = $this->client->getResponse()->getContent();

print_r($settings);
$data = json_decode($settings, true);
$this->assertEquals('Main', $data['page']['title']);
$this->assertEquals('Menu', $data['section']['name']);
Expand All @@ -20,7 +20,7 @@ public function testGetSettings()
public function testGetNonExistingSettings()
{
$this->createTestClient();
$this->client->request('GET', '/api/content-providers/menu/settings/1/2');
$this->client->request('GET', '/api/content-providers/menu/settings/1/2.json');

$this->assertEquals(400, $this->client->getResponse()->getStatusCode());
}
Expand All @@ -33,11 +33,9 @@ public function testPost()
'POST',
'/api/content-providers/menu/settings',
array(
'menu_content_provider_settings' => array(
'page' => 1,
'section' => 1,
'parent' => 1
),
'page' => 1,
'section' => 1,
'parent' => 1
)
);

Expand Down

0 comments on commit bdce410

Please sign in to comment.