Просмотр файла app/Http/Controllers/Admin/UserController.php

Размер файла: 11.12Kb
  1. <?php
  2.  
  3. declare(strict_types=1);
  4.  
  5. namespace App\Http\Controllers\Admin;
  6.  
  7. use App\Classes\Validator;
  8. use App\Models\Banhist;
  9. use App\Models\BlackList;
  10. use App\Models\Comment;
  11. use App\Models\File;
  12. use App\Models\Post;
  13. use App\Models\Topic;
  14. use App\Models\User;
  15. use Exception;
  16. use Illuminate\Http\RedirectResponse;
  17. use Illuminate\Http\Request;
  18. use Illuminate\View\View;
  19.  
  20. class UserController extends AdminController
  21. {
  22. /**
  23. * Главная страница
  24. *
  25. * @return View
  26. */
  27. public function index(): View
  28. {
  29. $users = User::query()
  30. ->orderByDesc('created_at')
  31. ->paginate(setting('userlist'));
  32.  
  33. return view('admin/users/index', compact('users'));
  34. }
  35.  
  36. /**
  37. * Поиск пользователей
  38. *
  39. * @param Request $request
  40. *
  41. * @return View
  42. */
  43. public function search(Request $request): View
  44. {
  45. $q = check($request->input('q'));
  46.  
  47. $search = $q === '1' ? "RLIKE '^[-0-9]'" : "LIKE '$q%'";
  48.  
  49. $users = User::query()
  50. ->whereRaw('login ' . $search)
  51. ->orderByDesc('point')
  52. ->paginate(setting('usersearch'))
  53. ->appends(['q' => $q]);
  54.  
  55. return view('admin/users/search', compact('users'));
  56. }
  57.  
  58. /**
  59. * Редактирование пользователя
  60. *
  61. * @param Request $request
  62. * @param Validator $validator
  63. *
  64. * @return View|RedirectResponse
  65. */
  66. public function edit(Request $request, Validator $validator)
  67. {
  68. $user = getUserByLogin($request->input('user'));
  69.  
  70. if (! $user) {
  71. abort(404, __('validator.user'));
  72. }
  73.  
  74. $allThemes = array_map('basename', glob(public_path('/themes/*'), GLOB_ONLYDIR));
  75. $adminGroups = User::ADMIN_GROUPS;
  76.  
  77. $allGroups = [];
  78. foreach (User::ALL_GROUPS as $level) {
  79. $allGroups[$level] = User::getLevelByKey($level);
  80. }
  81.  
  82. if ($request->isMethod('post')) {
  83. $level = $request->input('level');
  84. $password = $request->input('password');
  85. $email = $request->input('email');
  86. $name = $request->input('name');
  87. $country = $request->input('country');
  88. $city = $request->input('city');
  89. $phone = preg_replace('/\D/', '', $request->input('phone') ?? '');
  90. $site = $request->input('site');
  91. $birthday = $request->input('birthday');
  92. $point = int($request->input('point'));
  93. $money = int($request->input('money'));
  94. $status = $request->input('status');
  95. $posrating = int($request->input('posrating'));
  96. $negrating = int($request->input('negrating'));
  97. $themes = $request->input('themes');
  98. $gender = $request->input('gender') === User::MALE ? User::MALE : User::FEMALE;
  99. $info = $request->input('info');
  100. $created = $request->input('created');
  101.  
  102. $validator->equal($request->input('_token'), csrf_token(), __('validator.token'))
  103. ->in($level, User::ALL_GROUPS, ['level' => __('users.user_level_invalid')])
  104. ->length($password, 6, 20, __('users.password_length_requirements'), false)
  105. ->email($email, ['email' => __('validator.email')])
  106. ->phone($phone, ['phone' => __('validator.phone')], false)
  107. ->url($site, ['site' => __('validator.url')], false)
  108. ->regex($birthday, '#^[0-9]{2}+\.[0-9]{2}+\.[0-9]{4}$#', ['birthday' => __('validator.date')], false)
  109. ->regex($created, '#^[0-9]{2}+\.[0-9]{2}+\.[0-9]{4}$#', ['created' => __('validator.date')], false)
  110. ->length($status, 3, 20, ['status' => __('users.status_short_or_long')], false)
  111. ->true(in_array($themes, $allThemes, true) || empty($themes), ['themes' => __('users.theme_not_installed')])
  112. ->length($info, 0, 1000, ['info' => __('users.info_yourself_long')]);
  113.  
  114. if ($validator->isValid()) {
  115. if ($password) {
  116. $text = __('users.user_new_password', ['password' => $password]);
  117. $password = password_hash($password, PASSWORD_BCRYPT);
  118. } else {
  119. $text = null;
  120. $password = $user->password;
  121. }
  122.  
  123. $name = utfSubstr($name, 0, 20);
  124. $country = utfSubstr($country, 0, 30);
  125. $city = utfSubstr($city, 0, 50);
  126. $rating = $posrating - $negrating;
  127.  
  128. $user->update([
  129. 'password' => $password,
  130. 'level' => $level,
  131. 'email' => $email,
  132. 'name' => $name,
  133. 'country' => $country,
  134. 'city' => $city,
  135. 'phone' => $phone,
  136. 'site' => $site,
  137. 'birthday' => $birthday,
  138. 'point' => $point,
  139. 'money' => $money,
  140. 'status' => $status,
  141. 'rating' => $rating,
  142. 'posrating' => $posrating,
  143. 'negrating' => $negrating,
  144. 'themes' => $themes,
  145. 'gender' => $gender,
  146. 'info' => $info,
  147. 'created_at' => strtotime($created),
  148. ]);
  149.  
  150. clearCache('status');
  151. setFlash('success', [__('users.user_success_changed'), $text]);
  152.  
  153. return redirect('admin/users/edit?user=' . $user->login);
  154. }
  155.  
  156. setInput($request->all());
  157. setFlash('danger', $validator->getErrors());
  158. }
  159.  
  160. $banhist = Banhist::query()
  161. ->where('user_id', $user->id)
  162. ->whereIn('type', ['ban', 'change'])
  163. ->orderByDesc('created_at')
  164. ->first();
  165.  
  166. return view('admin/users/edit', compact('user', 'banhist', 'allThemes', 'allGroups', 'adminGroups'));
  167. }
  168.  
  169. /**
  170. * Удаление пользователя
  171. *
  172. * @param Request $request
  173. * @param Validator $validator
  174. *
  175. * @return View|RedirectResponse
  176. * @throws Exception
  177. */
  178. public function delete(Request $request, Validator $validator)
  179. {
  180. $user = getUserByLogin($request->input('user'));
  181.  
  182. if (! $user) {
  183. abort(404, __('validator.user'));
  184. }
  185.  
  186. if ($request->isMethod('post')) {
  187. $loginblack = empty($request->input('loginblack')) ? 0 : 1;
  188. $mailblack = empty($request->input('mailblack')) ? 0 : 1;
  189. $deltopics = empty($request->input('deltopics')) ? 0 : 1;
  190. $delposts = empty($request->input('delposts')) ? 0 : 1;
  191. $delcomments = empty($request->input('delcomments')) ? 0 : 1;
  192. $delimages = empty($request->input('delimages')) ? 0 : 1;
  193.  
  194. $validator->equal($request->input('_token'), csrf_token(), __('validator.token'))
  195. ->notIn($user->level, User::ADMIN_GROUPS, __('users.admins_remove_forbidden'));
  196.  
  197. if ($validator->isValid()) {
  198. if ($loginblack) {
  199. $duplicate = BlackList::query()->where('type', 'login')->where('value', $user->login)->first();
  200. if (! $duplicate) {
  201. BlackList::query()->create([
  202. 'type' => 'login',
  203. 'value' => $user->login,
  204. 'user_id' => getUser('id'),
  205. 'created_at' => SITETIME,
  206. ]);
  207. }
  208. }
  209.  
  210. if ($mailblack) {
  211. $duplicate = BlackList::query()->where('type', 'email')->where('value', $user->email)->first();
  212. if (! $duplicate) {
  213. BlackList::query()->create([
  214. 'type' => 'email',
  215. 'value' => $user->email,
  216. 'user_id' => getUser('id'),
  217. 'created_at' => SITETIME,
  218. ]);
  219. }
  220. }
  221.  
  222. // Удаление тем форума
  223. if ($deltopics) {
  224. $topics = Topic::query()->where('user_id', $user->id)->pluck('id')->all();
  225. $posts = Post::query()->whereIn('topic_id', $topics)->pluck('id')->all();
  226.  
  227. // Удаление загруженных файлов
  228. if ($posts) {
  229. $files = File::query()
  230. ->where('relate_type', Post::$morphName)
  231. ->whereIn('relate_id', $posts)
  232. ->get();
  233.  
  234. if ($files->isNotEmpty()) {
  235. foreach ($files as $file) {
  236. $file->delete();
  237. }
  238. }
  239. }
  240.  
  241. Post::query()->whereIn('topic_id', $topics)->delete();
  242. Topic::query()->where('user_id', $user->id)->delete();
  243. restatement('forums');
  244. }
  245.  
  246. // Удаление постов форума
  247. if ($delposts) {
  248. $posts = Post::query()->where('user_id', $user->id)->pluck('id')->all();
  249.  
  250. // Удаление загруженных файлов
  251. if ($posts) {
  252. $files = File::query()
  253. ->where('relate_type', Post::$morphName)
  254. ->whereIn('relate_id', $posts)
  255. ->get();
  256.  
  257. if ($files->isNotEmpty()) {
  258. foreach ($files as $file) {
  259. $file->delete();
  260. }
  261. }
  262. }
  263.  
  264. Post::query()->where('user_id', $user->id)->delete();
  265. restatement('forums');
  266. }
  267.  
  268. // Удаление комментариев
  269. if ($delcomments) {
  270. $deletes = Comment::query()
  271. ->where('user_id', $user->id)
  272. ->delete();
  273.  
  274. if ($deletes) {
  275. restatement('blogs');
  276. restatement('loads');
  277. restatement('news');
  278. restatement('photos');
  279. restatement('offers');
  280. }
  281. }
  282.  
  283. // Удаление фотографий в галерее
  284. if ($delimages) {
  285. $user->deleteAlbum();
  286. }
  287.  
  288. $user->delete();
  289.  
  290. setFlash('success', __('users.user_success_deleted'));
  291.  
  292. return redirect('admin/users');
  293. }
  294.  
  295. setInput($request->all());
  296. setFlash('danger', $validator->getErrors());
  297. }
  298.  
  299. return view('admin/users/delete', compact('user'));
  300. }
  301. }