Completed
Push — master ( 9aadb1...deaeeb )
by Paweł
11:03
created

AmpController   A

Complexity

Total Complexity 7

Size/Duplication

Total Lines 55
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 6

Importance

Changes 0
Metric Value
wmc 7
lcom 1
cbo 6
dl 0
loc 55
rs 10
c 0
b 0
f 0

3 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 11 1
A viewAction() 0 18 2
A getCacheKey() 0 13 4
1
<?php
2
3
/*
4
 * This file is part of the Superdesk Web Publisher Core Bundle.
5
 *
6
 * Copyright 2019 Sourcefabric z.u. and contributors.
7
 *
8
 * For the full copyright and license information, please see the
9
 * AUTHORS and LICENSE files distributed with this source code.
10
 *
11
 * @copyright 2019 Sourcefabric z.ú
12
 * @license http://www.superdesk.org/license
13
 */
14
15
namespace SWP\Bundle\CoreBundle\Controller;
16
17
use Doctrine\Common\Cache\CacheProvider;
18
use SWP\Component\Common\Model\TimestampableInterface;
19
use SWP\Component\Storage\Model\PersistableInterface;
20
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
21
use Symfony\Component\HttpFoundation\Response;
22
use Takeit\Bundle\AmpHtmlBundle\Converter\AmpConverterInterface;
23
use Takeit\Bundle\AmpHtmlBundle\Loader\ThemeLoaderInterface;
24
use Takeit\Bundle\AmpHtmlBundle\Model\AmpInterface;
25
use Twig\Environment;
26
27
final class AmpController extends AbstractController
28
{
29
    private $twig;
30
31
    private $converter;
32
33
    private $themeLoader;
34
35
    private $cacheService;
36
37
    public function __construct(
38
        Environment $twig,
39
        AmpConverterInterface $ampConverter,
40
        ThemeLoaderInterface $ampThemeLoader,
41
        CacheProvider $cacheService
42
    ) {
43
        $this->twig = $twig;
44
        $this->converter = $ampConverter;
45
        $this->themeLoader = $ampThemeLoader;
46
        $this->cacheService = $cacheService;
47
    }
48
49
    public function viewAction(AmpInterface $object): Response
50
    {
51
        if ($this->cacheService->contains($cacheKey = $this->getCacheKey($object))) {
52
            return $this->cacheService->fetch($cacheKey);
53
        }
54
55
        $this->themeLoader->load();
56
        $content = $this->twig->render(sprintf('@%s/index.html.twig', ThemeLoaderInterface::THEME_NAMESPACE), [
57
            'object' => $object,
58
        ]);
59
60
        $response = new Response();
61
        $response->setContent($this->converter->convertToAmp($content));
62
63
        $this->cacheService->save($cacheKey, $response);
64
65
        return $response;
66
    }
67
68
    private function getCacheKey(AmpInterface $object): string
69
    {
70
        $elements = ['amp_article'];
71
        if ($object instanceof PersistableInterface) {
72
            $elements[] = $object->getId();
73
        }
74
75
        if ($object instanceof TimestampableInterface && null !== $object->getUpdatedAt()) {
76
            $elements[] = $object->getUpdatedAt()->getTimestamp();
77
        }
78
79
        return md5(implode('__', $elements));
80
    }
81
}
82