zend-blog-3-backend
135 строк · 3.8 Кб
1<?php
2
3namespace App\Controller;
4
5use App\Entity\Post;
6use App\Repository\ViewCommentRepository;
7use GuzzleHttp\Client;
8use GuzzleHttp\Exception\GuzzleException;
9use Sensio\Bundle\FrameworkExtraBundle\Configuration\ParamConverter;
10use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
11use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
12use Symfony\Component\HttpFoundation\JsonResponse;
13use Symfony\Component\HttpFoundation\Response;
14use Symfony\Component\Routing\Annotation\Route;
15
16/**
17* Class DefaultController
18*/
19class DefaultController extends AbstractController
20{
21/**
22* @var string
23*/
24private string $kernelEnv;
25
26/**
27* @var string
28*/
29private string $cdnUrl;
30
31private string $blogUrl;
32
33public function __construct(string $kernelEnv, string $cdnUrl, string $frontendSite)
34{
35$this->kernelEnv = $kernelEnv;
36$this->cdnUrl = $cdnUrl;
37$this->blogUrl = $frontendSite;
38}
39
40/**
41* @Route("/")
42* @Template()
43*
44* @throws \JsonException
45*
46* @return array
47*/
48public function indexAction(): array
49{
50$isDev = $this->kernelEnv === 'dev';
51
52$environment = [
53'modulePrefix' => 'mtt-blog',
54'environment' => ($this->kernelEnv === 'prod') ? 'production' : 'development',
55'baseURL' => '/',
56'locationType' => 'hash',
57'EmberENV' => [
58'FEATURES' => [],
59],
60'APP' => [
61'LOG_ACTIVE_GENERATION' => $isDev,
62'LOG_TRANSITIONS' => $isDev,
63'LOG_TRANSITIONS_INTERNAL' => $isDev,
64'LOG_VIEW_LOOKUPS' => $isDev,
65'LOG_BINDINGS' => $isDev,
66'name' => 'mtt-blog',
67'version' => '0.0.1 a8c1ef27',
68],
69'contentSecurityPolicyHeader' => 'Content-Security-Policy-Report-Only',
70'contentSecurityPolicy' => [
71'default-src' => "'none'",
72'script-src' => "'self' 'unsafe-eval'",
73'font-src' => "'self'",
74'connect-src' => "'self'",
75'img-src' => "'self'",
76'style-src' => "'self'",
77'media-src' => "'self'",
78],
79'exportApplicationGlobal' => true,
80'appParameters' => [
81'apiURL' => $this->generateUrl('api_root'),
82'cdnURL' => $this->cdnUrl,
83],
84];
85
86return [
87'env' => urlencode(json_encode($environment, JSON_THROW_ON_ERROR)),
88];
89}
90
91/**
92* @Route("/preview/{slug}", name="post_preview", options={"expose"=true})
93* @ParamConverter("post", options={"mapping": {"slug": "url"}})
94* @Template()
95*
96* @param Post|null $post
97* @param ViewCommentRepository $repository
98*
99* @return array
100*/
101public function previewAction(ViewCommentRepository $repository, Post $post = null): array
102{
103if (!$post) {
104throw $this->createNotFoundException();
105}
106
107$comments = $repository->getCommentsByPost($post);
108
109return compact('post', 'comments');
110}
111
112/**
113* @Route("/purge-cache", name="purge_cache", options={"expose"=true}, methods={"POST"})
114*
115* @return JsonResponse
116*/
117public function purgeBlogCacheAction(): JsonResponse
118{
119$httpClient = new Client(['base_uri' => $this->blogUrl]);
120try {
121$response = $httpClient->request(
122'POST',
123'/purge-cache',
124[
125'headers' => ['X-Ban-Token' => getenv('VARNISH_BAN_TOKEN')],
126]
127);
128$status = $response->getStatusCode();
129} catch (GuzzleException $e) {
130$status = Response::HTTP_BAD_REQUEST;
131}
132
133return new JsonResponse([], $status);
134}
135}
136