Completed
Push — master ( 071097...7934b9 )
by
unknown
09:17
created

FileProvider::getImageByExtension()   C

Complexity

Conditions 11
Paths 11

Size

Total Lines 38
Code Lines 24

Duplication

Lines 9
Ratio 23.68 %

Code Coverage

Tests 12
CRAP Score 26.125

Importance

Changes 0
Metric Value
dl 9
loc 38
ccs 12
cts 24
cp 0.5
rs 5.2653
c 0
b 0
f 0
cc 11
eloc 24
nc 11
nop 1
crap 26.125

How to fix   Complexity   

Long Method

Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.

For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.

Commonly applied refactorings include:

1
<?php
2
3
namespace MediaMonks\SonataMediaBundle\Provider;
4
5
use MediaMonks\SonataMediaBundle\Model\AbstractMedia;
6
use Sonata\AdminBundle\Form\FormMapper;
7
use Symfony\Component\HttpFoundation\File\UploadedFile;
8
use Symfony\Component\Validator\Constraints as Constraint;
9
use Symfony\Component\Validator\Context\ExecutionContextInterface;
10
11
class FileProvider extends AbstractProvider
12
{
13
    /**
14
     * @var array
15
     */
16
    private $fileConstraintOptions = [];
17
18
    /**
19
     * @param array $fileConstraintOptions
20
     */
21 8
    public function __construct(array $fileConstraintOptions = [])
22
    {
23 8
        $this->fileConstraintOptions = $fileConstraintOptions;
24 8
    }
25
26
    /**
27
     * @param FormMapper $formMapper
28
     */
29 3
    public function buildProviderCreateForm(FormMapper $formMapper)
30
    {
31 3
        $this->addRequiredFileField($formMapper, 'binaryContent', 'file');
32 3
    }
33
34
    /**
35
     * @param FormMapper $formMapper
36
     */
37 2
    public function buildProviderEditFormBefore(FormMapper $formMapper)
38
    {
39 2
        $this->addFileField($formMapper, 'binaryContent', 'file');
40 2
    }
41
42
    /**
43
     * @param AbstractMedia $media
44
     * @param bool $providerReferenceUpdated
45
     */
46 2
    public function update(AbstractMedia $media, $providerReferenceUpdated)
47
    {
48 2
        if (!is_null($media->getBinaryContent())) {
49 2
            if (empty($media->getImage())) {
50 2
                $this->setFileImage($media);
51
            }
52 2
            $filename = $this->handleFileUpload($media);
53 2
            if (!empty($filename)) {
54 2
                $media->setProviderReference($filename);
55
            }
56
        }
57
58 2
        parent::update($media, $providerReferenceUpdated);
59 2
    }
60
61
    /**
62
     * @return string
63
     */
64 8
    public function getIcon()
65
    {
66 8
        return 'fa fa-file';
67
    }
68
69
    /**
70
     * @return string
71
     */
72 8
    public function getName()
73
    {
74 8
        return 'file';
75
    }
76
77
    /**
78
     * @return string
79
     */
80 3
    public function getType()
81
    {
82 3
        return AbstractProvider::TYPE_FILE;
83
    }
84
85
    /**
86
     * @param AbstractMedia $media
87
     */
88 2
    protected function setFileImage(AbstractMedia $media)
89
    {
90
        /**
91
         * @var UploadedFile $file
92
         */
93 2
        $file = $media->getBinaryContent();
94 2
        if (empty($file)) {
95
            return;
96
        }
97
98 2
        $imageFilename = $this->getImageByExtension($file->getClientOriginalExtension());
99 2
        $media->setImageContent(
100 2
            new UploadedFile(
101 2
                $this->getImageLocation().$imageFilename,
102 2
                $imageFilename
103
            )
104
        );
105 2
    }
106
107
    /**
108
     * @param FormMapper $formMapper
109
     * @param string $name
110
     * @param string $label
111
     * @param array $options
112
     */
113 2 View Code Duplication
    public function addFileField(FormMapper $formMapper, $name, $label, $options = [])
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
114
    {
115 2
        $this->doAddFileField(
116
            $formMapper,
117
            $name,
118
            $label,
119 2
            false,
120
            [
121 2
                new Constraint\File($this->getFileConstraintOptions($options)),
122 2
                new Constraint\Callback([$this, 'validateExtension']),
123
            ]
124
        );
125 2
    }
126
127
    /**
128
     * @param FormMapper $formMapper
129
     * @param string $name
130
     * @param string $label
131
     * @param array $options
132
     */
133 3 View Code Duplication
    public function addRequiredFileField(FormMapper $formMapper, $name, $label, $options = [])
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
134
    {
135 3
        $this->doAddFileField(
136
            $formMapper,
137
            $name,
138
            $label,
139 3
            true,
140
            [
141 3
                new Constraint\File($this->getFileConstraintOptions($options)),
142 3
                new Constraint\Callback([$this, 'validateExtension']),
143
            ]
144
        );
145 3
    }
146
147
    /**
148
     * @param array $options
149
     * @return array
150
     */
151 3
    protected function getFileConstraintOptions(array $options = [])
152
    {
153 3
        $merged = array_merge($this->fileConstraintOptions, $options);
154 3
        unset($merged['extensions']);
155
156 3
        return $merged;
157
    }
158
159
    /**
160
     * @param $object
161
     * @param ExecutionContextInterface $context
162
     */
163 3
    public function validateExtension($object, ExecutionContextInterface $context)
164
    {
165 3
        if ($object instanceof UploadedFile && isset($this->fileConstraintOptions['extensions'])) {
166 3
            if (!in_array($object->getClientOriginalExtension(), $this->fileConstraintOptions['extensions'])) {
167 1
                $context->addViolation(
168 1
                    sprintf(
169 1
                        'It\'s not allowed to upload a file with extension "%s"',
170 1
                        $object->getClientOriginalExtension()
171
                    )
172
                );
173
            }
174
        }
175 3
    }
176
177
    /**
178
     * @param $extension
179
     * @return string
180
     */
181 2
    protected function getImageByExtension($extension)
182
    {
183 2
        if (in_array($extension, ['zip', 'rar', 'tar', 'gz'])) {
184
            return 'archive.png';
185
        }
186 2 View Code Duplication
        if (in_array($extension, ['wav', 'mp3', 'flac', 'aac', 'aiff', 'm4a', 'ogg', 'oga', 'wma'])) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
187
            return 'audio.png';
188
        }
189 2
        if (in_array($extension, ['php', 'html', 'css', 'js', 'vb', 'phar', 'py', 'jar', 'json', 'yml'])) {
190
            return 'code.png';
191
        }
192 2 View Code Duplication
        if (in_array($extension, ['xls', 'xlt', 'xlm', 'xlsx', 'xlsm', 'xltx', 'xltm'])) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
193
            return 'excel.png';
194
        }
195 2
        if (in_array($extension, ['png', 'jpg', 'jpeg', 'gif', 'bmp', 'tiff', 'ai', 'psd'])) {
196
            return 'image.png';
197
        }
198 2
        if (in_array($extension, ['mp4', 'avi', 'mkv', 'mpg', 'mpeg'])) {
199
            return 'movie.png';
200
        }
201 2
        if (in_array($extension, ['pdf'])) {
202
            return 'pdf.png';
203
        }
204 2
        if (in_array(
205
            $extension,
206 2
            ['ppt', 'pot', 'pos', 'pps', 'pptx', 'pptm', 'potx', 'potm', 'ppam', 'ppsx', 'ppsm', 'sldx', 'sldm']
207
        )) {
208
            return 'powerpoint.png';
209
        }
210 2
        if (in_array($extension, ['txt'])) {
211 2
            return 'text.png';
212
        }
213 View Code Duplication
        if (in_array($extension, ['doc', 'dot', 'wbk', 'docx', 'docm', 'dotx', 'dotm', 'docb'])) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
214
            return 'word.png';
215
        }
216
217
        return 'default.png';
218
    }
219
220
    /**
221
     * @return string
222
     */
223 2
    protected function getImageLocation()
224
    {
225 2
        return __DIR__.'/../Resources/image/file/';
226
    }
227
228
    /**
229
     * @return bool
230
     */
231 2
    public function supportsDownload()
232
    {
233 2
        return true;
234
    }
235
236
    /**
237
     * @return bool
238
     */
239 2
    public function supportsEmbed()
240
    {
241 2
        return false;
242
    }
243
244
    /**
245
     * @return bool
246
     */
247 2
    public function supportsImage()
248
    {
249 2
        return true;
250
    }
251
}
252