Passed
Push — master ( 6a1b66...1520a2 )
by Przemysław eRIZ
04:33
created

MediaController::resolveFile()   A

Complexity

Conditions 4
Paths 2

Size

Total Lines 11
Code Lines 6

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 4
eloc 6
c 1
b 0
f 0
nc 2
nop 1
dl 0
loc 11
rs 10

1 Method

Rating   Name   Duplication   Size   Complexity  
A MediaController::getMediaForRequestCode() 0 6 1
1
<?php
2
3
/*
4
 * This file was created by developers working at BitBag
5
 * Do you need more information about us and what we do? Visit our https://bitbag.io website!
6
 * We are hiring developers from all over the world. Join us and start your new, exciting adventure and become part of us: https://bitbag.io/career
7
*/
8
9
declare(strict_types=1);
10
11
namespace BitBag\SyliusCmsPlugin\Controller;
12
13
use BitBag\SyliusCmsPlugin\Entity\MediaInterface;
14
use BitBag\SyliusCmsPlugin\Resolver\MediaProviderResolverInterface;
15
use BitBag\SyliusCmsPlugin\Resolver\MediaResourceResolverInterface;
16
use Sylius\Bundle\ResourceBundle\Controller\RequestConfiguration;
17
use Sylius\Bundle\ResourceBundle\Controller\ResourceController;
18
use Sylius\Component\Resource\ResourceActions;
19
use Symfony\Component\HttpFoundation\BinaryFileResponse;
20
use Symfony\Component\HttpFoundation\File\File;
21
use Symfony\Component\HttpFoundation\Request;
22
use Symfony\Component\HttpFoundation\Response;
23
use Symfony\Component\HttpFoundation\ResponseHeaderBag;
24
use Webmozart\Assert\Assert;
25
26
final class MediaController extends ResourceController
27
{
28
    use ResourceDataProcessingTrait;
29
30
    use MediaPageControllersCommonDependencyInjectionsTrait;
31
32
    /** @var MediaResourceResolverInterface */
33
    private $mediaResourceResolver;
34
35
    /** @var MediaProviderResolverInterface */
36
    private $mediaProviderResolver;
37
38
    public const FILTER = 'sylius_admin_product_original';
39
40
    public function renderMediaAction(Request $request): Response
41
    {
42
        $configuration = $this->getRequestConfiguration($request);
43
        /** @var MediaInterface|null $media */
44
        $media = $this->getMediaForRequestCode($configuration, $request);
45
46
        if (null === $media) {
47
            return new Response();
48
        }
49
50
        $this->eventDispatcher->dispatch(ResourceActions::SHOW, $configuration, $media);
51
52
        return new Response($this->mediaProviderResolver->resolveProvider($media)->render($media, $request->get('template')));
53
    }
54
55
    public function downloadMediaAction(Request $request): Response
56
    {
57
        $configuration = $this->getRequestConfiguration($request);
58
59
        /** @var MediaInterface|null $media */
60
        $media = $this->getMediaForRequestCode($configuration, $request);
61
        Assert::notNull($media);
62
        $this->eventDispatcher->dispatch(ResourceActions::SHOW, $configuration, $media);
0 ignored issues
show
Bug introduced by
It seems like $media can also be of type null; however, parameter $resource of Sylius\Bundle\ResourceBu...erInterface::dispatch() does only seem to accept Sylius\Component\Resource\Model\ResourceInterface, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

62
        $this->eventDispatcher->dispatch(ResourceActions::SHOW, $configuration, /** @scrutinizer ignore-type */ $media);
Loading history...
63
        $mediaPath = $this->getMediaPathIfNotNull($media);
0 ignored issues
show
Bug introduced by
It seems like $media can also be of type null; however, parameter $media of BitBag\SyliusCmsPlugin\C...getMediaPathIfNotNull() does only seem to accept BitBag\SyliusCmsPlugin\Entity\MediaInterface, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

63
        $mediaPath = $this->getMediaPathIfNotNull(/** @scrutinizer ignore-type */ $media);
Loading history...
64
        $mediaFile = new File($mediaPath);
65
        $mediaName = $media->getDownloadName() . '.' . $mediaFile->guessExtension();
66
        $response = new BinaryFileResponse($mediaPath);
67
68
        $response->setContentDisposition(
69
            $request->get('disposition', ResponseHeaderBag::DISPOSITION_ATTACHMENT),
70
            $mediaName
71
        );
72
        $response->headers->set('Content-Type', $media->getMimeType());
73
74
        return $response;
75
    }
76
77
    public function previewAction(Request $request): Response
78
    {
79
        $configuration = $this->getRequestConfiguration($request);
80
81
        $this->isGrantedOr403($configuration, ResourceActions::CREATE);
82
        /** @var MediaInterface $media */
83
        $media = $this->getResourceInterface($request);
84
        $form = $this->getFormForResource($configuration, $media);
85
        $mediaTemplate = null;
86
87
        $form->handleRequest($request);
88
89
        if ($form->isValid()) {
90
            $this->setMediaLocales($media, $request);
91
            $this->setMediaPathIfExists($media);
92
            $mediaTemplate = $this->mediaProviderResolver->resolveProvider($media)->getTemplate();
93
        }
94
        $this->formErrorsFlashHelper->addFlashErrors($form);
95
96
        return $this->render($configuration->getTemplate(ResourceActions::CREATE . '.html'), [
97
            'metadata' => $this->metadata,
98
            'resource' => $media,
99
            'mediaTemplate' => $mediaTemplate,
100
            $this->metadata->getName() => $media,
101
        ]);
102
    }
103
104
    public function setMediaProviderResolver(MediaProviderResolverInterface $mediaProviderResolver): void
105
    {
106
        $this->mediaProviderResolver = $mediaProviderResolver;
107
    }
108
109
    public function setMediaResourceResolver(MediaResourceResolverInterface $mediaResourceResolver): void
110
    {
111
        $this->mediaResourceResolver = $mediaResourceResolver;
112
    }
113
114
    private function getMediaForRequestCode(RequestConfiguration $configuration, Request $request): ?MediaInterface
115
    {
116
        $this->isGrantedOr403($configuration, ResourceActions::SHOW);
117
        $code = $request->get('code');
118
119
        return $this->mediaResourceResolver->findOrLog($code);
0 ignored issues
show
Bug introduced by
It seems like $code can also be of type null; however, parameter $code of BitBag\SyliusCmsPlugin\R...rInterface::findOrLog() does only seem to accept string, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

119
        return $this->mediaResourceResolver->findOrLog(/** @scrutinizer ignore-type */ $code);
Loading history...
120
    }
121
122
    private function setMediaLocales(MediaInterface $media, Request $request): void
123
    {
124
        $defaultLocale = $this->getParameter('locale');
125
        $media->setFallbackLocale($request->get('_locale', $defaultLocale));
126
        $media->setCurrentLocale($request->get('_locale', $defaultLocale));
127
    }
128
129
    private function setMediaPathIfExists(MediaInterface $media): void
130
    {
131
        if (null !== $media->getFile() || null !== $media->getPath()) {
132
            $this->setResourceMediaPath($media);
133
        }
134
    }
135
}
136