Passed
Push — develop ( 96efe9...5c0545 )
by Jens
02:56
created

SearchRouting::stepRouting()   C

Complexity

Conditions 8
Paths 8

Size

Total Lines 31
Code Lines 28

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 8
eloc 28
nc 8
nop 3
dl 0
loc 31
rs 5.3846
c 0
b 0
f 0
1
<?php
2
/**
3
 * User: jensk
4
 * Date: 21-2-2017
5
 * Time: 10:22
6
 */
7
8
namespace CloudControl\Cms\components\cms;
9
10
11
use CloudControl\Cms\components\CmsComponent;
12
use CloudControl\Cms\search\Indexer;
13
use CloudControl\Cms\search\Search;
14
15
class SearchRouting implements CmsRouting
16
{
17
18
    /**
19
     * SearchRouting constructor.
20
     *
21
     * @param \CloudControl\Cms\cc\Request $request
22
     * @param                                  $relativeCmsUri
23
     * @param \CloudControl\Cms\components\CmsComponent $cmsComponent
24
     */
25
    public function __construct($request, $relativeCmsUri, $cmsComponent)
26
    {
27
        switch ($relativeCmsUri) {
28
            case '/search':
29
                $this->overviewRoute($cmsComponent);
30
                break;
31
            case '/search/update-index' :
32
                $this->updateIndexRoute($cmsComponent);
33
                break;
34
            case '/search/ajax-update-index':
35
                $this->ajaxUpdateIndexRoute($request, $cmsComponent);
36
                break;
37
            case '/search/manual-update-index' :
38
                $indexer = new Indexer($cmsComponent->storage);
39
                $indexer->updateIndex();
40
                break;
41
        }
42
    }
43
44
    /**
45
     * @param \CloudControl\Cms\components\CmsComponent $cmsComponent
46
     */
47
    private function overviewRoute($cmsComponent)
48
    {
49
        $cmsComponent->subTemplate = 'search';
50
        $cmsComponent->setParameter(CmsComponent::PARAMETER_MAIN_NAV_CLASS, CmsComponent::PARAMETER_SEARCH);
51
        $documentCount = $cmsComponent->storage->getDocuments()->getTotalDocumentCount();
52
        $indexer = new Search($cmsComponent->storage);
53
        $indexedDocuments = $indexer->getIndexedDocuments();
54
        $cmsComponent->setParameter(CmsComponent::PARAMETER_SEARCH_NEEDS_UPDATE, $documentCount !== $indexedDocuments);
55
    }
56
57
    /**
58
     * @param \CloudControl\Cms\components\CmsComponent $cmsComponent
59
     */
60
    private function updateIndexRoute($cmsComponent)
61
    {
62
        $cmsComponent->subTemplate = 'search/update-index';
63
        $cmsComponent->setParameter(CmsComponent::PARAMETER_MAIN_NAV_CLASS, CmsComponent::PARAMETER_SEARCH);
64
    }
65
66
    private function ajaxUpdateIndexRoute($request, $cmsComponent)
67
    {
68
        $cmsComponent->subTemplate = 'search/update-index';
69
        if (isset($request::$get['step'])) {
70
            \set_time_limit(0); // Set max excecution time infinite
71
            \session_write_close(); // Close the session, so it doesnt create a lock on the sessionstorage, block other requests.
72
            $indexer = new Indexer($cmsComponent->storage);
73
            $step = $request::$get['step'];
74
            $this->stepRouting($step, $cmsComponent, $indexer);
75
        } else {
76
            $this->showJson('No step defined.', 'HTTP/1.0 500 Internal Server Error');
77
        }
78
    }
79
80
    private function showJson($obj, $httpHeader = 'HTTP/1.0 200 OK')
81
    {
82
        header($_SERVER['SERVER_PROTOCOL'] . $httpHeader, true);
83
        header('Content-type: application/json');
84
        die(json_encode($obj));
85
    }
86
87
    /**
88
     * @param CmsComponent $cmsComponent
89
     * @param string $step
90
     * @param Indexer $indexer
91
     */
92
    private function stepRouting($step, $cmsComponent, $indexer)
93
    {
94
        switch ($step) {
95
            case 'resetIndex':
96
                $indexer->resetIndex();
97
                break;
98
            case 'cleanPublishedDeletedDocuments':
99
                $cmsComponent->storage->getDocuments()->cleanPublishedDeletedDocuments();
100
                break;
101
            case 'createDocumentTermCount':
102
                $documents = $cmsComponent->storage->getDocuments()->getPublishedDocumentsNoFolders();
103
                $indexer->createDocumentTermCount($documents);
104
                break;
105
            case 'createDocumentTermFrequency':
106
                $indexer->createDocumentTermFrequency();
107
                break;
108
            case 'createTermFieldLengthNorm':
109
                $indexer->createTermFieldLengthNorm();
110
                break;
111
            case 'createInverseDocumentFrequency':
112
                $indexer->createInverseDocumentFrequency();
113
                break;
114
            case 'replaceOldIndex':
115
                $indexer->replaceOldIndex();
116
                break;
117
            default :
118
                $this->showJson('Invalid step: ' . $step . '.', 'HTTP/1.0 500 Internal Server Error');
119
                break;
120
        }
121
        $this->showJson('done');
122
    }
123
}