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

Размер файла: 6.36Kb
  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\User;
  10. use Illuminate\Http\Request;
  11.  
  12. class BanController extends AdminController
  13. {
  14. public function __construct()
  15. {
  16. parent::__construct();
  17.  
  18. if (! isAdmin(User::MODER)) {
  19. abort(403, __('errors.forbidden'));
  20. }
  21. }
  22.  
  23. /**
  24. * Главная страница
  25. *
  26. * @return string
  27. */
  28. public function index(): string
  29. {
  30. return view('admin/bans/index');
  31. }
  32.  
  33. /**
  34. * Бан пользователя
  35. *
  36. * @param Request $request
  37. * @param Validator $validator
  38. *
  39. * @return string
  40. */
  41. public function edit(Request $request, Validator $validator): string
  42. {
  43. $user = User::query()->where('login', $request->input('user'))->with('lastBan')->first();
  44.  
  45. if (! $user) {
  46. abort(404, __('validator.user'));
  47. }
  48.  
  49. if (in_array($user->level, User::ADMIN_GROUPS, true)) {
  50. abort('default', __('admin.bans.forbidden_ban'));
  51. }
  52.  
  53. if ($request->isMethod('post')) {
  54. $time = int($request->input('time'));
  55. $type = $request->input('type');
  56. $reason = $request->input('reason');
  57. $notice = $request->input('notice');
  58.  
  59. $validator->equal($request->input('token'), $_SESSION['token'], __('validator.token'))
  60. ->false($user->level === User::BANNED && $user->timeban > SITETIME, __('admin.bans.user_banned'))
  61. ->gt($time, 0, ['time' => __('admin.bans.time_not_indicated')])
  62. ->in($type, ['minutes', 'hours', 'days'], ['type' => __('admin.bans.time_not_selected')])
  63. ->length($reason, 5, 1000, ['reason' => __('validator.text')])
  64. ->length($notice, 0, 1000, ['notice' => __('validator.text_long')]);
  65.  
  66. if ($validator->isValid()) {
  67. if ($type === 'days') {
  68. $time *= 86400;
  69. } elseif ($type === 'hours') {
  70. $time *= 3600;
  71. } else {
  72. $time *= 60;
  73. }
  74.  
  75. $user->update([
  76. 'level' => User::BANNED,
  77. 'timeban' => SITETIME + $time,
  78. ]);
  79.  
  80. Banhist::query()->create([
  81. 'user_id' => $user->id,
  82. 'send_user_id' => getUser('id'),
  83. 'type' => Banhist::BAN,
  84. 'reason' => $reason,
  85. 'term' => $time,
  86. 'created_at' => SITETIME,
  87. ]);
  88.  
  89. $user->note()->updateOrCreate([], [
  90. 'text' => $notice,
  91. 'edit_user_id' => getUser('id'),
  92. 'updated_at' => SITETIME,
  93. ]);
  94.  
  95. setFlash('success', __('admin.bans.success_banned'));
  96. redirect('/admin/bans/edit?user=' . $user->login);
  97. } else {
  98. setInput($request->all());
  99. setFlash('danger', $validator->getErrors());
  100. }
  101. }
  102.  
  103. return view('admin/bans/edit', compact('user'));
  104. }
  105.  
  106. /**
  107. * Изменение бана
  108. *
  109. * @param Request $request
  110. * @param Validator $validator
  111. *
  112. * @return string
  113. */
  114. public function change(Request $request, Validator $validator): string
  115. {
  116. $user = User::query()->where('login', $request->input('user'))->with('lastBan')->first();
  117.  
  118. if (! $user) {
  119. abort(404, __('validator.user'));
  120. }
  121.  
  122. if ($user->level !== User::BANNED || $user->timeban < SITETIME) {
  123. abort('default', __('admin.bans.user_not_banned'));
  124. }
  125.  
  126. if ($request->isMethod('post')) {
  127. $timeban = int($request->input('timeban'));
  128. $reason = $request->input('reason');
  129.  
  130. $timeban = strtotime($timeban);
  131. $term = $timeban - SITETIME;
  132.  
  133. $validator->equal($request->input('token'), $_SESSION['token'], __('validator.token'))
  134. ->gt($term, 0, ['timeban' => __('admin.bans.time_empty')])
  135. ->length($reason, 5, 1000, ['reason' => __('validator.text')]);
  136.  
  137. if ($validator->isValid()) {
  138. $user->update([
  139. 'level' => User::BANNED,
  140. 'timeban' => $timeban,
  141. ]);
  142.  
  143. Banhist::query()->create([
  144. 'user_id' => $user->id,
  145. 'send_user_id' => getUser('id'),
  146. 'type' => Banhist::CHANGE,
  147. 'reason' => $reason,
  148. 'term' => $term,
  149. 'created_at' => SITETIME,
  150. ]);
  151.  
  152. setFlash('success', __('main.record_changed_success'));
  153. redirect('/admin/bans/edit?user=' . $user->login);
  154. } else {
  155. setInput($request->all());
  156. setFlash('danger', $validator->getErrors());
  157. }
  158. }
  159.  
  160. return view('admin/bans/change', compact('user'));
  161. }
  162.  
  163. /**
  164. * Снятие бана
  165. *
  166. * @param Request $request
  167. * @param Validator $validator
  168. *
  169. * @return void
  170. */
  171. public function unban(Request $request, Validator $validator): void
  172. {
  173. $user = User::query()->where('login', $request->input('user'))->with('lastBan')->first();
  174.  
  175. if (! $user) {
  176. abort(404, __('validator.user'));
  177. }
  178.  
  179. if ($user->level !== User::BANNED || $user->timeban < SITETIME) {
  180. abort('default', __('admin.bans.user_not_banned'));
  181. }
  182.  
  183. $validator->equal($request->input('token'), $_SESSION['token'], __('validator.token'));
  184.  
  185. if ($validator->isValid()) {
  186. $user->update([
  187. 'level' => User::USER,
  188. 'timeban' => null,
  189. ]);
  190.  
  191. Banhist::query()->create([
  192. 'user_id' => $user->id,
  193. 'send_user_id' => getUser('id'),
  194. 'type' => Banhist::UNBAN,
  195. 'created_at' => SITETIME,
  196. ]);
  197.  
  198. setFlash('success', __('admin.bans.success_unbanned'));
  199. } else {
  200. setFlash('danger', $validator->getErrors());
  201. }
  202.  
  203. redirect('/admin/bans/edit?user=' . $user->login);
  204. }
  205. }