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

Размер файла: 8.04Kb
  1. <?php
  2.  
  3. declare(strict_types=1);
  4.  
  5. namespace App\Http\Controllers;
  6.  
  7. use App\Classes\Validator;
  8. use App\Models\Comment;
  9. use App\Models\Flood;
  10. use App\Models\News;
  11. use Illuminate\Database\Query\JoinClause;
  12. use Illuminate\Http\RedirectResponse;
  13. use Illuminate\Http\Request;
  14. use Illuminate\View\View;
  15.  
  16. class NewsController extends Controller
  17. {
  18. /**
  19. * Главная страница
  20. *
  21. * @return View
  22. */
  23. public function index(): View
  24. {
  25. $news = News::query()
  26. ->select('news.*', 'pollings.vote')
  27. ->leftJoin('pollings', static function (JoinClause $join) {
  28. $join->on('news.id', 'pollings.relate_id')
  29. ->where('pollings.relate_type', News::$morphName)
  30. ->where('pollings.user_id', getUser('id'));
  31. })
  32. ->orderByDesc('created_at')
  33. ->with('user')
  34. ->paginate(setting('postnews'));
  35.  
  36. return view('news/index', compact('news'));
  37. }
  38.  
  39. /**
  40. * Вывод новости
  41. *
  42. * @param int
  43. *
  44. * @return View
  45. */
  46. public function view(int $id): View
  47. {
  48. /** @var News $news */
  49. $news = News::query()
  50. ->select('news.*', 'pollings.vote')
  51. ->leftJoin('pollings', static function (JoinClause $join) {
  52. $join->on('news.id', 'pollings.relate_id')
  53. ->where('pollings.relate_type', News::$morphName)
  54. ->where('pollings.user_id', getUser('id'));
  55. })
  56. ->find($id);
  57.  
  58. if (! $news) {
  59. abort(404, __('news.news_not_exist'));
  60. }
  61.  
  62. $comments = $news->comments()
  63. ->limit(5)
  64. ->orderByDesc('created_at')
  65. ->with('user')
  66. ->get()
  67. ->reverse();
  68.  
  69. return view('news/view', compact('news', 'comments'));
  70. }
  71.  
  72. /**
  73. * Комментарии
  74. *
  75. * @param int $id
  76. * @param Request $request
  77. * @param Validator $validator
  78. * @param Flood $flood
  79. *
  80. * @return View|RedirectResponse
  81. */
  82. public function comments(int $id, Request $request, Validator $validator, Flood $flood)
  83. {
  84. /** @var News $news */
  85. $news = News::query()->find($id);
  86.  
  87. if (! $news) {
  88. abort(404, __('news.news_not_exist'));
  89. }
  90.  
  91. if ($request->isMethod('post')) {
  92. $msg = $request->input('msg');
  93.  
  94. $validator->true(getUser(), __('main.not_authorized'))
  95. ->equal($request->input('_token'), csrf_token(), __('validator.token'))
  96. ->false($flood->isFlood(), ['msg' => __('validator.flood', ['sec' => $flood->getPeriod()])])
  97. ->length($msg, 5, setting('comment_length'), ['msg' => __('validator.text')])
  98. ->empty($news->closed, ['msg' => __('news.closed_news')]);
  99.  
  100. if ($validator->isValid()) {
  101. $msg = antimat($msg);
  102.  
  103. /** @var Comment $comment */
  104. $comment = $news->comments()->create([
  105. 'text' => $msg,
  106. 'user_id' => getUser('id'),
  107. 'created_at' => SITETIME,
  108. 'ip' => getIp(),
  109. 'brow' => getBrowser(),
  110. ]);
  111.  
  112. $user = getUser();
  113. $user->increment('allcomments');
  114. $user->increment('point');
  115. $user->increment('money', 5);
  116.  
  117. $news->increment('count_comments');
  118.  
  119. $flood->saveState();
  120. sendNotify($msg, '/news/comment/' . $news->id . '/' . $comment->id, $news->title);
  121.  
  122. setFlash('success', __('main.comment_added_success'));
  123.  
  124. if ($request->has('read')) {
  125. return redirect('news/' . $news->id);
  126. }
  127.  
  128. return redirect('news/end/' . $news->id . '');
  129. }
  130.  
  131. setInput($request->all());
  132. setFlash('danger', $validator->getErrors());
  133. }
  134.  
  135. $comments = $news->comments()
  136. ->orderBy('created_at')
  137. ->with('user')
  138. ->paginate(setting('comments_per_page'));
  139.  
  140. return view('news/comments', compact('news', 'comments'));
  141. }
  142.  
  143. /**
  144. * Редактирование комментария
  145. *
  146. * @param int $id
  147. * @param int $cid
  148. * @param Request $request
  149. * @param Validator $validator
  150. *
  151. * @return View|RedirectResponse
  152. */
  153. public function editComment(int $id, int $cid, Request $request, Validator $validator)
  154. {
  155. $page = int($request->input('page', 1));
  156.  
  157. /** @var News $news */
  158. $news = News::query()->find($id);
  159.  
  160. if (! $news) {
  161. abort(404, __('news.news_not_exist'));
  162. }
  163.  
  164. if (! getUser()) {
  165. abort(403, __('main.not_authorized'));
  166. }
  167.  
  168. /** @var Comment $comment */
  169. $comment = $news->comments()
  170. ->where('id', $cid)
  171. ->where('user_id', getUser('id'))
  172. ->first();
  173.  
  174. if (! $comment) {
  175. abort(200, __('main.comment_deleted'));
  176. }
  177.  
  178. if ($comment->created_at + 600 < SITETIME) {
  179. abort(200, __('main.editing_impossible'));
  180. }
  181.  
  182. if ($request->isMethod('post')) {
  183. $msg = $request->input('msg');
  184.  
  185. $validator
  186. ->equal($request->input('_token'), csrf_token(), __('validator.token'))
  187. ->length($msg, 5, setting('comment_length'), ['msg' => __('validator.text')]);
  188.  
  189. if ($validator->isValid()) {
  190. $msg = antimat($msg);
  191.  
  192. $comment->update([
  193. 'text' => $msg,
  194. ]);
  195.  
  196. setFlash('success', __('main.comment_edited_success'));
  197.  
  198. return redirect('news/comments/' . $news->id . '?page=' . $page);
  199. }
  200.  
  201. setInput($request->all());
  202. setFlash('danger', $validator->getErrors());
  203. }
  204. return view('news/editcomment', compact('news', 'comment', 'page'));
  205. }
  206.  
  207. /**
  208. * Переадресация на последнюю страницу
  209. *
  210. * @param int $id
  211. *
  212. * @return RedirectResponse
  213. */
  214. public function end(int $id): RedirectResponse
  215. {
  216. /** @var News $news */
  217. $news = News::query()->find($id);
  218.  
  219. if (! $news) {
  220. abort(404, __('news.news_not_exist'));
  221. }
  222.  
  223. $end = ceil($news->count_comments / setting('comments_per_page'));
  224.  
  225. return redirect('news/comments/' . $id . '?page=' . $end);
  226. }
  227.  
  228. /**
  229. * Rss новостей
  230. *
  231. * @return View
  232. */
  233. public function rss(): View
  234. {
  235. $newses = News::query()->orderByDesc('created_at')->limit(15)->get();
  236.  
  237. if ($newses->isEmpty()) {
  238. abort(200, __('news.empty_news'));
  239. }
  240.  
  241. return view('news/rss', compact('newses'));
  242. }
  243.  
  244. /**
  245. * Все комментарии
  246. *
  247. * @return View
  248. */
  249. public function allComments(): View
  250. {
  251. $comments = Comment::query()
  252. ->select('comments.*', 'title', 'count_comments')
  253. ->where('relate_type', News::$morphName)
  254. ->leftJoin('news', 'comments.relate_id', 'news.id')
  255. ->orderByDesc('created_at')
  256. ->with('user')
  257. ->paginate(setting('comments_per_page'));
  258.  
  259. return view('news/allcomments', compact('comments'));
  260. }
  261.  
  262. /**
  263. * Переход к сообщению
  264. *
  265. * @param int $id
  266. * @param int $cid
  267. *
  268. * @return RedirectResponse
  269. */
  270. public function viewComment(int $id, int $cid): RedirectResponse
  271. {
  272. /** @var News $news */
  273. $news = News::query()->find($id);
  274.  
  275. if (! $news) {
  276. abort(404, __('news.news_not_exist'));
  277. }
  278.  
  279. $total = $news->comments()
  280. ->where('id', '<=', $cid)
  281. ->orderBy('created_at')
  282. ->count();
  283.  
  284. $end = ceil($total / setting('comments_per_page'));
  285.  
  286. return redirect('news/comments/' . $news->id . '?page=' . $end . '#comment_' . $cid);
  287. }
  288. }