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

Размер файла: 7.07Kb
  1. <?php
  2.  
  3. declare(strict_types=1);
  4.  
  5. namespace App\Controllers\Admin;
  6.  
  7. use App\Classes\Validator;
  8. use App\Models\Comment;
  9. use App\Models\Offer;
  10. use App\Models\Polling;
  11. use App\Models\User;
  12. use Illuminate\Http\Request;
  13.  
  14. class OfferController extends AdminController
  15. {
  16. /**
  17. * Конструктор
  18. */
  19. public function __construct()
  20. {
  21. parent::__construct();
  22.  
  23. if (! isAdmin(User::ADMIN)) {
  24. abort(403, __('errors.forbidden'));
  25. }
  26. }
  27.  
  28. /**
  29. * Главная страница
  30. *
  31. * @param string $type
  32. * @param Request $request
  33. *
  34. * @return string
  35. */
  36. public function index(Request $request, $type = Offer::OFFER): string
  37. {
  38. $otherType = $type === Offer::OFFER ? Offer::ISSUE : Offer::OFFER;
  39. $otherCount = Offer::query()->where('type', $otherType)->count();
  40.  
  41. $sort = check($request->input('sort', 'rating'));
  42.  
  43. switch ($sort) {
  44. case 'time':
  45. $order = 'created_at';
  46. break;
  47. case 'status':
  48. $order = 'status';
  49. break;
  50. case 'comments':
  51. $order = 'count_comments';
  52. break;
  53. default:
  54. $order = 'rating';
  55. }
  56.  
  57. $offers = Offer::query()
  58. ->where('type', $type)
  59. ->orderByDesc($order)
  60. ->with('user')
  61. ->paginate(setting('postoffers'))
  62. ->appends(['sort' => $sort]);
  63.  
  64. return view('admin/offers/index', compact('offers', 'order', 'type', 'otherCount'));
  65. }
  66.  
  67. /**
  68. * Просмотр записи
  69. *
  70. * @param int $id
  71. *
  72. * @return string
  73. */
  74. public function view(int $id): string
  75. {
  76. $offer = Offer::query()
  77. ->where('offers.id', $id)
  78. ->first();
  79.  
  80. if (! $offer) {
  81. abort(404, __('main.record_not_found'));
  82. }
  83.  
  84. return view('admin/offers/view', compact('offer'));
  85. }
  86.  
  87. /**
  88. * Редактирование записи
  89. *
  90. * @param int $id
  91. * @param Request $request
  92. * @param Validator $validator
  93. *
  94. * @return string
  95. */
  96. public function edit(int $id, Request $request, Validator $validator): string
  97. {
  98. $offer = Offer::query()->where('id', $id)->first();
  99.  
  100. if (! $offer) {
  101. abort(404, __('main.record_not_found'));
  102. }
  103.  
  104. if ($request->isMethod('post')) {
  105. $title = $request->input('title');
  106. $text = $request->input('text');
  107. $type = $request->input('type');
  108. $closed = empty($request->input('closed')) ? 0 : 1;
  109.  
  110. $validator->equal($request->input('token'), $_SESSION['token'], __('validator.token'))
  111. ->length($title, 3, 50, ['title' => __('validator.text')])
  112. ->length($text, 5, 1000, ['text' => __('validator.text')])
  113. ->in($type, Offer::TYPES, ['type' => __('offers.type_invalid')]);
  114.  
  115. if ($validator->isValid()) {
  116. $title = antimat($title);
  117. $text = antimat($text);
  118.  
  119. $offer->update([
  120. 'type' => $type,
  121. 'title' => $title,
  122. 'text' => $text,
  123. 'closed' => $closed,
  124. 'updated_at' => SITETIME,
  125. ]);
  126.  
  127. setFlash('success', __('main.record_changed_success'));
  128. redirect('/admin/offers/' . $offer->id);
  129. } else {
  130. setInput($request->all());
  131. setFlash('danger', $validator->getErrors());
  132. }
  133. }
  134.  
  135. return view('admin/offers/edit', compact('offer'));
  136. }
  137.  
  138. /**
  139. * Ответ на предложение
  140. *
  141. * @param int $id
  142. * @param Request $request
  143. * @param Validator $validator
  144. *
  145. * @return string
  146. */
  147. public function reply(int $id, Request $request, Validator $validator): string
  148. {
  149. $offer = Offer::query()->where('id', $id)->first();
  150.  
  151. if (! $offer) {
  152. abort(404, __('main.record_not_found'));
  153. }
  154.  
  155. if ($request->isMethod('post')) {
  156. $reply = $request->input('reply');
  157. $status = $request->input('status');
  158. $closed = empty($request->input('closed')) ? 0 : 1;
  159.  
  160. $validator->equal($request->input('token'), $_SESSION['token'], __('validator.token'))
  161. ->length($reply, 5, 3000, ['reply' => __('validator.text')])
  162. ->in($status, Offer::STATUSES, ['status' => __('offers.status_invalid')]);
  163.  
  164. if ($validator->isValid()) {
  165. $reply = antimat($reply);
  166.  
  167. $offer->update([
  168. 'reply' => $reply,
  169. 'reply_user_id' => getUser('id'),
  170. 'status' => $status,
  171. 'closed' => $closed,
  172. 'updated_at' => SITETIME,
  173. ]);
  174.  
  175. setFlash('success', __('offers.answer_success_added'));
  176. redirect('/admin/offers/' . $offer->id);
  177. } else {
  178. setInput($request->all());
  179. setFlash('danger', $validator->getErrors());
  180. }
  181. }
  182.  
  183. $statuses = Offer::STATUSES;
  184.  
  185. return view('admin/offers/reply', compact('offer', 'statuses'));
  186. }
  187.  
  188. /**
  189. * Пересчет комментариев
  190. *
  191. * @param Request $request
  192. *
  193. * @return void
  194. */
  195. public function restatement(Request $request): void
  196. {
  197. if (! isAdmin(User::BOSS)) {
  198. abort(403, __('errors.forbidden'));
  199. }
  200.  
  201. if ($request->input('token') === $_SESSION['token']) {
  202. restatement('offers');
  203.  
  204. setFlash('success', __('main.success_recounted'));
  205. } else {
  206. setFlash('danger', __('validator.token'));
  207. }
  208.  
  209. redirect('/admin/offers');
  210. }
  211.  
  212. /**
  213. * Удаление записей
  214. *
  215. * @param Request $request
  216. * @param Validator $validator
  217. *
  218. * @return void
  219. */
  220. public function delete(Request $request, Validator $validator): void
  221. {
  222. $page = int($request->input('page', 1));
  223. $del = intar($request->input('del'));
  224. $type = $request->input('type') === Offer::OFFER ? Offer::OFFER : Offer::ISSUE;
  225.  
  226. $validator->equal($request->input('token'), $_SESSION['token'], __('validator.token'))
  227. ->true($del, __('validator.deletion'));
  228.  
  229. if ($validator->isValid()) {
  230. Offer::query()->whereIn('id', $del)->delete();
  231.  
  232. Polling::query()
  233. ->where('relate_type', Offer::$morphName)
  234. ->whereIn('relate_id', $del)
  235. ->delete();
  236.  
  237. Comment::query()
  238. ->where('relate_type', Offer::$morphName)
  239. ->whereIn('relate_id', $del)
  240. ->delete();
  241.  
  242. setFlash('success', __('main.records_deleted_success'));
  243. } else {
  244. setFlash('danger', $validator->getErrors());
  245. }
  246.  
  247. redirect('/admin/offers/' . $type . '?page=' . $page);
  248. }
  249. }