deblan.io-murph/src/Controller/Blog/PostController.php
2021-04-11 23:17:39 +02:00

216 lines
6.7 KiB
PHP

<?php
namespace App\Controller\Blog;
use App\Core\Annotation\UrlGenerator;
use App\Core\Controller\Site\PageController;
use App\Core\Manager\EntityManager;
use App\Core\Site\SiteRequest;
use App\Core\Site\SiteStore;
use App\Entity\Blog\Category;
use App\Entity\Blog\Post;
use App\Factory\Blog\CommentFactory;
use App\Form\Blog\UserCommentType;
use App\Markdown\Parser\Post as PostParser;
use App\Repository\Blog\PostRepositoryQuery;
use App\UrlGenerator\PostGenerator;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
class PostController extends PageController
{
protected PostRepositoryQuery $postQuery;
public function __construct(PostRepositoryQuery $postQuery, SiteRequest $siteRequest, SiteStore $siteStore)
{
parent::__construct($siteRequest, $siteStore);
$this->postQuery = $postQuery;
}
/**
* @UrlGenerator(service=PostGenerator::class, method="post")
*/
public function post(
Post $post,
string $slug,
CommentFactory $commentFactory,
Request $request,
EntityManager $entityManager
): Response {
if (Post::DRAFT === $post->getStatus() && !$this->getUser()) {
throw $this->createNotFoundException();
}
if ($slug !== $post->getSlug()) {
return $this->redirectToRoute(
$this->siteRequest->getNode()->getRouteName(),
[
'post' => $post->getId(),
'slug' => $post->getSlug(),
]
);
}
$form = $this->createForm(UserCommentType::class, $commentFactory->create($post));
if ($request->isMethod('POST')) {
$form->handleRequest($request);
if ($form->isValid()) {
$data = $request->request->get($form->getName());
$parentCommentId = (int) $data['parentCommentId'];
foreach ($post->getComments(['id' => $parentCommentId]) as $comment) {
$form->getData()->setParentComment($comment);
}
$entityManager->create($form->getData());
$this->addFlash('success', 'Commentaire publié !');
return $this->redirect($request->getUri());
}
$this->addFlash('error', 'Le formulaire n\'est pas valide.');
}
return $this->defaultRender('blog/post/post.html.twig', [
'post' => $post,
'form' => $form->createView(),
]);
}
public function posts(int $page = 1): Response
{
$entities = $this->createQuery()
->paginate($page, 5)
;
return $this->defaultRender('blog/post/posts.html.twig', [
'pager' => $entities,
]);
}
public function search(Request $request, int $page = 1): Response
{
$query = $request->query->get('query');
$tag = $request->query->get('tag');
if ($query || $tag) {
$entities = $this->createQuery()
->search($query, $tag)
->paginate($page, 5)
;
}
return $this->defaultRender('blog/post/search.html.twig', [
'pager' => $entities ?? null,
'query' => $query,
]);
}
/**
* @UrlGenerator(service=PostGenerator::class, method="category")
*/
public function category(Category $category, string $slug, int $page = 1): Response
{
$entities = $this->createQuery()
->inCategory($category)
->paginate($page, 5)
;
if (!$category->getIsActive() && !$this->getUser()) {
throw $this->createNotFoundException();
}
if ($slug !== $category->getSlug()) {
return $this->redirectToRoute(
$this->siteRequest->getNode()->getRouteName(),
[
'category' => $category->getId(),
'slug' => $category->getSlug(),
]
);
}
return $this->defaultRender('blog/post/category.html.twig', [
'category' => $category,
'pager' => $entities,
]);
}
public function tag(string $tag, int $page = 1): Response
{
}
public function createQuery(): PostRepositoryQuery
{
return $this->postQuery->create()
->orderBy('.publishedAt', 'DESC')
->published()
;
}
public function rss(PostParser $parser): Response
{
$entities = $this->createQuery()->paginate(1, 20);
$items = [];
foreach ($entities as $entity) {
$items[] = [
'title' => $entity->getTitle(),
'guid' => $entity->getId(),
'date' => $entity->getPublishedAt(),
'description' => $parser->transformMarkdown($entity->getContent()),
'categories' => call_user_func(function () use ($entity) {
foreach ($entity->getCategories() as $category) {
if ($category->getIsActive()) {
yield $category->getTitle();
}
}
}),
'link' => $this->generateUrl('blog_menu_post', [
'post' => $entity->getId(),
'slug' => $entity->getSlug(),
], UrlGeneratorInterface::ABSOLUTE_URL),
];
}
$response = new Response();
$response->headers->set('Content-Type', 'text/xml');
return $this->defaultRender($this->siteRequest->getPage()->getTemplate(), [
'items' => $items,
], $response);
}
public function jsonApi(PostParser $parser): Response
{
$entities = $this->createQuery()->paginate(1, 30);
$items = [];
foreach ($entities as $entity) {
$items[] = [
'id' => $entity->getId(),
'title' => $entity->getTitle(),
'date' => $entity->getPublishedAt()->format('Y-m-d H:i:s'),
'link' => $this->generateUrl('blog_menu_post', [
'post' => $entity->getId(),
'slug' => $entity->getSlug(),
], UrlGeneratorInterface::ABSOLUTE_URL),
'content' => $entity->getContent(),
'categories' => call_user_func(function () use ($entity) {
foreach ($entity->getCategories() as $category) {
if ($category->getIsActive()) {
yield $category->getTitle();
}
}
}),
];
}
return $this->json($items);
}
}