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

Размер файла: 10.02Kb
  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\Board;
  9. use App\Models\Item;
  10. use App\Models\User;
  11. use Exception;
  12. use Illuminate\Database\Eloquent\Builder;
  13. use Illuminate\Http\RedirectResponse;
  14. use Illuminate\Http\Request;
  15. use Illuminate\View\View;
  16.  
  17. class BoardController extends AdminController
  18. {
  19. /**
  20. * Главная страница
  21. *
  22. * @param int|null $id
  23. *
  24. * @return View
  25. */
  26. public function index(int $id = null): View
  27. {
  28. $board = null;
  29.  
  30. if ($id) {
  31. /** @var Board $board */
  32. $board = Board::query()->find($id);
  33.  
  34. if (! $board) {
  35. abort(404, __('boards.category_not_exist'));
  36. }
  37. }
  38.  
  39. $items = Item::query()
  40. ->when($board, static function (Builder $query) use ($board) {
  41. return $query->where('board_id', $board->id);
  42. })
  43. ->where('expires_at', '>', SITETIME)
  44. ->orderByDesc('updated_at')
  45. ->with('category', 'user', 'files')
  46. ->paginate(Item::BOARD_PAGINATE);
  47.  
  48. $boards = Board::query()
  49. ->where('parent_id', $board->id ?? 0)
  50. ->get();
  51.  
  52. return view('admin/boards/index', compact('items', 'board', 'boards'));
  53. }
  54.  
  55. /**
  56. * Категории объявлений
  57. *
  58. * @return View
  59. */
  60. public function categories(): View
  61. {
  62. if (! isAdmin(User::BOSS)) {
  63. abort(403, __('errors.forbidden'));
  64. }
  65.  
  66. $boards = Board::query()
  67. ->where('parent_id', 0)
  68. ->orderBy('sort')
  69. ->with('children')
  70. ->get();
  71.  
  72. return view('admin/boards/categories', compact('boards'));
  73. }
  74.  
  75. /**
  76. * Создание раздела
  77. *
  78. * @param Request $request
  79. * @param Validator $validator
  80. *
  81. * @return RedirectResponse
  82. */
  83. public function create(Request $request, Validator $validator): RedirectResponse
  84. {
  85. if (! isAdmin(User::BOSS)) {
  86. abort(403, __('errors.forbidden'));
  87. }
  88.  
  89. $name = $request->input('name');
  90.  
  91. $validator->equal($request->input('_token'), csrf_token(), __('validator.token'))
  92. ->length($name, 3, 50, ['name' => __('validator.text')]);
  93.  
  94. if ($validator->isValid()) {
  95. $max = Board::query()->max('sort') + 1;
  96.  
  97. /** @var Board $board */
  98. $board = Board::query()->create([
  99. 'name' => $name,
  100. 'sort' => $max,
  101. ]);
  102.  
  103. setFlash('success', __('boards.category_success_created'));
  104.  
  105. return redirect('admin/boards/edit/' . $board->id);
  106. }
  107.  
  108. setInput($request->all());
  109. setFlash('danger', $validator->getErrors());
  110.  
  111. return redirect('admin/boards/categories');
  112. }
  113.  
  114. /**
  115. * Редактирование раздела
  116. *
  117. * @param int $id
  118. * @param Request $request
  119. * @param Validator $validator
  120. *
  121. * @return View|RedirectResponse
  122. */
  123. public function edit(int $id, Request $request, Validator $validator)
  124. {
  125. if (! isAdmin(User::BOSS)) {
  126. abort(403, __('errors.forbidden'));
  127. }
  128.  
  129. /** @var Board $board */
  130. $board = Board::query()->with('children')->find($id);
  131.  
  132. if (! $board) {
  133. abort(404, __('boards.category_not_exist'));
  134. }
  135.  
  136. $boards = Board::query()
  137. ->where('parent_id', 0)
  138. ->orderBy('sort')
  139. ->get();
  140.  
  141. if ($request->isMethod('post')) {
  142. $parent = int($request->input('parent'));
  143. $name = $request->input('name');
  144. $sort = int($request->input('sort'));
  145. $closed = empty($request->input('closed')) ? 0 : 1;
  146.  
  147. $validator->equal($request->input('_token'), csrf_token(), __('validator.token'))
  148. ->length($name, 3, 50, ['name' => __('validator.text')])
  149. ->notEqual($parent, $board->id, ['parent' => __('boards.category_parent_invalid')]);
  150.  
  151. if (! empty($parent) && $board->children->isNotEmpty()) {
  152. $validator->addError(['parent' => __('boards.category_has_subsections')]);
  153. }
  154.  
  155. if ($validator->isValid()) {
  156. $board->update([
  157. 'parent_id' => $parent,
  158. 'name' => $name,
  159. 'sort' => $sort,
  160. 'closed' => $closed,
  161. ]);
  162.  
  163. setFlash('success', __('boards.category_success_edited'));
  164.  
  165. return redirect('admin/boards/categories');
  166. }
  167.  
  168. setInput($request->all());
  169. setFlash('danger', $validator->getErrors());
  170. }
  171.  
  172. return view('admin/boards/edit', compact('boards', 'board'));
  173. }
  174.  
  175. /**
  176. * Удаление раздела
  177. *
  178. * @param int $id
  179. * @param Request $request
  180. * @param Validator $validator
  181. *
  182. * @return RedirectResponse
  183. */
  184. public function delete(int $id, Request $request, Validator $validator): RedirectResponse
  185. {
  186. if (! isAdmin(User::BOSS)) {
  187. abort(403, __('errors.forbidden'));
  188. }
  189.  
  190. /** @var Board $board */
  191. $board = Board::query()->with('children')->find($id);
  192.  
  193. if (! $board) {
  194. abort(404, __('boards.category_not_exist'));
  195. }
  196.  
  197. $validator->equal($request->input('_token'), csrf_token(), __('validator.token'))
  198. ->true($board->children->isEmpty(), __('boards.category_has_subsections'));
  199.  
  200. $item = Item::query()->where('board_id', $board->id)->first();
  201. if ($item) {
  202. $validator->addError(__('boards.category_has_items'));
  203. }
  204.  
  205. if ($validator->isValid()) {
  206. $board->delete();
  207.  
  208. setFlash('success', __('boards.category_success_deleted'));
  209. } else {
  210. setFlash('danger', $validator->getErrors());
  211. }
  212.  
  213. return redirect('admin/boards/categories');
  214. }
  215.  
  216. /**
  217. * Редактирование объявления
  218. *
  219. * @param int $id
  220. * @param Request $request
  221. * @param Validator $validator
  222. *
  223. * @return View|RedirectResponse
  224. */
  225. public function editItem(int $id, Request $request, Validator $validator)
  226. {
  227. /** @var Item $item */
  228. $item = Item::query()->find($id);
  229.  
  230. if (! $item) {
  231. abort(404, __('boards.item_not_exist'));
  232. }
  233.  
  234. if ($request->isMethod('post')) {
  235. $bid = int($request->input('bid'));
  236. $title = $request->input('title');
  237. $text = $request->input('text');
  238. $price = int($request->input('price'));
  239. $phone = preg_replace('/\D/', '', $request->input('phone') ?? '');
  240.  
  241. /** @var Board $board */
  242. $board = Board::query()->find($bid);
  243.  
  244. $validator
  245. ->equal($request->input('_token'), csrf_token(), __('validator.token'))
  246. ->length($title, 3, 50, ['title' => __('validator.text')])
  247. ->length($text, 50, 5000, ['text' => __('validator.text')])
  248. ->phone($phone, ['phone' => __('validator.phone')], false)
  249. ->notEmpty($board, ['bid' => __('boards.category_not_exist')]);
  250.  
  251. if ($board) {
  252. $validator->empty($board->closed, ['bid' => __('boards.category_closed')]);
  253. }
  254.  
  255. if ($validator->isValid()) {
  256. // Обновление счетчиков
  257. if ($item->board_id !== $board->id) {
  258. $board->increment('count_items');
  259. Board::query()->where('id', $item->board_id)->decrement('count_items');
  260. }
  261.  
  262. $item->update([
  263. 'board_id' => $board->id,
  264. 'title' => $title,
  265. 'text' => $text,
  266. 'price' => $price,
  267. 'phone' => $phone,
  268. ]);
  269.  
  270. clearCache(['statBoards', 'recentBoards']);
  271. setFlash('success', __('boards.item_success_edited'));
  272.  
  273. return redirect('admin/items/edit/' . $item->id);
  274. }
  275.  
  276. setInput($request->all());
  277. setFlash('danger', $validator->getErrors());
  278. }
  279.  
  280. $boards = Board::query()
  281. ->where('parent_id', 0)
  282. ->with('children')
  283. ->orderBy('sort')
  284. ->get();
  285.  
  286. return view('/admin/boards/edit_item', compact('item', 'boards'));
  287. }
  288.  
  289. /**
  290. * Удаление объявления
  291. *
  292. * @param int $id
  293. * @param Request $request
  294. * @param Validator $validator
  295. *
  296. * @return RedirectResponse
  297. * @throws Exception
  298. */
  299. public function deleteItem(int $id, Request $request, Validator $validator): RedirectResponse
  300. {
  301. /** @var Item $item */
  302. $item = Item::query()->find($id);
  303.  
  304. if (! $item) {
  305. abort(404, __('boards.item_not_exist'));
  306. }
  307.  
  308. $validator->equal($request->input('_token'), csrf_token(), __('validator.token'));
  309.  
  310. if ($validator->isValid()) {
  311. $item->delete();
  312. $item->category->decrement('count_items');
  313.  
  314. clearCache(['statBoards', 'recentBoards']);
  315. setFlash('success', __('boards.item_success_deleted'));
  316. } else {
  317. setFlash('danger', $validator->getErrors());
  318. }
  319.  
  320. return redirect('admin/boards/' . $item->board_id);
  321. }
  322.  
  323. /**
  324. * Пересчет голосов
  325. *
  326. * @param Request $request
  327. *
  328. * @return RedirectResponse
  329. */
  330. public function restatement(Request $request): RedirectResponse
  331. {
  332. if (! isAdmin(User::BOSS)) {
  333. abort(403, __('errors.forbidden'));
  334. }
  335.  
  336. if ($request->input('_token') === csrf_token()) {
  337. restatement('boards');
  338.  
  339. setFlash('success', __('main.success_recounted'));
  340. } else {
  341. setFlash('danger', __('validator.token'));
  342. }
  343.  
  344. return redirect('admin/boards');
  345. }
  346. }