SearchController   A
last analyzed

Complexity

Total Complexity 41

Size/Duplication

Total Lines 185
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
wmc 41
eloc 128
c 0
b 0
f 0
dl 0
loc 185
rs 9.1199

1 Method

Rating   Name   Duplication   Size   Complexity  
F search() 0 180 41

How to fix   Complexity   

Complex Class

Complex classes like SearchController often do a lot of different things. To break such a class down, we need to identify a cohesive component within that class. A common approach to find such a component is to look for fields/methods that share the same prefixes, or suffixes.

Once you have determined the fields that belong together, you can apply the Extract Class refactoring. If the component makes sense as a sub-class, Extract Subclass is also a candidate, and is often faster.

While breaking up the class, it is a good idea to analyze how other classes use SearchController, and based on these observations, apply Extract Interface, too.

1
<?php
2
3
namespace App\Http\Controllers;
4
5
use App\Models\Category;
6
use App\Models\UsenetGroup;
7
use Blacklight\Releases;
8
use Illuminate\Http\Request;
9
10
class SearchController extends BasePageController
11
{
12
    /**
13
     * @throws \Exception
14
     */
15
    public function search(Request $request)
16
    {
17
        $releases = new Releases;
18
19
        $results = [];
20
21
        $searchType = 'basic';
22
        if ($request->has('search_type') && $request->input('search_type') === 'adv') {
23
            $searchType = 'advanced';
24
        }
25
26
        $ordering = $releases->getBrowseOrdering();
27
        $orderBy = ($request->has('ob') && \in_array($request->input('ob'), $ordering, false) ? $request->input('ob') : '');
28
        $page = $request->has('page') && is_numeric($request->input('page')) ? $request->input('page') : 1;
29
        $offset = ($page - 1) * config('nntmux.items_per_page');
30
31
        $subject = '';
32
        $search = '';
33
        $id = '';
34
        $category = [0];
35
        $lastvisit = $this->userdata->lastlogin;
36
37
        if ($searchType === 'basic' && $request->missing('searchadvr') && ($request->has('id') || $request->has('subject') || $request->has('search'))) {
38
            $searchString = [];
39
            switch (true) {
40
                case $request->filled('subject'):
41
                    $searchString['searchname'] = (string) $request->input('subject') ?? [];
42
                    $subject = $searchString['searchname'];
43
                    break;
44
                case $request->filled('id'):
45
                    $searchString['searchname'] = (string) $request->input('id') ?? [];
46
                    $id = $searchString['searchname'];
47
                    break;
48
                case $request->filled('search'):
49
                    $searchString['searchname'] = (string) $request->input('search') ?? [];
50
                    $search = $searchString['searchname'];
51
                    break;
52
                default:
53
                    $searchString['searchname'] = '';
54
            }
55
56
            $categoryID[] = -1;
0 ignored issues
show
Comprehensibility Best Practice introduced by
$categoryID was never initialized. Although not strictly required by PHP, it is generally a good practice to add $categoryID = array(); before regardless.
Loading history...
57
            if ($request->has('t')) {
58
                $categoryID = explode(',', $request->input('t'));
59
            }
60
61
            $orderByUrls = [];
62
            foreach ($releases->getBrowseOrdering() as $orderType) {
63
                $orderByUrls['orderby'.$orderType] = url('/search?search='.htmlentities($searchString['searchname'], ENT_QUOTES | ENT_HTML5).'&t='.implode(',', $categoryID).'&ob='.$orderType);
64
            }
65
66
            $rslt = $releases->search(
67
                $searchString,
68
                -1,
69
                -1,
70
                -1,
71
                -1,
72
                -1,
73
                $offset,
74
                config('nntmux.items_per_page'),
75
                $orderBy,
76
                -1,
77
                $this->userdata->categoryexclusions ?? [],
0 ignored issues
show
Bug introduced by
The property categoryexclusions does not seem to exist on App\Models\User.
Loading history...
78
                'basic',
79
                $categoryID);
80
81
            $results = $this->paginate($rslt ?? [], $rslt[0]->_totalrows ?? 0, config('nntmux.items_per_page'), $page, $request->url(), $request->query());
82
            $category = $categoryID;
83
        } else {
84
            $orderByUrls = [];
85
        }
86
87
        $searchVars = [
88
            'searchadvr' => '',
89
            'searchadvsubject' => '',
90
            'searchadvposter' => '',
91
            'searchadvfilename' => '',
92
            'searchadvdaysnew' => '',
93
            'searchadvdaysold' => '',
94
            'searchadvgroups' => '',
95
            'searchadvcat' => '',
96
            'searchadvsizefrom' => '',
97
            'searchadvsizeto' => '',
98
            'searchadvhasnfo' => '',
99
            'searchadvhascomments' => '',
100
        ];
101
102
        foreach ($searchVars as $searchVarKey => $searchVar) {
103
            $searchVars[$searchVarKey] = ($request->has($searchVarKey) ? (string) $request->input($searchVarKey) : '');
104
        }
105
106
        // Map new form field names to old internal names
107
        if ($request->has('minage')) {
108
            $searchVars['searchadvdaysnew'] = (string) $request->input('minage');
109
        }
110
        if ($request->has('maxage')) {
111
            $searchVars['searchadvdaysold'] = (string) $request->input('maxage');
112
        }
113
        if ($request->has('group')) {
114
            $searchVars['searchadvgroups'] = (string) $request->input('group');
115
        }
116
        if ($request->has('minsize')) {
117
            $searchVars['searchadvsizefrom'] = (string) $request->input('minsize');
118
        }
119
        if ($request->has('maxsize')) {
120
            $searchVars['searchadvsizeto'] = (string) $request->input('maxsize');
121
        }
122
        // Map basic search field to advanced search when in advanced mode
123
        if ($request->has('search') && $searchType === 'advanced') {
124
            $searchVars['searchadvr'] = (string) $request->input('search');
125
        }
126
        // Map basic category field to advanced category when in advanced mode
127
        if ($request->has('t') && $searchType === 'advanced') {
128
            $searchVars['searchadvcat'] = (string) $request->input('t');
129
        }
130
131
        $searchVars['selectedgroup'] = $searchVars['searchadvgroups'];
132
        $searchVars['selectedcat'] = $searchVars['searchadvcat'];
133
        $searchVars['selectedsizefrom'] = $searchVars['searchadvsizefrom'];
134
        $searchVars['selectedsizeto'] = $searchVars['searchadvsizeto'];
135
136
        if ($searchType !== 'basic' && $request->missing('id') && $request->missing('subject') && $request->anyFilled(['searchadvr', 'searchadvsubject', 'searchadvfilename', 'searchadvposter', 'minage', 'maxage', 'group', 'minsize', 'maxsize', 'search'])) {
137
            $orderByString = '';
138
            foreach ($searchVars as $searchVarKey => $searchVar) {
139
                $orderByString .= "&$searchVarKey=".htmlentities($searchVar, ENT_QUOTES | ENT_HTML5);
140
            }
141
            $orderByString = ltrim($orderByString, '&');
142
143
            $orderByUrls = [];
144
            foreach ($ordering as $orderType) {
145
                $orderByUrls['orderby'.$orderType] = url('/search?'.$orderByString.'&search_type=adv&ob='.$orderType);
146
            }
147
148
            $searchArr = [
149
                'searchname' => $searchVars['searchadvr'] === '' ? -1 : $searchVars['searchadvr'],
150
                'name' => $searchVars['searchadvsubject'] === '' ? -1 : $searchVars['searchadvsubject'],
151
                'fromname' => $searchVars['searchadvposter'] === '' ? -1 : $searchVars['searchadvposter'],
152
                'filename' => $searchVars['searchadvfilename'] === '' ? -1 : $searchVars['searchadvfilename'],
153
            ];
154
155
            $rslt = $releases->search(
156
                $searchArr,
157
                $searchVars['searchadvgroups'],
158
                $searchVars['searchadvsizefrom'],
159
                $searchVars['searchadvsizeto'],
160
                ($searchVars['searchadvdaysnew'] === '' ? -1 : $searchVars['searchadvdaysnew']),
161
                ($searchVars['searchadvdaysold'] === '' ? -1 : $searchVars['searchadvdaysold']),
162
                $offset,
163
                config('nntmux.items_per_page'),
164
                $orderBy,
165
                -1,
166
                $this->userdata->categoryexclusions ?? [],
167
                'advanced',
168
                [$searchVars['searchadvcat'] === '' ? -1 : $searchVars['searchadvcat']]
169
            );
170
171
            $results = $this->paginate($rslt ?? [], $rslt[0]->_totalrows ?? 0, config('nntmux.items_per_page'), $page, $request->url(), $request->query());
172
        }
173
174
        $this->viewData = array_merge($this->viewData, $searchVars, $orderByUrls, [
175
            'subject' => $subject,
176
            'search' => $search,
177
            'id' => $id,
178
            'category' => $category,
179
            'covgroup' => '',
180
            'lastvisit' => $lastvisit,
181
            'sizelist' => [
182
                -1 => '--Select--', 1 => '100MB', 2 => '250MB', 3 => '500MB', 4 => '1GB', 5 => '2GB',
183
                6 => '3GB', 7 => '4GB', 8 => '8GB', 9 => '16GB', 10 => '32GB', 11 => '64GB',
184
            ],
185
            'results' => $results,
186
            'sadvanced' => $searchType !== 'basic',
187
            'grouplist' => UsenetGroup::getGroupsForSelect(),
188
            'catlist' => Category::getForSelect(),
189
            'meta_title' => 'Search Nzbs',
190
            'meta_keywords' => 'search,nzb,description,details',
191
            'meta_description' => 'Search for Nzbs',
192
        ]);
193
194
        return view('search.index', $this->viewData);
195
    }
196
}
197