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

visavi / rotor / 28949359550

08 Jul 2026 02:12PM UTC coverage: 32.717% (-0.8%) from 33.484%
28949359550

push

github

visavi
Вынес в модуль пользовательские поля, статистику и рейтинг пользователя

5 of 23 new or added lines in 6 files covered. (21.74%)

4 existing lines in 3 files now uncovered.

1859 of 5682 relevant lines covered (32.72%)

3.81 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 Illuminate\Http\RedirectResponse;
15
use Illuminate\Http\Request;
16
use Illuminate\Support\Facades\Hash;
17
use Illuminate\Support\Str;
18
use Illuminate\View\View;
19

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

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

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

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

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

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

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

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

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

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

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

103
            // Для админа обязательность полей не проверяется
NEW
104
            foreach (Registry::$onProfileValidate as $handler) {
×
NEW
105
                $handler($user, $request, $validator, false);
×
106
            }
107

108
            if ($validator->isValid()) {
×
109
                if ($password) {
×
110
                    $text = __('users.user_new_password', ['password' => $password]);
×
111
                    $password = Hash::make($password);
×
112
                } else {
113
                    $text = null;
×
114
                    $password = $user->password;
×
115
                }
116

117
                $name = Str::substr($name, 0, 20);
×
118
                $country = Str::substr($country, 0, 30);
×
119
                $city = Str::substr($city, 0, 50);
×
120
                $rating = $posrating - $negrating;
×
121

122
                $user->update([
×
123
                    'password'  => $password,
×
124
                    'level'     => $level,
×
125
                    'email'     => $email,
×
126
                    'name'      => $name,
×
127
                    'country'   => $country,
×
128
                    'city'      => $city,
×
129
                    'phone'     => $phone,
×
130
                    'site'      => $site,
×
131
                    'birthday'  => $birthday,
×
132
                    'point'     => $point,
×
133
                    'money'     => $money,
×
134
                    'status'    => $status,
×
135
                    'rating'    => $rating,
×
136
                    'posrating' => $posrating,
×
137
                    'negrating' => $negrating,
×
138
                    'themes'    => $themes,
×
139
                    'gender'    => $gender,
×
140
                    'info'      => $info,
×
141
                ]);
×
142

NEW
143
                foreach (Registry::$onProfileSave as $handler) {
×
NEW
144
                    $handler($user, $request);
×
145
                }
146

147
                clearCache('status');
×
148
                setFlash('success', [__('users.user_success_changed'), $text]);
×
149

150
                return redirect('admin/users/edit?user=' . $user->login);
×
151
            }
152

153
            setInput($request->all());
×
154
            setFlash('danger', $validator->getErrors());
×
155
        }
156

157
        $banhist = Banhist::query()
×
158
            ->where('user_id', $user->id)
×
159
            ->whereIn('type', ['ban', 'change'])
×
160
            ->orderByDesc('created_at')
×
161
            ->first();
×
162

NEW
163
        return view('admin/users/edit', compact('user', 'banhist', 'allThemes', 'allGroups', 'adminGroups'));
×
164
    }
165

166
    /**
167
     * Удаление пользователя
168
     */
169
    public function delete(Request $request, Validator $validator): View|RedirectResponse
×
170
    {
171
        $user = getUserByLogin($request->input('user'));
×
172

173
        if (! $user) {
×
174
            abort(404, __('validator.user'));
×
175
        }
176

177
        if ($request->isMethod('post')) {
×
178
            $loginblack = $request->boolean('loginblack');
×
179
            $mailblack = $request->boolean('mailblack');
×
180
            $delcomments = $request->boolean('delcomments');
×
181

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

184
            if ($validator->isValid()) {
×
185
                if ($loginblack) {
×
186
                    BlackList::query()->firstOrCreate(
×
187
                        ['type' => 'login', 'value' => $user->login],
×
188
                        ['user_id' => getUser('id')],
×
189
                    );
×
190
                }
191

192
                if ($mailblack) {
×
193
                    BlackList::query()->firstOrCreate(
×
194
                        ['type' => 'email', 'value' => $user->email],
×
195
                        ['user_id' => getUser('id')],
×
196
                    );
×
197
                }
198

199
                foreach (Registry::$onAdminDeleteUser as $handler) {
×
200
                    $handler($user, $request);
×
201
                }
202

203
                // Удаление комментариев
204
                if ($delcomments) {
×
205
                    $comments = Comment::query()
×
206
                        ->where('user_id', $user->id)
×
207
                        ->get();
×
208

209
                    $comments->each(static function (Comment $comment) {
×
210
                        $comment->delete();
×
211
                    });
×
212

213
                    if ($comments->isNotEmpty()) {
×
214
                        Restatement::run(array_keys(Restatement::$handlers));
×
215
                    }
216
                }
217

218
                $user->delete();
×
219

220
                setFlash('success', __('users.user_success_deleted'));
×
221

222
                return redirect('admin/users');
×
223
            }
224

225
            setInput($request->all());
×
226
            setFlash('danger', $validator->getErrors());
×
227
        }
228

229
        return view('admin/users/delete', compact('user'));
×
230
    }
231
}
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