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

Размер файла: 7.96Kb
  1. <?php
  2.  
  3. declare(strict_types=1);
  4.  
  5. namespace App\Http\Controllers;
  6.  
  7. use App\Classes\Validator;
  8. use App\Models\Dialogue;
  9. use App\Models\File;
  10. use App\Models\Flood;
  11. use App\Models\Ignore;
  12. use App\Models\Message;
  13. use App\Models\User;
  14. use Illuminate\Http\RedirectResponse;
  15. use Illuminate\Support\Facades\DB;
  16. use Illuminate\Database\Query\JoinClause;
  17. use Illuminate\Http\Request;
  18. use Illuminate\View\View;
  19. use Symfony\Component\HttpFoundation\Response;
  20.  
  21. class MessageController extends Controller
  22. {
  23. /**
  24. * @var User
  25. */
  26. public $user;
  27.  
  28. /**
  29. * Конструктор
  30. */
  31. public function __construct()
  32. {
  33. $this->middleware(function ($request, $next) {
  34. $this->user = getUser();
  35.  
  36. return $next($request);
  37. });
  38. }
  39.  
  40. /**
  41. * Главная страница
  42. *
  43. * @return View
  44. */
  45. public function index(): View
  46. {
  47. $lastMessage = Dialogue::query()
  48. ->select(
  49. 'author_id',
  50. DB::raw('max(message_id) as message_id'),
  51. DB::raw('min(case when reading then 1 else 0 end) as all_reading')
  52. )
  53. ->where('user_id', $this->user->id)
  54. ->groupBy('author_id');
  55.  
  56. $messages = Message::query()
  57. ->select('d.*', 'm.text', 'd2.all_reading', 'd3.reading as recipient_read')
  58. ->from('messages as m')
  59. ->join('dialogues as d', 'd.message_id', 'm.id')
  60. ->joinSub($lastMessage, 'd2', static function (JoinClause $join) {
  61. $join->on('d.message_id', 'd2.message_id');
  62. })
  63. ->leftJoin('dialogues as d3', function ($join) {
  64. $join->on('d.user_id', 'd3.author_id')
  65. ->whereRaw('d.message_id = d3.message_id');
  66. })
  67. ->where('d.user_id', $this->user->id)
  68. ->orderByDesc('d.created_at')
  69. ->with('author')
  70. ->paginate(setting('privatpost'));
  71.  
  72. return view('messages/index', compact('messages'));
  73. }
  74.  
  75. /**
  76. * Диалог
  77. *
  78. * @param string $login
  79. *
  80. * @return View
  81. */
  82. public function talk(string $login): View
  83. {
  84. if (is_numeric($login)) {
  85. $user = new User();
  86. $user->id = $login;
  87. } else {
  88. $user = getUserByLogin($login);
  89.  
  90. if (! $user) {
  91. abort(404, __('validator.user'));
  92. }
  93. }
  94.  
  95. if ($user->id === $this->user->id) {
  96. abort(200, __('messages.empty_dialogue'));
  97. }
  98.  
  99. $messages = Message::query()
  100. ->select('d.*', 'm.id', 'm.text', 'd2.reading as recipient_read')
  101. ->from('messages as m')
  102. ->join('dialogues as d', 'd.message_id', 'm.id')
  103. ->leftJoin('dialogues as d2', function ($join) {
  104. $join->on('d.user_id', 'd2.author_id')
  105. ->whereRaw('d.message_id = d2.message_id');
  106. })
  107. ->where('d.user_id', $this->user->id)
  108. ->where('d.author_id', $user->id)
  109. ->orderByDesc('d.created_at')
  110. ->with('user', 'author')
  111. ->paginate(setting('privatpost'));
  112.  
  113. Dialogue::query()
  114. ->where('user_id', $this->user->id)
  115. ->where('author_id', $user->id)
  116. ->where('reading', 0)
  117. ->update(['reading' => 1]);
  118.  
  119. $files = File::query()
  120. ->where('relate_type', Message::$morphName)
  121. ->where('relate_id', 0)
  122. ->where('user_id', $this->user->id)
  123. ->orderBy('created_at')
  124. ->get();
  125.  
  126. $view = $user->id ? 'messages/talk' : 'messages/talk_system';
  127.  
  128. return view($view, compact('messages', 'user', 'files'));
  129. }
  130.  
  131. /**
  132. * Отправка сообщений
  133. *
  134. * @param Request $request
  135. * @param Validator $validator
  136. * @param Flood $flood
  137. *
  138. * @return RedirectResponse
  139. */
  140. public function send(Request $request, Validator $validator, Flood $flood): RedirectResponse
  141. {
  142. $login = $request->input('user');
  143. $msg = $request->input('msg');
  144.  
  145. $user = getUserByLogin($login);
  146.  
  147. if (! $user) {
  148. abort(404, __('validator.user'));
  149. }
  150.  
  151. $validator->equal($request->input('_token'), csrf_token(), ['msg' => __('validator.token')])
  152. ->length($msg, 5, setting('comment_length'), ['msg' => __('validator.text')])
  153. ->false($flood->isFlood(), ['msg' => __('validator.flood', ['sec' => $flood->getPeriod()])])
  154. ->notEqual($user->id, $this->user->id, __('messages.send_yourself'));
  155.  
  156. if (! captchaVerify() && $this->user->point < setting('privatprotect')) {
  157. $validator->addError(['protect' => __('validator.captcha')]);
  158. }
  159.  
  160. // Проверка на игнор
  161. $ignoring = Ignore::query()
  162. ->where('user_id', $user->id)
  163. ->where('ignore_id', $this->user->id)
  164. ->first();
  165.  
  166. $validator->empty($ignoring, ['user' => __('ignores.you_are_ignoring')]);
  167.  
  168. if ($validator->isValid()) {
  169. $msg = antimat($msg);
  170. $message = $user->sendMessage($this->user, $msg);
  171.  
  172. File::query()
  173. ->where('relate_type', Message::$morphName)
  174. ->where('relate_id', 0)
  175. ->where('user_id', $this->user->id)
  176. ->update(['relate_id' => $message->id]);
  177.  
  178. $flood->saveState();
  179.  
  180. setFlash('success', __('messages.success_sent'));
  181. } else {
  182. setInput($request->all());
  183. setFlash('danger', $validator->getErrors());
  184. }
  185.  
  186. return redirect('messages/talk/' . $user->login);
  187. }
  188.  
  189. /**
  190. * Удаление переписки
  191. *
  192. * @param int $uid
  193. * @param Request $request
  194. * @param Validator $validator
  195. *
  196. * @return RedirectResponse
  197. */
  198. public function delete(int $uid, Request $request, Validator $validator): RedirectResponse
  199. {
  200. $page = int($request->input('page', 1));
  201.  
  202. $total = Dialogue::query()
  203. ->where('user_id', $this->user->id)
  204. ->where('author_id', $uid)
  205. ->count();
  206.  
  207. $validator->equal($request->input('_token'), csrf_token(), __('validator.token'))
  208. ->notEmpty($total, ['user' => __('messages.empty_dialogue')])
  209. ->empty(getUser('newprivat'), __('messages.unread_messages'));
  210.  
  211. if ($validator->isValid()) {
  212. Dialogue::query()
  213. ->where('user_id', getUser('id'))
  214. ->where('author_id', $uid)
  215. ->delete();
  216.  
  217. setFlash('success', __('messages.success_deleted'));
  218. } else {
  219. setFlash('danger', $validator->getErrors());
  220. }
  221.  
  222. return redirect('messages?page=' . $page);
  223. }
  224.  
  225. /**
  226. * New messages
  227. *
  228. * @param Request $request
  229. *
  230. * @return Response
  231. */
  232. public function newMessages(Request $request): Response
  233. {
  234. if (! $request->ajax()) {
  235. return redirect('/');
  236. }
  237.  
  238. $countMessages = Dialogue::query()
  239. ->where('user_id', $this->user->id)
  240. ->where('reading', 0)
  241. ->count();
  242.  
  243. if ($countMessages) {
  244. $dialogues = Dialogue::query()
  245. ->select(
  246. 'author_id',
  247. DB::raw('max(created_at) as last_created_at')
  248. )
  249. ->selectRaw('count(*) as cnt')
  250. ->where('user_id', $this->user->id)
  251. ->where('reading', 0)
  252. ->groupBy('author_id')
  253. ->limit(3)
  254. ->get();
  255.  
  256. if ($dialogues->isNotEmpty()) {
  257. $view = view('messages/_new', compact('dialogues'))->render();
  258.  
  259. return response()->json([
  260. 'success' => true,
  261. 'dialogues' => $view,
  262. 'countMessages' => $countMessages,
  263. ]);
  264. }
  265. }
  266.  
  267. return response()->json(['success' => false]);
  268. }
  269. }