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

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