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

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