Request   A
last analyzed

Complexity

Total Complexity 24

Size/Duplication

Total Lines 148
Duplicated Lines 0 %

Test Coverage

Coverage 15.38%

Importance

Changes 1
Bugs 0 Features 0
Metric Value
eloc 48
c 1
b 0
f 0
dl 0
loc 148
ccs 6
cts 39
cp 0.1538
rs 10
wmc 24

7 Methods

Rating   Name   Duplication   Size   Complexity  
A authorize() 0 3 1
A rules() 0 9 3
A rulesForTranslatedFields() 0 22 5
B updateRules() 0 39 9
A updateMessages() 0 10 2
A messagesForTranslatedFields() 0 7 2
A ruleStartsWith() 0 3 2
1
<?php
2
3
namespace A17\Twill\Http\Requests\Admin;
4
5
use Illuminate\Foundation\Http\FormRequest;
6
use Illuminate\Support\Collection;
7
use Illuminate\Support\Str;
8
9
abstract class Request extends FormRequest
10
{
11
    /**
12
     * Determines if the user is authorized to make this request.
13
     *
14
     * @return bool
15
     */
16 27
    public function authorize()
17
    {
18 27
        return true;
19
    }
20
21
    /**
22
     * Gets the validation rules that apply to the request.
23
     *
24
     * @return array
25
     */
26 21
    public function rules()
27
    {
28 21
        switch ($this->method()) {
29 21
            case 'POST':{return $this->rulesForCreate();}
0 ignored issues
show
Bug introduced by
The method rulesForCreate() does not exist on A17\Twill\Http\Requests\Admin\Request. Since you implemented __call, consider adding a @method annotation. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

29
            case 'POST':{return $this->/** @scrutinizer ignore-call */ rulesForCreate();}
Loading history...
30 8
            case 'PUT':{return $this->rulesForUpdate();}
0 ignored issues
show
Bug introduced by
The method rulesForUpdate() does not exist on A17\Twill\Http\Requests\Admin\Request. Since you implemented __call, consider adding a @method annotation. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

30
            case 'PUT':{return $this->/** @scrutinizer ignore-call */ rulesForUpdate();}
Loading history...
31
            default:break;
32
        }
33
34
        return [];
35
    }
36
37
    /**
38
     * Gets the validation rules that apply to the translated fields.
39
     *
40
     * @return array
41
     */
42
    protected function rulesForTranslatedFields($rules, $fields)
43
    {
44
        $locales = getLocales();
45
        $localeActive = false;
46
47
        if ($this->request->has('languages')) {
48
            foreach ($locales as $locale) {
49
                $language = Collection::make($this->request->get('languages'))->where('value', $locale)->first();
50
                $currentLocaleActive = $language['published'] ?? false;
51
                $rules = $this->updateRules($rules, $fields, $locale, $currentLocaleActive);
52
53
                if ($currentLocaleActive) {
54
                    $localeActive = true;
55
                }
56
            }
57
        }
58
59
        if (! $localeActive) {
60
            $rules = $this->updateRules($rules, $fields, reset($locales));
61
        }
62
63
        return $rules;
64
    }
65
66
    /**
67
     * @param array $rules
68
     * @param array $fields
69
     * @param string $locale
70
     * @param bool $localeActive
71
     * @return array
72
     */
73
    private function updateRules($rules, $fields, $locale, $localeActive = true)
74
    {
75
        $fieldNames = array_keys($fields);
76
77
        foreach ($fields as $field => $fieldRules) {
78
            if (is_string($fieldRules)) {
79
                $fieldRules = explode('|', $fieldRules);
80
            }
81
82
            $fieldRules = Collection::make($fieldRules);
83
84
            // Remove required rules, when locale is not active
85
            if (! $localeActive) {
86
                $hasRequiredRule = $fieldRules->contains(function ($rule) {
87
                    return $this->ruleStartsWith($rule, 'required');
88
                });
89
90
                $fieldRules = $fieldRules->reject(function ($rule) {
91
                    return $this->ruleStartsWith($rule, 'required');
92
                });
93
94
                if ($hasRequiredRule && $fieldRules->doesntContain('nullable')) {
95
                    $fieldRules->add('nullable');
96
                }
97
            }
98
99
            $rules["{$field}.{$locale}"] = $fieldRules->map(function ($rule) use ($locale, $fieldNames) {
100
                // allows using validation rule that references other fields even for translated fields
101
                if ($this->ruleStartsWith($rule, 'required_') && Str::contains($rule, $fieldNames)) {
102
                    foreach ($fieldNames as $fieldName) {
103
                        $rule = str_replace($fieldName, "{$fieldName}.{$locale}", $rule);
104
                    }
105
                }
106
107
                return $rule;
108
            })->toArray();
109
        }
110
111
        return $rules;
112
    }
113
114
    /**
115
     * @param mixed $rule
116
     * @param string $needle
117
     *
118
     * @return bool
119
     */
120
    private function ruleStartsWith($rule, $needle)
121
    {
122
        return is_string($rule) && Str::startsWith($rule, $needle);
123
    }
124
125
    /**
126
     * Gets the error messages for the defined validation rules.
127
     *
128
     * @param array $messages
129
     * @param array $fields
130
     * @return array
131
     */
132
    protected function messagesForTranslatedFields($messages, $fields)
133
    {
134
        foreach (getLocales() as $locale) {
135
            $messages = $this->updateMessages($messages, $fields, $locale);
136
        }
137
138
        return $messages;
139
    }
140
141
    /**
142
     * @param array $messages
143
     * @param array $fields
144
     * @param string $locale
145
     * @return array
146
     */
147
    private function updateMessages($messages, $fields, $locale)
148
    {
149
        foreach ($fields as $field => $message) {
150
            $fieldSplitted = explode('.', $field);
151
            $rule = array_pop($fieldSplitted);
152
            $field = implode('.', $fieldSplitted);
153
            $messages["{$field}.{$locale}.$rule"] = str_replace('{lang}', $locale, $message);
154
        }
155
156
        return $messages;
157
    }
158
}
159