ImageEdit::execute()   F
last analyzed

Complexity

Conditions 22
Paths 181

Size

Total Lines 96
Code Lines 58

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 22
eloc 58
c 0
b 0
f 0
nc 181
nop 7
dl 0
loc 96
rs 3.4916

How to fix   Long Method    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
/*
4
 * CKFinder
5
 * ========
6
 * http://cksource.com/ckfinder
7
 * Copyright (C) 2007-2016, CKSource - Frederico Knabben. All rights reserved.
8
 *
9
 * The software, this file and its contents are subject to the CKFinder
10
 * License. Please read the license.txt file before using, installing, copying,
11
 * modifying or distribute this file or part of its contents. The contents of
12
 * this file is part of the Source Code of CKFinder.
13
 */
14
15
namespace CKSource\CKFinder\Command;
16
17
use CKSource\CKFinder\Acl\Acl;
18
use CKSource\CKFinder\Acl\Permission;
19
use CKSource\CKFinder\Config;
20
use CKSource\CKFinder\Event\CKFinderEvent;
21
use CKSource\CKFinder\Event\EditFileEvent;
22
use CKSource\CKFinder\Exception\InvalidExtensionException;
23
use CKSource\CKFinder\Exception\InvalidRequestException;
24
use CKSource\CKFinder\Exception\InvalidUploadException;
25
use CKSource\CKFinder\Exception\UnauthorizedException;
26
use CKSource\CKFinder\Filesystem\File\EditedImage;
27
use CKSource\CKFinder\Filesystem\Folder\WorkingFolder;
28
use CKSource\CKFinder\Image;
29
use CKSource\CKFinder\ResizedImage\ResizedImageRepository;
30
use CKSource\CKFinder\Thumbnail\ThumbnailRepository;
31
use CKSource\CKFinder\Utils;
32
use Symfony\Component\EventDispatcher\EventDispatcher;
33
use Symfony\Component\HttpFoundation\Request;
34
35
/**
36
 * The ImageEdit command class.
37
 *
38
 * This command performs basic image modifications:
39
 * - crop
40
 * - rotate
41
 * - resize
42
 *
43
 * @copyright 2016 CKSource - Frederico Knabben
44
 */
45
class ImageEdit extends CommandAbstract
46
{
47
    const OPERATION_CROP   = 'crop';
48
    const OPERATION_ROTATE = 'rotate';
49
    const OPERATION_RESIZE = 'resize';
50
51
    protected $requestMethod = Request::METHOD_POST;
52
53
    protected $requires = array(Permission::FILE_CREATE);
54
55
    public function execute(Request $request, WorkingFolder $workingFolder, EventDispatcher $dispatcher, Acl $acl, ResizedImageRepository $resizedImageRepository, ThumbnailRepository $thumbnailRepository, Config $config)
56
    {
57
        $fileName = (string) $request->get('fileName');
58
        $newFileName = (string) $request->get('newFileName');
59
60
        $editedImage = new EditedImage($fileName, $this->app, $newFileName);
61
62
        $resourceType = $workingFolder->getResourceType();
63
64
        if (null === $newFileName) {
0 ignored issues
show
introduced by
The condition null === $newFileName is always false.
Loading history...
65
            $resourceTypeName = $resourceType->getName();
66
            $path = $workingFolder->getClientCurrentFolder();
67
68
            if (!$acl->isAllowed($resourceTypeName, $path, Permission::FILE_DELETE)) {
69
                throw new UnauthorizedException(sprintf('Unauthorized: no FILE_DELETE permission in %s:%s', $resourceTypeName, $path));
70
            }
71
        }
72
73
        if (!Image::isSupportedExtension($editedImage->getExtension())) {
74
            throw new InvalidExtensionException('Unsupported image type or not image file');
75
        }
76
77
        $image = Image::create($editedImage->getContents());
0 ignored issues
show
Bug introduced by
$editedImage->getContents() of type resource is incompatible with the type string expected by parameter $data of CKSource\CKFinder\Image::create(). ( Ignorable by Annotation )

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

77
        $image = Image::create(/** @scrutinizer ignore-type */ $editedImage->getContents());
Loading history...
78
79
        $actions = (array) $request->get('actions');
80
81
        if (empty($actions)) {
82
            throw new InvalidRequestException();
83
        }
84
85
        foreach ($actions as $actionInfo) {
86
            if (!isset($actionInfo['action'])) {
87
                throw new InvalidRequestException('ImageEdit: action name missing');
88
            }
89
90
            switch ($actionInfo['action']) {
91
                case self::OPERATION_CROP:
92
                    if (!Utils::arrayContainsKeys($actionInfo, array('x', 'y', 'width', 'height'))) {
93
                        throw new InvalidRequestException();
94
                    }
95
                    $x = $actionInfo['x'];
96
                    $y = $actionInfo['y'];
97
                    $width = $actionInfo['width'];
98
                    $height = $actionInfo['height'];
99
                    $image->crop($x, $y, $width, $height);
100
                    break;
101
102
                case self::OPERATION_ROTATE:
103
                    if (!isset($actionInfo['angle'])) {
104
                        throw new InvalidRequestException();
105
                    }
106
                    $degrees = $actionInfo['angle'];
107
                    $bgcolor = isset($actionInfo['bgcolor']) ? $actionInfo['bgcolor'] : 0;
108
                    $image->rotate($degrees, $bgcolor);
109
                    break;
110
111
                case self::OPERATION_RESIZE:
112
                    if (!Utils::arrayContainsKeys($actionInfo, array('width', 'height'))) {
113
                        throw new InvalidRequestException();
114
                    }
115
116
                    $imagesConfig = $config->get('images');
117
118
                    $width = $imagesConfig['maxWidth'] && $actionInfo['width'] > $imagesConfig['maxWidth'] ? $imagesConfig['maxWidth'] : $actionInfo['width'];
119
                    $height = $imagesConfig['maxHeight'] && $actionInfo['height'] > $imagesConfig['maxHeight'] ? $imagesConfig['maxHeight'] : $actionInfo['height'];
120
                    $image->resize((int) $width, (int) $height, $imagesConfig['quality']);
121
                    break;
122
            }
123
        }
124
125
        $editFileEvent = new EditFileEvent($this->app, $editedImage);
126
127
        $editedImage->setNewContents($image->getData());
128
        $editedImage->setNewDimensions($image->getWidth(), $image->getHeight());
129
130
        if (!$editedImage->isValid()) {
131
            throw new InvalidUploadException('Invalid file provided');
132
        }
133
134
        $dispatcher->dispatch(CKFinderEvent::EDIT_IMAGE, $editFileEvent);
135
136
        $saved = false;
137
138
        if (!$editFileEvent->isPropagationStopped()) {
139
            $saved = $editedImage->save($editFileEvent->getNewContents());
140
141
            //Remove thumbnails and resized images in case if file is overwritten
142
            if ($newFileName === null && $saved) {
0 ignored issues
show
introduced by
The condition $newFileName === null is always false.
Loading history...
143
                $thumbnailRepository->deleteThumbnails($resourceType, $workingFolder->getClientCurrentFolder(), $fileName);
144
                $resizedImageRepository->deleteResizedImages($resourceType, $workingFolder->getClientCurrentFolder(), $fileName);
145
            }
146
        }
147
148
        return array(
149
            'saved' => (int) $saved,
150
            'date'  => Utils::formatDate(time())
151
        );
152
    }
153
}
154