Passed
Push — master ( 48b5f2...d3d7f5 )
by Julito
16:02
created

BaseResourceFileAction::handleUpdateRequest()   B

Complexity

Conditions 10
Paths 48

Size

Total Lines 65
Code Lines 38

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 10
eloc 38
nc 48
nop 3
dl 0
loc 65
rs 7.6666
c 1
b 0
f 0

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
declare(strict_types=1);
4
5
/* For licensing terms, see /license.txt */
6
7
namespace Chamilo\CoreBundle\Controller\Api;
8
9
use Chamilo\CoreBundle\Entity\AbstractResource;
10
use Chamilo\CoreBundle\Entity\ResourceLink;
11
use Chamilo\CourseBundle\Entity\CDocument;
12
use InvalidArgumentException;
13
use Symfony\Component\HttpFoundation\File\UploadedFile;
14
use Symfony\Component\HttpFoundation\Request;
15
use Symfony\Component\HttpKernel\Exception\BadRequestHttpException;
16
17
class BaseResourceFileAction
18
{
19
    protected function handleCreateRequest(AbstractResource $resource, Request $request)
20
    {
21
        error_log('handleCreateRequest');
22
        $contentData = $request->getContent();
23
        if (!empty($contentData)) {
24
            $contentData = json_decode($contentData, true);
25
            var_dump($contentData);
0 ignored issues
show
Security Debugging Code introduced by
var_dump($contentData) looks like debug code. Are you sure you do not want to remove it?
Loading history...
26
            $title = $contentData['title'];
27
            $comment = $contentData['comment'];
28
        } else {
29
            $title = $request->get('title');
30
            $comment = $request->get('comment');
31
        }
32
33
        $fileType = 'folder';
34
        if ($request->request->has('filetype')) {
35
            $fileType = $request->get('filetype');
36
        }
37
38
        if (empty($fileType)) {
39
            throw new \Exception('filetype needed: folder or file');
40
        }
41
42
        $nodeId = (int) $request->get('parentResourceNodeId');
43
44
        if (0 === $nodeId) {
45
            throw new \Exception('parentResourceNodeId int value needed');
46
        }
47
48
        $resource->setParentResourceNode($nodeId);
49
50
        switch ($fileType) {
51
            case 'file':
52
                $content = '';
53
                if ($request->request->has('contentFile')) {
54
                    $content = $request->request->get('contentFile');
55
                }
56
                $fileParsed = false;
57
                // File upload.
58
                if ($request->files->count() > 0) {
59
                    if (!$request->files->has('uploadFile')) {
60
                        throw new BadRequestHttpException('"uploadFile" is required');
61
                    }
62
63
                    /** @var UploadedFile $uploadedFile */
64
                    $uploadedFile = $request->files->get('uploadFile');
65
                    $title = $uploadedFile->getClientOriginalName();
66
                    $resource->setUploadFile($uploadedFile);
67
                    $fileParsed = true;
68
                }
69
70
                // Get data in content and create a HTML file.
71
                if (!$fileParsed && $content) {
72
                    $handle = tmpfile();
73
                    fwrite($handle, $content);
74
                    $meta = stream_get_meta_data($handle);
75
                    $file = new UploadedFile($meta['uri'], $title.'.html', 'text/html', null, true);
76
                    $resource->setUploadFile($file);
77
                    $fileParsed = true;
78
                }
79
80
                if (!$fileParsed) {
81
                    throw new InvalidArgumentException('filetype was set to "file" but not upload found');
82
                }
83
84
                break;
85
            case 'folder':
86
                break;
87
        }
88
89
        if (empty($title)) {
90
            throw new InvalidArgumentException('title required');
91
        }
92
93
        $resource->setResourceName($title);
94
    }
95
96
    protected function handleUpdateRequest(AbstractResource $resource, $repo, Request $request)
97
    {
98
        error_log('handleUpdateRequest');
99
        $contentData = $request->getContent();
100
        $resourceLinkList = [];
101
        if (!empty($contentData)) {
102
            error_log('contentData');
103
            $contentData = json_decode($contentData, true);
104
            $title = $contentData['title'];
105
            $content = $contentData['contentFile'];
106
            //$comment = $contentData['comment'] ?? '';
107
            $resourceLinkList = $contentData['resourceLinkListFromEntity'] ?? [];
108
        } else {
109
            $title = $request->get('title');
110
            $content = $request->request->get('contentFile');
111
            //$comment = $request->request->get('comment');
112
        }
113
114
        $repo->setResourceName($resource, $title);
115
116
        $hasFile = $resource->getResourceNode()->hasResourceFile();
117
118
        //if ('file' === $fileType && !empty($content)) {
119
        if ($hasFile && !empty($content)) {
120
            $resourceNode = $resource->getResourceNode();
121
            if ($resourceNode->hasResourceFile()) {
122
                $resourceNode->setContent($content);
123
                $resourceNode->getResourceFile()->setSize(\strlen($content));
124
            }
125
            $resourceNode->setUpdatedAt(new DateTime());
0 ignored issues
show
Bug introduced by
The type Chamilo\CoreBundle\Controller\Api\DateTime was not found. Did you mean DateTime? If so, make sure to prefix the type with \.
Loading history...
126
            $resourceNode->getResourceFile()->setUpdatedAt(new DateTime());
127
            $resource->setResourceNode($resourceNode);
128
        }
129
130
        $link = null;
131
        if (!empty($resourceLinkList)) {
132
            foreach ($resourceLinkList as $linkArray) {
133
                // Find the exact link.
134
                $linkId = $linkArray['id'];
135
                /** @var ResourceLink $link */
136
                $link = $resource->getResourceNode()->getResourceLinks()
137
                    ->filter(
138
                        fn ($link) => $link->getId() === $linkId
139
                    )->first();
140
141
                if (null !== $link) {
142
                    $link->setVisibility((int) $linkArray['visibility']);
143
144
                    break;
145
                }
146
            }
147
        }
148
149
        //$isRecursive = 'folder' === $fileType;
150
        $isRecursive = !$hasFile;
151
        // If it's a folder then change the visibility to the children (That have the same link).
152
        if ($isRecursive && null !== $link) {
153
            $repo->copyVisibilityToChildren($resource->getResourceNode(), $link);
154
        }
155
156
        //$document->setComment($comment);
157
158
        error_log('Finish update resource node file action');
159
160
        return $resource;
161
    }
162
}
163