• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

visavi / rotor / 28340133337

28 Jun 2026 11:47PM UTC coverage: 16.561% (+0.09%) from 16.474%
28340133337

push

github

visavi
Ядро и модули переведены на datetime, удалена константа SITETIME

18 of 95 new or added lines in 31 files covered. (18.95%)

7 existing lines in 6 files now uncovered.

989 of 5972 relevant lines covered (16.56%)

2.44 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

0.0
/app/Http/Controllers/Admin/UserController.php
1
<?php
2

3
declare(strict_types=1);
4

5
namespace App\Http\Controllers\Admin;
6

7
use App\Classes\Registry;
8
use App\Classes\Restatement;
9
use App\Classes\Validator;
10
use App\Models\Banhist;
11
use App\Models\BlackList;
12
use App\Models\Comment;
13
use App\Models\User;
14
use App\Models\UserField;
15
use Illuminate\Http\RedirectResponse;
16
use Illuminate\Http\Request;
17
use Illuminate\Support\Facades\Hash;
18
use Illuminate\Support\Str;
19
use Illuminate\View\View;
20

21
class UserController extends AdminController
22
{
23
    /**
24
     * Главная страница
25
     */
26
    public function index(): View
×
27
    {
28
        $users = User::query()
×
29
            ->orderByDesc('created_at')
×
30
            ->paginate(setting('userlist'));
×
31

32
        return view('admin/users/index', compact('users'));
×
33
    }
34

35
    /**
36
     * Поиск пользователей
37
     */
38
    public function search(Request $request): View
×
39
    {
40
        $q = check($request->input('q'));
×
41

42
        $users = User::query()
×
43
            ->when(
×
44
                $q === '1',
×
45
                fn ($query) => $query->whereRaw("login RLIKE '^[-0-9]'"),
×
46
                fn ($query) => $query->where('login', 'like', $q . '%')
×
47
            )
×
48
            ->orderByDesc('point')
×
49
            ->paginate(setting('usersearch'))
×
50
            ->appends(['q' => $q]);
×
51

52
        return view('admin/users/search', compact('users'));
×
53
    }
54

55
    /**
56
     * Редактирование пользователя
57
     */
58
    public function edit(Request $request, Validator $validator): View|RedirectResponse
×
59
    {
60
        $user = getUserByLogin($request->input('user'));
×
61

62
        if (! $user) {
×
63
            abort(404, __('validator.user'));
×
64
        }
65

66
        $allThemes = getAvailableThemes();
×
67
        $adminGroups = User::ADMIN_GROUPS;
×
68

69
        $allGroups = [];
×
70
        foreach (User::ALL_GROUPS as $level) {
×
71
            $allGroups[$level] = User::getLevelByKey($level);
×
72
        }
73

74
        $fields = UserField::query()->withUserData($user->id)->get();
×
75

76
        if ($request->isMethod('post')) {
×
77
            $level = $request->input('level');
×
78
            $password = $request->input('password');
×
79
            $email = $request->input('email');
×
80
            $name = $request->input('name');
×
81
            $country = $request->input('country');
×
82
            $city = $request->input('city');
×
83
            $phone = preg_replace('/[^\d+]/', '', $request->input('phone') ?? '');
×
84
            $site = $request->input('site');
×
85
            $birthday = $request->input('birthday');
×
86
            $point = int($request->input('point'));
×
87
            $money = int($request->input('money'));
×
88
            $status = $request->input('status');
×
89
            $posrating = int($request->input('posrating'));
×
90
            $negrating = int($request->input('negrating'));
×
91
            $themes = $request->input('themes');
×
92
            $gender = $request->input('gender') === User::MALE ? User::MALE : User::FEMALE;
×
93
            $info = $request->input('info');
×
94

UNCOV
95
            $validator
×
96
                ->in($level, User::ALL_GROUPS, ['level' => __('users.user_level_invalid')])
×
97
                ->length($password, 6, 20, __('users.password_length_requirements'), false)
×
98
                ->email($email, ['email' => __('validator.email')])
×
99
                ->phone($phone, ['phone' => __('validator.phone')], false)
×
100
                ->url($site, ['site' => __('validator.url')], false)
×
101
                ->regex($birthday, '#^[0-9]{2}+\.[0-9]{2}+\.[0-9]{4}$#', ['birthday' => __('validator.date')], false)
×
102
                ->length($status, 3, 25, ['status' => __('users.status_short_or_long')], false)
×
103
                ->true(in_array($themes, $allThemes, true) || empty($themes), ['themes' => __('users.theme_not_installed')])
×
104
                ->length($info, 0, 1000, ['info' => __('users.info_yourself_long')]);
×
105

106
            foreach ($fields as $field) {
×
107
                $validator->length(
×
108
                    $request->input('field' . $field->id),
×
109
                    $field->min,
×
110
                    $field->max,
×
111
                    ['field' . $field->id => __('validator.text')],
×
112
                    false // Для админа поля не обязательны
×
113
                );
×
114
            }
115

116
            if ($validator->isValid()) {
×
117
                if ($password) {
×
118
                    $text = __('users.user_new_password', ['password' => $password]);
×
119
                    $password = Hash::make($password);
×
120
                } else {
121
                    $text = null;
×
122
                    $password = $user->password;
×
123
                }
124

125
                $name = Str::substr($name, 0, 20);
×
126
                $country = Str::substr($country, 0, 30);
×
127
                $city = Str::substr($city, 0, 50);
×
128
                $rating = $posrating - $negrating;
×
129

130
                $user->update([
×
NEW
131
                    'password'  => $password,
×
NEW
132
                    'level'     => $level,
×
NEW
133
                    'email'     => $email,
×
NEW
134
                    'name'      => $name,
×
NEW
135
                    'country'   => $country,
×
NEW
136
                    'city'      => $city,
×
NEW
137
                    'phone'     => $phone,
×
NEW
138
                    'site'      => $site,
×
NEW
139
                    'birthday'  => $birthday,
×
NEW
140
                    'point'     => $point,
×
NEW
141
                    'money'     => $money,
×
NEW
142
                    'status'    => $status,
×
NEW
143
                    'rating'    => $rating,
×
NEW
144
                    'posrating' => $posrating,
×
NEW
145
                    'negrating' => $negrating,
×
NEW
146
                    'themes'    => $themes,
×
NEW
147
                    'gender'    => $gender,
×
NEW
148
                    'info'      => $info,
×
UNCOV
149
                ]);
×
150

151
                foreach ($fields as $field) {
×
152
                    $user->data()
×
153
                        ->updateOrCreate([
×
154
                            'field_id' => $field->id,
×
155
                        ], [
×
156
                            'value' => $field->sanitizeValue($request->input('field' . $field->id)),
×
157
                        ]);
×
158
                }
159

160
                clearCache('status');
×
161
                setFlash('success', [__('users.user_success_changed'), $text]);
×
162

163
                return redirect('admin/users/edit?user=' . $user->login);
×
164
            }
165

166
            setInput($request->all());
×
167
            setFlash('danger', $validator->getErrors());
×
168
        }
169

170
        $banhist = Banhist::query()
×
171
            ->where('user_id', $user->id)
×
172
            ->whereIn('type', ['ban', 'change'])
×
173
            ->orderByDesc('created_at')
×
174
            ->first();
×
175

176
        return view('admin/users/edit', compact('user', 'banhist', 'allThemes', 'allGroups', 'adminGroups', 'fields'));
×
177
    }
178

179
    /**
180
     * Удаление пользователя
181
     */
182
    public function delete(Request $request, Validator $validator): View|RedirectResponse
×
183
    {
184
        $user = getUserByLogin($request->input('user'));
×
185

186
        if (! $user) {
×
187
            abort(404, __('validator.user'));
×
188
        }
189

190
        if ($request->isMethod('post')) {
×
191
            $loginblack = $request->boolean('loginblack');
×
192
            $mailblack = $request->boolean('mailblack');
×
193
            $delcomments = $request->boolean('delcomments');
×
194

195
            $validator->notIn($user->level, User::ADMIN_GROUPS, __('users.admins_remove_forbidden'));
×
196

197
            if ($validator->isValid()) {
×
198
                if ($loginblack) {
×
199
                    BlackList::query()->firstOrCreate(
×
200
                        ['type' => 'login', 'value' => $user->login],
×
201
                        ['user_id' => getUser('id')],
×
202
                    );
×
203
                }
204

205
                if ($mailblack) {
×
206
                    BlackList::query()->firstOrCreate(
×
207
                        ['type' => 'email', 'value' => $user->email],
×
208
                        ['user_id' => getUser('id')],
×
209
                    );
×
210
                }
211

212
                foreach (Registry::$onAdminDeleteUser as $handler) {
×
213
                    $handler($user, $request);
×
214
                }
215

216
                // Удаление комментариев
217
                if ($delcomments) {
×
218
                    $comments = Comment::query()
×
219
                        ->where('user_id', $user->id)
×
220
                        ->get();
×
221

222
                    $comments->each(static function (Comment $comment) {
×
223
                        $comment->delete();
×
224
                    });
×
225

226
                    if ($comments->isNotEmpty()) {
×
227
                        Restatement::run(array_keys(Restatement::$handlers));
×
228
                    }
229
                }
230

231
                $user->delete();
×
232

233
                setFlash('success', __('users.user_success_deleted'));
×
234

235
                return redirect('admin/users');
×
236
            }
237

238
            setInput($request->all());
×
239
            setFlash('danger', $validator->getErrors());
×
240
        }
241

242
        return view('admin/users/delete', compact('user'));
×
243
    }
244
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc