Completed
Pull Request — master (#34)
by
unknown
01:16
created

ModuleConfigController   B

Complexity

Total Complexity 50

Size/Duplication

Total Lines 296
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 2

Importance

Changes 0
Metric Value
wmc 50
lcom 1
cbo 2
dl 0
loc 296
rs 8.4
c 0
b 0
f 0

9 Methods

Rating   Name   Duplication   Size   Complexity  
A setRewritingEnableAction() 0 16 3
A viewConfigAction() 0 17 2
C getDatatableRules() 0 86 12
A setRedirectionEnableAction() 0 16 3
A addRuleAction() 0 13 2
A updateRuleAction() 0 20 3
A removeRuleAction() 0 20 3
B moveRulePositionAction() 0 30 7
C fillRuleObjectFields() 0 63 15

How to fix   Complexity   

Complex Class

Complex classes like ModuleConfigController 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. You can also have a look at the cohesion graph to spot any un-connected, or weakly-connected components.

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 ModuleConfigController, and based on these observations, apply Extract Interface, too.

1
<?php
2
3
namespace RewriteUrl\Controller\Admin;
4
5
use Propel\Runtime\ActiveQuery\Criteria;
6
use RewriteUrl\Model\RewriteurlRule;
7
use RewriteUrl\Model\RewriteurlRuleParam;
8
use RewriteUrl\Model\RewriteurlRuleQuery;
9
use RewriteUrl\RewriteUrl;
10
use Thelia\Controller\Admin\BaseAdminController;
11
use Thelia\Core\HttpFoundation\JsonResponse;
12
use Thelia\Core\Security\AccessManager;
13
use Thelia\Core\Security\Resource\AdminResources;
14
use Thelia\Core\Translation\Translator;
15
use Thelia\Model\ConfigQuery;
16
17
class ModuleConfigController extends BaseAdminController
18
{
19
    public function viewConfigAction($params = array())
20
    {
21
        if (null !== $response = $this->checkAuth(array(AdminResources::MODULE), 'GoogleShoppingXml', AccessManager::VIEW)) {
22
            return $response;
23
        }
24
25
        $isRewritingEnabled = ConfigQuery::isRewritingEnable();
26
        $isRedirectionEnabled = ConfigQuery::isRedirectionEnable();
27
28
        return $this->render(
29
            "RewriteUrl/module-configuration",
30
            [
31
                "isRewritingEnabled" => $isRewritingEnabled,
32
                "isRedirectionEnabled" => $isRedirectionEnabled,
33
            ]
34
        );
35
    }
36
37
    public function getDatatableRules()
38
    {
39
        $request = $this->getRequest();
40
41
        $requestSearchValue = $request->get('search') ? '%' . $request->get('search')['value'] . '%' : "";
42
        $recordsTotal = RewriteurlRuleQuery::create()->count();
43
        $search = RewriteurlRuleQuery::create();
44
        if ("" !== $requestSearchValue) {
45
            $search
46
                ->filterByValue($requestSearchValue, Criteria::LIKE)
47
                ->_or()
48
                ->filterByRedirectUrl($requestSearchValue)
49
            ;
50
        }
51
52
        $recordsFiltered = $search->count();
53
54
        $orderColumn = $request->get('order')[0]['column'];
55
        $orderDirection = $request->get('order')[0]['dir'];
56
        switch ($orderColumn) {
57
            case '0':
58
                $search->orderByRuleType($orderDirection);
59
                break;
60
            case '1':
61
                $search->orderByValue($orderDirection);
62
                break;
63
            case '2':
64
                $search->orderByOnly404($orderDirection);
65
                break;
66
            case '3':
67
                $search->orderByRedirectUrl($orderDirection);
68
                break;
69
            case '4':
70
                $search->orderByPosition($orderDirection);
71
                break;
72
            default:
73
                $search->orderByPosition();
74
                break;
75
        }
76
77
        $search
78
            ->offset($request->get('start'))
79
            ->limit($request->get('length'))
80
        ;
81
        $searchArray = $search->find()->toArray();
82
83
        $resultsArray = [];
84
        foreach ($searchArray as $row) {
85
            $id = $row['Id'];
86
            $isRegexSelected = $row['RuleType'] === 'regex' ? 'selected' : '';
87
            $isParamsSelected = $row['RuleType'] === 'params' ? 'selected' : '';
88
            $isOnly404Checked = $row['Only404'] ? 'checked' : '';
89
            $rewriteUrlRuleParams = RewriteurlRuleQuery::create()->findPk($row['Id'])->getRewriteUrlParamCollection();
90
            $resultsArray[] = [
91
                'Id' => $row['Id'],
92
                'RuleType' => '<select class="js_rule_type form-control" data-idrule="' . $id . '" required>
93
                                <option value="regex" ' . $isRegexSelected . '>' . Translator::getInstance()->trans("Regex", [], RewriteUrl::MODULE_DOMAIN) . '</option>
94
                                <option value="params" ' . $isParamsSelected . '>' . Translator::getInstance()->trans("Get Params", [], RewriteUrl::MODULE_DOMAIN) . '</option>
95
                               </select>',
96
                'Value' => $this->renderRaw(
97
                    "RewriteUrl/tab-value-render",
98
                    [
99
                        "REWRITE_URL_PARAMS" => $rewriteUrlRuleParams,
100
                        "VALUE" => $row['Value'],
101
                    ]
102
                ),
103
                'Only404' => '<input class="js_only404 form-control" type="checkbox" style="width: 100%!important;" ' . $isOnly404Checked . '/>',
104
                'RedirectUrl' => '<div class="col-md-12 input-group">
105
                                    <input class="js_url_to_redirect form-control" type="text" placeholder="/path/mypage.html" value="' . $row['RedirectUrl'] . '"/>
106
                                  </div>',
107
                'Position' => '<a href="#" class="u-position-up js_move_rule_position_up" data-idrule="' . $id . '"><i class="glyphicon glyphicon-arrow-up"></i></a>
108
                                <span class="js_editable_rule_position editable editable-click" data-idrule="' . $id . '">' . $row['Position'] . '</span>
109
                               <a href="#" class="u-position-down js_move_rule_position_down" data-idrule="' . $id . '"><i class="glyphicon glyphicon-arrow-down"></i></a>',
110
                'Actions' => '<a href="#" class="js_btn_update_rule btn btn-success" data-idrule="' . $id . '"><span class="glyphicon glyphicon-check"></span></a>
111
                              <a href="#" class="js_btn_remove_rule btn btn-danger" data-idrule="' . $id . '"><span class="glyphicon glyphicon-remove"></span></a>
112
',
113
            ];
114
        }
115
116
        return new JsonResponse([
117
            'draw' => $request->get('draw'),
118
            'recordsTotal' => $recordsTotal,
119
            'recordsFiltered' => $recordsFiltered,
120
            'data' => $resultsArray
121
        ]);
122
    }
123
124
    public function setRewritingEnableAction()
125
    {
126
        $request = $this->getRequest()->request;
127
        $isRewritingEnable = $request->get("rewriting_enable", null);
128
129
        if ($isRewritingEnable !== null) {
130
            ConfigQuery::write("rewriting_enable", $isRewritingEnable ? 1 : 0);
131
            return $this->jsonResponse(json_encode(["state" => "Success"]), 200);
132
        } else {
133
            return $this->jsonResponse(Translator::getInstance()->trans(
134
                "Unable to change the configuration variable.",
135
                [],
136
                RewriteUrl::MODULE_DOMAIN
137
            ), 500);
138
        }
139
    }
140
141
    // check redirection_enable status & write an entry if there is none //
142
    
143
    public function setRedirectionEnableAction()
144
    {
145
        $request = $this->getRequest()->request;
146
        $isRedirectionEnable = $request->get("redirection_enable", null);
147
148
        if ($isRedirectionEnable !== null) {
149
            ConfigQuery::write("redirection_enable", $isRedirectionEnable ? 1 : 0);
150
            return $this->jsonResponse(json_encode(["state" => "Success"]), 200);
151
        } else {
152
            return $this->jsonResponse(Translator::getInstance()->trans(
153
                "Unable to change the configuration variable.",
154
                [],
155
                RewriteUrl::MODULE_DOMAIN
156
            ), 500);
157
        }
158
    }
159
    // ############################## //
160
161
    public function addRuleAction()
162
    {
163
        try {
164
            $request = $this->getRequest()->request;
165
166
            $rule = new RewriteurlRule();
167
168
            $this->fillRuleObjectFields($rule, $request);
169
        } catch (\Exception $ex) {
170
            return $this->jsonResponse($ex->getMessage(), 500);
171
        }
172
        return $this->jsonResponse(json_encode(["state" => "Success"]), 200);
173
    }
174
175
    public function updateRuleAction()
176
    {
177
        try {
178
            $request = $this->getRequest()->request;
179
180
            $rule = RewriteurlRuleQuery::create()->findOneById($request->get("id"));
181
            if ($rule == null) {
182
                throw new \Exception(Translator::getInstance()->trans(
183
                    "Unable to find rule to update.",
184
                    [],
185
                    RewriteUrl::MODULE_DOMAIN
186
                ));
187
            }
188
189
            $this->fillRuleObjectFields($rule, $request);
190
        } catch (\Exception $ex) {
191
            return $this->jsonResponse($ex->getMessage(), 500);
192
        }
193
        return $this->jsonResponse(json_encode(["state" => "Success"]), 200);
194
    }
195
196
197
    public function removeRuleAction()
198
    {
199
        try {
200
            $request = $this->getRequest()->request;
201
202
            $rule = RewriteurlRuleQuery::create()->findOneById($request->get("id"));
203
            if ($rule == null) {
204
                throw new \Exception(Translator::getInstance()->trans(
205
                    "Unable to find rule to remove.",
206
                    [],
207
                    RewriteUrl::MODULE_DOMAIN
208
                ));
209
            }
210
211
            $rule->delete();
212
        } catch (\Exception $ex) {
213
            return $this->jsonResponse($ex->getMessage(), 500);
214
        }
215
        return $this->jsonResponse(json_encode(["state" => "Success"]), 200);
216
    }
217
218
    public function moveRulePositionAction()
219
    {
220
        try {
221
            $request = $this->getRequest()->request;
222
223
            $rule = RewriteurlRuleQuery::create()->findOneById($request->get("id"));
224
            if ($rule == null) {
225
                throw new \Exception(Translator::getInstance()->trans(
226
                    "Unable to find rule to change position.",
227
                    [],
228
                    RewriteUrl::MODULE_DOMAIN
229
                ));
230
            }
231
232
            $type = $request->get("type", null);
233
            if ($type == "up") {
234
                $rule->movePositionUp();
235
            } elseif ($type == "down") {
236
                $rule->movePositionDown();
237
            } elseif ($type == "absolute") {
238
                $position = $request->get("position", null);
239
                if (!empty($position)) {
240
                    $rule->changeAbsolutePosition($position);
241
                }
242
            }
243
        } catch (\Exception $ex) {
244
            return $this->jsonResponse($ex->getMessage(), 500);
245
        }
246
        return $this->jsonResponse(json_encode(["state" => "Success"]), 200);
247
    }
248
249
    protected function fillRuleObjectFields(RewriteurlRule $rule, $request)
250
    {
251
        $ruleType = $request->get("ruleType", null);
252
        if ($ruleType !== "regex" && $ruleType !== "params") {
253
            throw new \Exception(Translator::getInstance()->trans("Unknown rule type.", [], RewriteUrl::MODULE_DOMAIN));
254
        }
255
256
        $regexValue = $request->get("value", null);
257
        if ($ruleType == "regex" && empty($regexValue)) {
258
            throw new \Exception(Translator::getInstance()->trans("Regex value cannot be empty.", [], RewriteUrl::MODULE_DOMAIN));
259
        }
260
261
        $redirectUrl = $request->get("redirectUrl", null);
262
        if (empty($redirectUrl)) {
263
            throw new \Exception(Translator::getInstance()->trans("Redirect url cannot be empty.", [], RewriteUrl::MODULE_DOMAIN));
264
        }
265
266
        $paramRuleArray = array();
267
        if ($ruleType == "params") {
268
            $paramRuleArray = $request->get("paramRules", null);
269
            if (empty($paramRuleArray)) {
270
                throw new \Exception(Translator::getInstance()->trans("At least one GET parameter is required.", [], RewriteUrl::MODULE_DOMAIN));
271
            }
272
        }
273
274
        $rule->setRuleType($ruleType);
275
        $rule->setValue($regexValue);
276
        $rule->setOnly404($request->get("only404", 1));
277
        $rule->setRedirectUrl($redirectUrl);
278
        if (empty($rule->getPosition())) {
279
            $rule->setPosition($rule->getNextPosition());
280
        }
281
282
        $rule->deleteAllRelatedParam();
283
284
        $rule->save();
285
286
        if ($ruleType == "params") {
287
            foreach ($paramRuleArray as $paramRule) {
288
                if (!array_key_exists("paramName", $paramRule) || empty($paramRule["paramName"])) {
289
                    throw new \Exception(Translator::getInstance()->trans(
290
                        "Param name is empty.",
291
                        [],
292
                        RewriteUrl::MODULE_DOMAIN
293
                    ));
294
                }
295
                if (!array_key_exists("condition", $paramRule) || empty($paramRule["condition"])) {
296
                    throw new \Exception(Translator::getInstance()->trans(
297
                        "Param condition is empty.",
298
                        [],
299
                        RewriteUrl::MODULE_DOMAIN
300
                    ));
301
                }
302
303
                $paramRuleObject = new RewriteurlRuleParam();
304
                $paramRuleObject->setParamName($paramRule["paramName"]);
305
                $paramRuleObject->setParamCondition($paramRule["condition"]);
306
                $paramRuleObject->setParamValue($paramRule["paramValue"]);
307
                $paramRuleObject->setIdRule($rule->getId());
308
                $paramRuleObject->save();
309
            }
310
        }
311
    }
312
}
313