<?php
namespace App\Controller;
use App\DTO\PostNotification;
use App\Entity\Post;
use App\Form\Type\PostFormType;
use App\Manager\PostManager;
use App\Service\NotificationService;
use App\Service\PagerService;
use FOS\RestBundle\Controller\Annotations as Rest;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
/**
* Class PostController
* @package App\Controller
*
* @Rest\Prefix("/posts")
*/
class PostController extends AbstractController
{
/**
* @var PostManager
*/
protected $postManager;
/**
* @var PagerService
*/
protected $pagerService;
/**
* @var NotificationService
*/
protected $notificationService;
/**
* PostController constructor.
* @param PostManager $postManager
* @param PagerService $pagerService
*/
public function __construct(PostManager $postManager, PagerService $pagerService, NotificationService $notificationService)
{
$this->postManager = $postManager;
$this->pagerService = $pagerService;
$this->notificationService = $notificationService;
}
/**
* @Rest\Get("")
* @return Response
*/
public function getPostsAction()
{
$query = $this->postManager->getAllPublishedQuery();
$pagination = $this->pagerService->paginate($query);
return $this->getResponse($pagination);
}
/**
* @Rest\Get("/{post}", requirements={"post": "\d+"})
* @param Post $post
* @return Response
*/
public function getPostAction(Post $post)
{
return $this->getResponse($post, Response::HTTP_OK, ['Default', 'Item']);
}
/**
* @Rest\Post("")
* @param Request $request
* @return Response
*/
public function postPostAction(Request $request)
{
$post = $this->postManager->create();
$form = $this->createForm(PostFormType::class, $post);
$form->submit($request->request->all());
if (!$form->isValid()) {
return $this->getResponse($form, Response::HTTP_BAD_REQUEST);
}
$this->postManager->update($post);
if ($request->request->get("notification")) {
$this->notificationService->send(new PostNotification($post));
}
return $this->getResponse($post, Response::HTTP_CREATED, ['Default', 'Item']);
}
/**
* @Rest\Patch("/{post}", requirements={"post": "\d+"})
* @param Request $request
* @return Response
*/
public function pathPostAction(Request $request, Post $post)
{
$form = $this->createForm(PostFormType::class, $post);
$form->submit($request->request->all(), false);
if (!$form->isValid()) {
return $this->getResponse($form, Response::HTTP_BAD_REQUEST);
}
$this->postManager->update($post);
return $this->getResponse($post, Response::HTTP_OK, ['Default', 'Item']);
}
/**
* @Rest\Delete("/{post}", requirements={"post": "\d+"})
* @param Post $post
* @return Response
*/
public function deletePostAction(Post $post)
{
$this->postManager->remove($post);
return $this->getResponse($post, Response::HTTP_NO_CONTENT);
}
}