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

visavi / rotor / 28323582235

28 Jun 2026 01:20PM UTC coverage: 16.474% (+0.06%) from 16.419%
28323582235

push

github

visavi
Переход на datetime

19 of 66 new or added lines in 23 files covered. (28.79%)

9 existing lines in 8 files now uncovered.

984 of 5973 relevant lines covered (16.47%)

2.38 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
            $created = $request->input('created');
×
95

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

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

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

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

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

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

163
                clearCache('status');
×
164
                setFlash('success', [__('users.user_success_changed'), $text]);
×
165

166
                return redirect('admin/users/edit?user=' . $user->login);
×
167
            }
168

169
            setInput($request->all());
×
170
            setFlash('danger', $validator->getErrors());
×
171
        }
172

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

179
        return view('admin/users/edit', compact('user', 'banhist', 'allThemes', 'allGroups', 'adminGroups', 'fields'));
×
180
    }
181

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

189
        if (! $user) {
×
190
            abort(404, __('validator.user'));
×
191
        }
192

193
        if ($request->isMethod('post')) {
×
194
            $loginblack = $request->boolean('loginblack');
×
195
            $mailblack = $request->boolean('mailblack');
×
196
            $delcomments = $request->boolean('delcomments');
×
197

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

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

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

215
                foreach (Registry::$onAdminDeleteUser as $handler) {
×
216
                    $handler($user, $request);
×
217
                }
218

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

225
                    $comments->each(static function (Comment $comment) {
×
226
                        $comment->delete();
×
227
                    });
×
228

229
                    if ($comments->isNotEmpty()) {
×
230
                        Restatement::run(array_keys(Restatement::$handlers));
×
231
                    }
232
                }
233

234
                $user->delete();
×
235

236
                setFlash('success', __('users.user_success_deleted'));
×
237

238
                return redirect('admin/users');
×
239
            }
240

241
            setInput($request->all());
×
242
            setFlash('danger', $validator->getErrors());
×
243
        }
244

245
        return view('admin/users/delete', compact('user'));
×
246
    }
247
}
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