Passed
Push — develop ( 2975bd...a42f8c )
by Jens
02:58
created

DocumentRouting   A

Complexity

Total Complexity 33

Size/Duplication

Total Lines 207
Duplicated Lines 18.84 %

Coupling/Cohesion

Components 1
Dependencies 12

Importance

Changes 2
Bugs 0 Features 0
Metric Value
dl 39
loc 207
rs 9.3999
c 2
b 0
f 0
wmc 33
lcom 1
cbo 12

10 Methods

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