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

Размер файла: 11.81Kb
  1. <?php
  2.  
  3. declare(strict_types=1);
  4.  
  5. namespace App\Http\Controllers;
  6.  
  7. use App\Models\Dialogue;
  8. use App\Models\Forum;
  9. use App\Models\Message;
  10. use App\Models\Post;
  11. use App\Models\Topic;
  12. use App\Models\User;
  13. use Illuminate\Database\Query\JoinClause;
  14. use Illuminate\Http\Request;
  15. use Illuminate\Support\Facades\DB;
  16. use Illuminate\View\View;
  17. use Symfony\Component\HttpFoundation\Response;
  18.  
  19. class ApiController extends Controller
  20. {
  21. /**
  22. * Главная страница
  23. *
  24. * @return View
  25. */
  26. public function index(): View
  27. {
  28. return view('api/index');
  29. }
  30.  
  31. /**
  32. * Api пользователей
  33. *
  34. * @param Request $request
  35. *
  36. * @return Response
  37. */
  38. public function user(Request $request): Response
  39. {
  40. /** @var User $user */
  41. $user = $request->attributes->get('user');
  42.  
  43. return response()->json([
  44. 'success' => true,
  45. 'data' => [
  46. 'login' => $user->login,
  47. 'email' => $user->email,
  48. 'name' => $user->name,
  49. 'level' => $user->level,
  50. 'country' => $user->country,
  51. 'city' => $user->city,
  52. 'language' => $user->language,
  53. 'info' => $user->info,
  54. 'site' => $user->site,
  55. 'phone' => $user->phone,
  56. 'gender' => $user->gender,
  57. 'birthday' => $user->birthday,
  58. 'visits' => $user->visits,
  59. 'allprivat' => $user->getCountMessages(),
  60. 'newprivat' => $user->newprivat,
  61. 'newwall' => $user->newwall,
  62. 'allforum' => $user->allforum,
  63. 'allguest' => $user->allguest,
  64. 'allcomments' => $user->allcomments,
  65. 'themes' => $user->themes,
  66. 'timezone' => $user->timezone,
  67. 'point' => $user->point,
  68. 'money' => $user->money,
  69. 'status' => $user->getStatus()->toHtml(),
  70. 'color' => $user->color,
  71. 'avatar' => $user->avatar ? config('app.url') . $user->avatar : null,
  72. 'picture' => $user->picture ? config('app.url') . $user->picture : null,
  73. 'rating' => $user->rating,
  74. 'lastlogin' => $user->updated_at,
  75. ],
  76. ]);
  77. }
  78.  
  79. /**
  80. * Api пользователей
  81. *
  82. * @param string $login
  83. *
  84. * @return Response
  85. */
  86. public function users(string $login): Response
  87. {
  88. $user = getUserByLogin($login);
  89.  
  90. if (! $user) {
  91. abort(404, __('validator.user'));
  92. }
  93.  
  94. return response()->json([
  95. 'success' => true,
  96. 'data' => [
  97. 'login' => $user->login,
  98. 'name' => $user->name,
  99. 'level' => $user->level,
  100. 'country' => $user->country,
  101. 'city' => $user->city,
  102. 'info' => $user->info,
  103. 'site' => $user->site,
  104. 'gender' => $user->gender,
  105. 'birthday' => $user->birthday,
  106. 'visits' => $user->visits,
  107. 'allforum' => $user->allforum,
  108. 'allguest' => $user->allguest,
  109. 'allcomments' => $user->allcomments,
  110. 'themes' => $user->themes,
  111. 'point' => $user->point,
  112. 'money' => $user->money,
  113. 'status' => $user->getStatus()->toHtml(),
  114. 'color' => $user->color,
  115. 'avatar' => $user->avatar ? config('app.url') . $user->avatar : null,
  116. 'picture' => $user->picture ? config('app.url') . $user->picture : null,
  117. 'rating' => $user->rating,
  118. 'lastlogin' => $user->updated_at,
  119. ],
  120. ]);
  121. }
  122.  
  123. /**
  124. * Api диалогов
  125. *
  126. * @param Request $request
  127. *
  128. * @return Response
  129. */
  130. public function dialogues(Request $request): Response
  131. {
  132. /** @var User $user */
  133. $user = $request->attributes->get('user');
  134.  
  135. $lastMessage = Dialogue::query()
  136. ->select('author_id', DB::raw('max(message_id) as message_id'))
  137. ->where('user_id', $user->id)
  138. ->groupBy('author_id');
  139.  
  140. $dialogues = Message::query()
  141. ->select('d.*', 'm.text')
  142. ->from('messages as m')
  143. ->join('dialogues as d', 'd.message_id', 'm.id')
  144. ->joinSub($lastMessage, 'd2', static function (JoinClause $join) {
  145. $join->on('d.message_id', 'd2.message_id');
  146. })
  147. ->where('d.user_id', $user->id)
  148. ->with('author')
  149. ->orderByDesc('d.created_at')
  150. ->paginate(setting('privatpost'));
  151.  
  152. $messages = [];
  153. foreach ($dialogues as $message) {
  154. $message->text = bbCode($message->text);
  155.  
  156. $messages[] = [
  157. 'id' => $message->id,
  158. 'login' => $message->author->exists ? $message->author->login : null,
  159. 'name' => $message->author_id ? $message->author->getName() : __('messages.system'),
  160. 'text' => $message->text->toHtml(),
  161. 'type' => $message->type,
  162. 'created_at' => $message->created_at,
  163. ];
  164. }
  165.  
  166. return response()->json([
  167. 'success' => true,
  168. 'data' => $messages,
  169. 'links' => [
  170. 'next' => $dialogues->nextPageUrl(),
  171. 'prev' => $dialogues->previousPageUrl(),
  172. ],
  173. 'meta' => [
  174. 'current_page' => $dialogues->currentPage(),
  175. 'last_page' => $dialogues->lastPage(),
  176. 'path' => $dialogues->path(),
  177. 'per_page' => $dialogues->perPage(),
  178. 'total' => $dialogues->total(),
  179. ],
  180. ]);
  181. }
  182.  
  183. /**
  184. * Api приватных сообщений
  185. *
  186. * @param string $login
  187. * @param Request $request
  188. *
  189. * @return Response
  190. */
  191. public function talk(string $login, Request $request): Response
  192. {
  193. /** @var User $user */
  194. $user = $request->attributes->get('user');
  195.  
  196. if (is_numeric($login)) {
  197. $author = new User();
  198. $author->id = $login;
  199. } else {
  200. $author = getUserByLogin($login);
  201.  
  202. if (! $author) {
  203. abort(404, __('validator.user'));
  204. }
  205. }
  206.  
  207. if ($user->id === $author->id) {
  208. abort(200, __('messages.empty_dialogue'));
  209. }
  210.  
  211. Dialogue::query()
  212. ->where('user_id', $user->id)
  213. ->where('author_id', $author->id)
  214. ->where('reading', 0)
  215. ->update(['reading' => 1]);
  216.  
  217. $messages = Message::query()
  218. ->select('d.*', 'm.id', 'm.text')
  219. ->from('messages as m')
  220. ->join('dialogues as d', 'd.message_id', 'm.id')
  221. ->where('d.user_id', $user->id)
  222. ->where('d.author_id', $author->id)
  223. ->orderByDesc('d.created_at')
  224. ->with('user', 'author')
  225. ->paginate(setting('privatpost'));
  226.  
  227. $msg = [];
  228. foreach ($messages as $message) {
  229. $message->text = bbCode($message->text);
  230. $author = $message->type === $message::IN ? $message->author : $message->user;
  231.  
  232. $msg[] = [
  233. 'id' => $message->id,
  234. 'login' => $author->exists ? $author->login : null,
  235. 'name' => $author->exists ? $author->getName() : __('messages.system'),
  236. 'text' => $message->text->toHtml(),
  237. 'type' => $message->type,
  238. 'created_at' => $message->created_at,
  239. ];
  240. }
  241.  
  242. return response()->json([
  243. 'success' => true,
  244. 'data' => $msg,
  245. 'links' => [
  246. 'next' => $messages->nextPageUrl(),
  247. 'prev' => $messages->previousPageUrl(),
  248. ],
  249. 'meta' => [
  250. 'current_page' => $messages->currentPage(),
  251. 'last_page' => $messages->lastPage(),
  252. 'path' => $messages->path(),
  253. 'per_page' => $messages->perPage(),
  254. 'total' => $messages->total(),
  255. ],
  256. ]);
  257. }
  258.  
  259. /**
  260. * Api форума
  261. *
  262. * @param int $id
  263. *
  264. * @return Response
  265. */
  266. public function forums(int $id): Response
  267. {
  268. /** @var Forum $forum */
  269. $forum = Forum::query()->find($id);
  270.  
  271. if (! $forum) {
  272. abort(404, __('forums.forum_not_exist'));
  273. }
  274.  
  275. $topics = Topic::query()
  276. ->where('forum_id', $id)
  277. ->orderBy('created_at')
  278. ->paginate(setting('forumtem'));
  279.  
  280. $data = [];
  281. /** @var Topic $topic */
  282. foreach ($topics as $topic) {
  283. $data[] = [
  284. 'id' => $topic->id,
  285. 'title' => $topic->title,
  286. 'login' => $topic->user->login,
  287. 'closed' => $topic->closed,
  288. 'locked' => $topic->locked,
  289. 'count_posts' => $topic->count_posts,
  290. 'visits' => $topic->visits,
  291. 'moderators' => $topic->moderators,
  292. 'note' => $topic->note,
  293. 'last_post_id' => $topic->last_post_id,
  294. 'close_user_id' => $topic->close_user_id,
  295. 'updated_at' => $topic->updated_at,
  296. 'created_at' => $topic->created_at,
  297. ];
  298. }
  299.  
  300. return response()->json([
  301. 'success' => true,
  302. 'data' => $data,
  303. 'links' => [
  304. 'next' => $topics->nextPageUrl(),
  305. 'prev' => $topics->previousPageUrl(),
  306. ],
  307. 'meta' => [
  308. 'current_page' => $topics->currentPage(),
  309. 'last_page' => $topics->lastPage(),
  310. 'path' => $topics->path(),
  311. 'per_page' => $topics->perPage(),
  312. 'total' => $topics->total(),
  313. ],
  314. ]);
  315. }
  316.  
  317. /**
  318. * Api постов темы в форуме
  319. *
  320. * @param int $id
  321. *
  322. * @return Response
  323. */
  324. public function topics(int $id): Response
  325. {
  326. /** @var Topic $topic */
  327. $topic = Topic::query()->find($id);
  328.  
  329. if (! $topic) {
  330. abort(404, __('forums.topic_not_exist'));
  331. }
  332.  
  333. $posts = Post::query()
  334. ->where('topic_id', $id)
  335. ->orderBy('created_at')
  336. ->paginate(setting('forumpost'));
  337.  
  338. $data = [];
  339. foreach ($posts as $post) {
  340. $post->text = bbCode($post->text);
  341.  
  342. $data[] = [
  343. 'id' => $post->id,
  344. 'login' => $post->user->login,
  345. 'text' => $post->text->toHtml(),
  346. 'rating' => $post->rating,
  347. 'updated_at' => $post->updated_at,
  348. 'created_at' => $post->created_at,
  349. ];
  350. }
  351.  
  352. return response()->json([
  353. 'success' => true,
  354. 'data' => $data,
  355. 'links' => [
  356. 'next' => $posts->nextPageUrl(),
  357. 'prev' => $posts->previousPageUrl(),
  358. ],
  359. 'meta' => [
  360. 'current_page' => $posts->currentPage(),
  361. 'last_page' => $posts->lastPage(),
  362. 'path' => $posts->path(),
  363. 'per_page' => $posts->perPage(),
  364. 'total' => $posts->total(),
  365. ],
  366. ]);
  367. }
  368. }