SearchRouting::__construct()   A
last analyzed

Complexity

Conditions 1
Paths 1

Size

Total Lines 3
Code Lines 1

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 1
eloc 1
c 1
b 0
f 0
nc 1
nop 3
dl 0
loc 3
rs 10
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\cc\Request;
12
use CloudControl\Cms\cc\ResponseHeaders;
13
use CloudControl\Cms\components\CmsComponent;
14
use CloudControl\Cms\search\Indexer;
15
use CloudControl\Cms\search\Search;
16
17
class SearchRouting extends CmsRouting
18
{
19
    protected static $routes = array(
20
        '/search' => 'overviewRoute',
21
        '/search/update-index' => 'updateIndexRoute',
22
        '/search/ajax-update-index' => 'ajaxUpdateIndexRoute',
23
        '/search/manual-update-index' => 'manualUpdateRoute',
24
    );
25
26
    /**
27
     * CmsRouting constructor.
28
     *
29
     * @param Request $request
30
     * @param string $relativeCmsUri
31
     * @param CmsComponent $cmsComponent
32
     * @throws \Exception
33
     */
34
    public function __construct(Request $request, $relativeCmsUri, CmsComponent $cmsComponent)
35
    {
36
        $this->doRouting($request, $relativeCmsUri, $cmsComponent);
37
    }
38
39
    /**
40
     * @param $request
41
     * @param \CloudControl\Cms\components\CmsComponent $cmsComponent
42
     * @throws \Exception
43
     */
44
    protected function overviewRoute(/** @scrutinizer ignore-unused */ $request, $cmsComponent)
45
    {
46
        $cmsComponent->subTemplate = 'search';
47
        $cmsComponent->setParameter(CmsConstants::PARAMETER_MAIN_NAV_CLASS, CmsConstants::PARAMETER_SEARCH);
48
        $documentCount = $cmsComponent->storage->getDocuments()->getTotalDocumentCount();
49
        $indexer = new Search($cmsComponent->storage);
50
        $indexedDocuments = $indexer->getIndexedDocuments();
51
        $cmsComponent->setParameter(CmsConstants::PARAMETER_SEARCH_NEEDS_UPDATE, $documentCount !== $indexedDocuments);
52
    }
53
54
    /**
55
     * @param \CloudControl\Cms\components\CmsComponent $cmsComponent
56
     * @param Request $request
57
     */
58
    protected function updateIndexRoute($request, $cmsComponent)
59
    {
60
        $cmsComponent->subTemplate = 'search/update-index';
61
        $cmsComponent->setParameter(CmsConstants::PARAMETER_MAIN_NAV_CLASS, CmsConstants::PARAMETER_SEARCH);
62
        if (isset($_GET['returnUrl'])) {
63
            $returnUrl = $_GET['returnUrl'];
64
        } else {
65
            $returnUrl = $request::$subfolders . $cmsComponent->getParameter(CmsConstants::PARAMETER_CMS_PREFIX) . '/search';
66
        }
67
        $cmsComponent->setParameter(CmsConstants::PARAMETER_RETURN_URL, $returnUrl);
68
    }
69
70
    protected function ajaxUpdateIndexRoute($request, $cmsComponent)
71
    {
72
        $cmsComponent->subTemplate = 'search/update-index';
73
        if (isset($request::$get['step'])) {
74
            \set_time_limit(0); // Set max excecution time infinite
75
            \session_write_close(); // Close the session, so it doesnt create a lock on the sessionstorage, block other requests.
76
            $indexer = new Indexer($cmsComponent->storage);
77
            $step = $request::$get['step'];
78
            $this->stepRouting($step, $cmsComponent, $indexer);
79
        } else {
80
            $this->showJson('No step defined.', 500);
81
        }
82
    }
83
84
    protected function manualUpdateRoute(/** @scrutinizer ignore-unused */ $request, $cmsComponent)
85
    {
86
        $indexer = new Indexer($cmsComponent->storage);
87
        $indexer->updateIndex();
88
    }
89
90
    /**
91
     * @param $obj
92
     * @param int $httpHeader
93
     */
94
    private function showJson($obj, $httpHeader = 200)
95
    {
96
        http_response_code($httpHeader);
97
        ResponseHeaders::add(ResponseHeaders::HEADER_CONTENT_TYPE, ResponseHeaders::HEADER_CONTENT_TYPE_CONTENT_APPLICATION_JSON);
98
        ResponseHeaders::sendAllHeaders();
99
        die(json_encode($obj));
100
    }
101
102
    /**
103
     * @param CmsComponent $cmsComponent
104
     * @param string $step
105
     * @param Indexer $indexer
106
     * @throws \Exception
107
     */
108
    private function stepRouting($step, $cmsComponent, $indexer)
109
    {
110
        switch ($step) {
111
            case 'resetIndex': $indexer->resetIndex(); break;
112
            case 'cleanPublishedDeletedDocuments': $cmsComponent->storage->getDocuments()->cleanPublishedDeletedDocuments(); break;
113
            case 'createDocumentTermCount':
114
                $documents = $cmsComponent->storage->getDocuments()->getPublishedDocumentsNoFolders();
115
                $indexer->createDocumentTermCount($documents);
116
                break;
117
            case 'createDocumentTermFrequency': $indexer->createDocumentTermFrequency(); break;
118
            case 'createTermFieldLengthNorm': $indexer->createTermFieldLengthNorm(); break;
119
            case 'createInverseDocumentFrequency': $indexer->createInverseDocumentFrequency(); break;
120
            case 'replaceOldIndex':
121
                $indexer->replaceOldIndex();
122
                $cmsComponent->storage->getActivityLog()->add('updated search index', 'search');
123
                break;
124
            default : $this->showJson('Invalid step: ' . $step . '.', 500); break;
125
        }
126
        $this->showJson('done');
127
    }
128
}