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

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