Passed
Push — develop ( adb2d3...61a548 )
by Jens
04:06
created

DocumentRouting   B

Complexity

Total Complexity 36

Size/Duplication

Total Lines 224
Duplicated Lines 18.75 %

Coupling/Cohesion

Components 1
Dependencies 12

Importance

Changes 2
Bugs 0 Features 0
Metric Value
c 2
b 0
f 0
dl 42
loc 224
rs 8.8
wmc 36
lcom 1
cbo 12

10 Methods

Rating   Name   Duplication   Size   Complexity  
B documentRouting() 0 14 9
B documentNewRoute() 7 28 5
A __construct() 0 8 2
B editDocumentRoute() 0 29 4
A getBrickRoute() 0 16 3
A deleteDocumentRoute() 7 7 1
A publishDocumentRoute() 14 14 2
A unpublishDocumentRoute() 14 14 2
A overviewRouting() 0 13 1
B handleInfoMessages() 0 18 7

How to fix   Duplicated Code   

Duplicated Code

Duplicate code is one of the most pungent code smells. A rule that is often used is to re-structure code once it is duplicated in three or more places.

Common duplication problems, and corresponding solutions are:

1
<?php
2
/**
3
 * User: Jens
4
 * Date: 29-1-2017
5
 * Time: 15:23
6
 */
7
8
namespace CloudControl\Cms\components\cms;
9
10
11
use CloudControl\Cms\cc\Request;
12
use CloudControl\Cms\components\cms\document\FolderRouting;
13
use CloudControl\Cms\components\CmsComponent;
14
use CloudControl\Cms\search\Search;
15
use CloudControl\Cms\storage\Cache;
16
use CloudControl\Cms\storage\entities\Document;
17
18
class DocumentRouting implements CmsRouting
19
{
20
    /**
21
     * DocumentRouting constructor.
22
     * @param $request
23
     * @param $relativeCmsUri
24
     * @param CmsComponent $cmsComponent
25
     * @throws \Exception
26
     */
27
    public function __construct(Request $request, $relativeCmsUri, CmsComponent $cmsComponent)
28
    {
29
        if ($relativeCmsUri == '/documents') {
30
            $this->overviewRouting($cmsComponent, $request);
31
        }
32
        $this->documentRouting($request, $relativeCmsUri, $cmsComponent);
33
        new FolderRouting($request, $relativeCmsUri, $cmsComponent);
34
    }
35
36
37
    /**
38
     * @param Request $request
39
     * @param string $relativeCmsUri
40
     * @param CmsComponent $cmsComponent
41
     * @throws \Exception
42
     */
43
    private function documentRouting($request, $relativeCmsUri, $cmsComponent)
44
    {
45
        if ($relativeCmsUri == '/documents/new-document' && isset($request::$get[CmsConstants::GET_PARAMETER_PATH])) {
46
            $this->documentNewRoute($request, $cmsComponent);
47
        } elseif (isset($request::$get[CmsConstants::GET_PARAMETER_SLUG])) {
48
            switch ($relativeCmsUri) {
49
                case '/documents/edit-document': $this->editDocumentRoute($request, $cmsComponent); break;
50
                case '/documents/get-brick': $this->getBrickRoute($request, $cmsComponent); break;
51
                case '/documents/delete-document': $this->deleteDocumentRoute($request, $cmsComponent); break;
52
                case '/documents/publish-document': $this->publishDocumentRoute($request, $cmsComponent); break;
53
                case '/documents/unpublish-document': $this->unpublishDocumentRoute($request, $cmsComponent); break;
54
            }
55
        }
56
    }
57
58
    /**
59
     * @param $request
60
     * @param CmsComponent $cmsComponent
61
     *
62
     * @throws \Exception
63
     */
64
    private function documentNewRoute($request, $cmsComponent)
65
    {
66
        $cmsComponent->subTemplate = 'documents/document-form';
67
        $cmsComponent->setParameter(CmsConstants::PARAMETER_MAIN_NAV_CLASS, CmsConstants::PARAMETER_DOCUMENTS);
68
        $cmsComponent->setParameter(CmsConstants::PARAMETER_SMALLEST_IMAGE, $cmsComponent->storage->getImageSet()->getSmallestImageSet()->slug);
69
        if (isset($request::$get[CmsConstants::PARAMETER_DOCUMENT_TYPE])) {
70 View Code Duplication
            if (isset($request::$post[CmsConstants::POST_PARAMETER_TITLE], $request::$get[CmsConstants::PARAMETER_DOCUMENT_TYPE], $request::$get[CmsConstants::GET_PARAMETER_PATH])) {
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...
71
                $path = substr($cmsComponent->storage->getDocuments()->addDocument($request::$post), 1);
72
                $docLink = $request::$subfolders . $cmsComponent->getParameter(CmsConstants::PARAMETER_CMS_PREFIX) . '/documents/edit-document?slug=' . $path;
73
                $cmsComponent->storage->getActivityLog()->add('created document <a href="' . $docLink . '">' . $request::$post[CmsConstants::POST_PARAMETER_TITLE] . '</a> in path ' . $request::$get[CmsConstants::GET_PARAMETER_PATH], 'plus');
74
                header('Location: ' . $request::$subfolders . $cmsComponent->getParameter(CmsConstants::PARAMETER_CMS_PREFIX) . '/documents');
75
                exit;
76
            }
77
            $cmsComponent->setParameter(CmsConstants::PARAMETER_DOCUMENT_TYPE, $cmsComponent->storage->getDocumentTypes()->getDocumentTypeBySlug($request::$get[CmsConstants::PARAMETER_DOCUMENT_TYPE], true));
78
            $cmsComponent->setParameter(CmsConstants::PARAMETER_BRICKS, $cmsComponent->storage->getBricks()->getBricks());
79
        } else {
80
            $documentTypes = $cmsComponent->storage->getDocumentTypes()->getDocumentTypes();
81
            $docTypesCount = count($documentTypes);
82
            if ($docTypesCount < 1) {
83
                header('Location: ' . $request::$subfolders . $cmsComponent->getParameter(CmsConstants::PARAMETER_CMS_PREFIX) . '/documents?no-document-types');
84
                exit;
85
            } elseif ($docTypesCount == 1) {
86
                header('Location: ' . $request::$subfolders . $cmsComponent->getParameter(CmsConstants::PARAMETER_CMS_PREFIX) . '/documents/new-document?path=' . urlencode($_GET['path']) . '&documentType=' . $documentTypes[0]->slug);
87
                exit;
88
            }
89
            $cmsComponent->setParameter(CmsConstants::PARAMETER_DOCUMENT_TYPES, $documentTypes);
90
        }
91
    }
92
93
    /**
94
     * @param $request
95
     * @param CmsComponent $cmsComponent
96
     * @throws \Exception
97
     */
98
    private function editDocumentRoute($request, $cmsComponent)
99
    {
100
        $cmsComponent->subTemplate = 'documents/document-form';
101
        $cmsComponent->setParameter(CmsConstants::PARAMETER_MAIN_NAV_CLASS, CmsConstants::PARAMETER_DOCUMENTS);
102
        $cmsComponent->setParameter(CmsConstants::PARAMETER_SMALLEST_IMAGE, $cmsComponent->storage->getImageSet()->getSmallestImageSet()->slug);
103
        if (isset($request::$post[CmsConstants::POST_PARAMETER_TITLE], $request::$get[CmsConstants::GET_PARAMETER_SLUG])) {
104
            $path = substr($cmsComponent->storage->getDocuments()->saveDocument($request::$post), 1);
105
            $docLink = $request::$subfolders . $cmsComponent->getParameter(CmsConstants::PARAMETER_CMS_PREFIX) . '/documents/edit-document?slug=' . $path;
106
            $cmsComponent->storage->getActivityLog()->add('edited document <a href="' . $docLink . '">' . $request::$post[CmsConstants::POST_PARAMETER_TITLE] . '</a> in path /' . $request::$get[CmsConstants::GET_PARAMETER_SLUG], 'pencil');
107
            if (isset($request::$post[CmsConstants::PARAMETER_SAVE_AND_PUBLISH])) {
108
                header('Location: ' . $request::$subfolders . $cmsComponent->getParameter(CmsConstants::PARAMETER_CMS_PREFIX) . '/documents/publish-document?slug=' . $path);
109
            } else {
110
                header('Location: ' . $request::$subfolders . $cmsComponent->getParameter(CmsConstants::PARAMETER_CMS_PREFIX) . '/documents');
111
            }
112
            exit;
113
        }
114
        $document = $cmsComponent->storage->getDocuments()->getDocumentBySlug($request::$get[CmsConstants::GET_PARAMETER_SLUG], 'unpublished');
115
        $cmsComponent->setParameter(CmsConstants::PARAMETER_DOCUMENT, $document);
116
117
        $request::$get[CmsConstants::GET_PARAMETER_PATH] = $request::$get[CmsConstants::GET_PARAMETER_SLUG];
118
        if ($document instanceof Document) {
119
            $cmsComponent->setParameter(CmsConstants::PARAMETER_DOCUMENT_TYPE, $cmsComponent->storage->getDocumentTypes()->getDocumentTypeBySlug($document->documentTypeSlug, true));
120
        } else {
121
            header('Location: ' . $request::$subfolders . $cmsComponent->getParameter(CmsConstants::PARAMETER_CMS_PREFIX) . '/documents?not-found');
122
            exit;
123
        }
124
125
        $cmsComponent->setParameter(CmsConstants::PARAMETER_BRICKS, $cmsComponent->storage->getBricks()->getBricks());
126
    }
127
128
    /**
129
     * @param $request
130
     * @param CmsComponent $cmsComponent
131
     * @throws \Exception
132
     */
133
    private function getBrickRoute($request, $cmsComponent)
134
    {
135
        $cmsComponent->setParameter(CmsConstants::PARAMETER_SMALLEST_IMAGE, $cmsComponent->storage->getImageSet()->getSmallestImageSet()->slug);
136
        $cmsComponent->subTemplate = 'documents/brick';
137
        $cmsComponent->setParameter(CmsConstants::PARAMETER_BRICK, $cmsComponent->storage->getBricks()->getBrickBySlug($request::$get[CmsConstants::GET_PARAMETER_SLUG]));
138
        $cmsComponent->setParameter(CmsConstants::PARAMETER_STATIC, $request::$get[CmsConstants::PARAMETER_STATIC] === 'true');
139
        if (isset($request::$get[CmsConstants::PARAMETER_MY_BRICK_SLUG])) {
140
            $cmsComponent->setParameter(CmsConstants::PARAMETER_MY_BRICK_SLUG, $request::$get[CmsConstants::PARAMETER_MY_BRICK_SLUG]);
141
        }
142
        $result = new \stdClass();
143
        $result->body = $cmsComponent->renderTemplate('documents/brick');
144
        $result->rteList = isset($GLOBALS['rteList']) ? $GLOBALS['rteList'] : array();
145
        ob_clean();
146
        header(CmsConstants::CONTENT_TYPE_APPLICATION_JSON);
147
        die(json_encode($result));
148
    }
149
150
    /**
151
     * @param $request
152
     * @param CmsComponent $cmsComponent
153
     */
154 View Code Duplication
    private function deleteDocumentRoute($request, $cmsComponent)
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...
155
    {
156
        $cmsComponent->storage->getDocuments()->deleteDocumentBySlug($request::$get[CmsConstants::GET_PARAMETER_SLUG]);
157
        $cmsComponent->storage->getActivityLog()->add('deleted document /' . $request::$get[CmsConstants::GET_PARAMETER_SLUG], 'trash');
158
        header('Location: ' . $request::$subfolders . $cmsComponent->getParameter(CmsConstants::PARAMETER_CMS_PREFIX) . '/documents?document-delete');
159
        exit;
160
    }
161
162
    /**
163
     * @param $request
164
     * @param CmsComponent $cmsComponent
165
     */
166 View Code Duplication
    private function publishDocumentRoute($request, $cmsComponent)
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...
167
    {
168
        $cmsComponent->storage->getDocuments()->publishDocumentBySlug($request::$get[CmsConstants::GET_PARAMETER_SLUG]);
169
        Cache::getInstance()->clearCache();
170
        $path = $request::$get[CmsConstants::GET_PARAMETER_SLUG];
171
        $docLink = $request::$subfolders . $cmsComponent->getParameter(CmsConstants::PARAMETER_CMS_PREFIX) . '/documents/edit-document?slug=' . $path;
172
        $cmsComponent->storage->getActivityLog()->add('published document <a href="' . $docLink . '">' . $request::$get[CmsConstants::GET_PARAMETER_SLUG] . '</a>', 'check-circle-o');
173
        if ($cmsComponent->autoUpdateSearchIndex) {
174
            header('Location: ' . $request::$subfolders . $cmsComponent->getParameter(CmsConstants::PARAMETER_CMS_PREFIX) . '/search/update-index?returnUrl=' . urlencode($request::$subfolders . $cmsComponent->getParameter(CmsConstants::PARAMETER_CMS_PREFIX) . '/documents?published=' .  urlencode($request::$get[CmsConstants::GET_PARAMETER_SLUG])));
175
        } else {
176
            header('Location: ' . $request::$subfolders . $cmsComponent->getParameter(CmsConstants::PARAMETER_CMS_PREFIX) . '/documents?published=' . urlencode($request::$get[CmsConstants::GET_PARAMETER_SLUG]));
177
        }
178
        exit;
179
    }
180
181
    /**
182
     * @param $request
183
     * @param CmsComponent $cmsComponent
184
     */
185 View Code Duplication
    private function unpublishDocumentRoute($request, $cmsComponent)
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...
186
    {
187
        $cmsComponent->storage->getDocuments()->unpublishDocumentBySlug($request::$get[CmsConstants::GET_PARAMETER_SLUG]);
188
        Cache::getInstance()->clearCache();
189
        $path = $request::$get[CmsConstants::GET_PARAMETER_SLUG];
190
        $docLink = $request::$subfolders . $cmsComponent->getParameter(CmsConstants::PARAMETER_CMS_PREFIX) . '/documents/edit-document?slug=' . $path;
191
        $cmsComponent->storage->getActivityLog()->add('unpublished document <a href="' . $docLink . '">' . $request::$get[CmsConstants::GET_PARAMETER_SLUG] . '</a>', 'times-circle-o');
192
        if ($cmsComponent->autoUpdateSearchIndex) {
193
            header('Location: ' . $request::$subfolders . $cmsComponent->getParameter(CmsConstants::PARAMETER_CMS_PREFIX) . '/search/update-index?returnUrl=' . urlencode($request::$subfolders . $cmsComponent->getParameter(CmsConstants::PARAMETER_CMS_PREFIX) . '/documents?unpublished=' .  urlencode($request::$get[CmsConstants::GET_PARAMETER_SLUG])));
194
        } else {
195
            header('Location: ' . $request::$subfolders . $cmsComponent->getParameter(CmsConstants::PARAMETER_CMS_PREFIX) . '/documents?unpublished=' . htmlentities($request::$get[CmsConstants::GET_PARAMETER_SLUG]));
196
        }
197
        exit;
198
    }
199
200
    /**
201
     * @param CmsComponent $cmsComponent
202
     * @param Request $request
203
     * @throws \Exception
204
     */
205
    private function overviewRouting($cmsComponent, $request)
206
    {
207
        $cmsComponent->subTemplate = 'documents';
208
        $cmsComponent->setParameter(CmsConstants::PARAMETER_DOCUMENTS, $cmsComponent->storage->getDocuments()->getDocumentsWithState());
209
        $cmsComponent->setParameter(CmsConstants::PARAMETER_MAIN_NAV_CLASS, CmsConstants::PARAMETER_DOCUMENTS);
210
211
        $documentCount = $cmsComponent->storage->getDocuments()->getTotalDocumentCount();
212
        $indexer = new Search($cmsComponent->storage);
213
        $indexedDocuments = $indexer->getIndexedDocuments();
214
        $cmsComponent->setParameter(CmsConstants::PARAMETER_SEARCH_NEEDS_UPDATE, $documentCount !== $indexedDocuments);
215
216
        $this->handleInfoMessages($cmsComponent, $request);
217
    }
218
219
    /**
220
     * @param CmsComponent $cmsComponent
221
     * @param Request $request
222
     */
223
    private function handleInfoMessages($cmsComponent, $request)
224
    {
225
        if (isset($_GET['not-found'])) {
226
            $cmsComponent->setParameter('infoMessage', 'Document could not be found. It might have been removed.');
227
            $cmsComponent->setParameter('infoMessageClass', 'error');
228
        } elseif (isset($_GET['published'])) {
229
            $cmsComponent->setParameter('infoMessage', '<i class="fa fa-check-circle-o"></i> Document ' . $_GET['published'] . ' published');
230
        } elseif (isset($_GET['unpublished'])) {
231
            $cmsComponent->setParameter('infoMessage', '<i class="fa fa-times-circle-o"></i> Document ' . $_GET['unpublished'] . ' unpublished');
232
        } elseif (isset($_GET['folder-delete'])) {
233
            $cmsComponent->setParameter('infoMessage', '<i class="fa fa-trash"></i> Folder deleted');
234
        } elseif (isset($_GET['document-delete'])) {
235
            $cmsComponent->setParameter('infoMessage', '<i class="fa fa-trash"></i> Document deleted');
236
        } elseif (isset($_GET['no-document-types'])) {
237
            $documentTypesLink = $request::$subfolders . $cmsComponent->getParameter(CmsConstants::PARAMETER_CMS_PREFIX) . '/configuration/document-types/new';
238
            $cmsComponent->setParameter('infoMessage', '<i class="fa fa-exclamation-circle"></i> No document types defined yet. Please do so first, <a href="' . $documentTypesLink . '">here</a>.');
239
        }
240
    }
241
}