<?php
declare(strict_types=1);
namespace App\Http\Controllers;
use App\Models\Dialogue;
use App\Models\Forum;
use App\Models\Message;
use App\Models\Post;
use App\Models\Topic;
use App\Models\User;
use Illuminate\Database\Query\JoinClause;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Illuminate\View\View;
use Symfony\Component\HttpFoundation\Response;
class ApiController extends Controller
{
/**
* Главная страница
*
* @return View
*/
public function index(): View
{
return view('api/index');
}
/**
* Api пользователей
*
* @param Request $request
*
* @return Response
*/
public function user(Request $request): Response
{
/** @var User $user */
$user = $request->attributes->get('user');
return response()->json([
'success' => true,
'data' => [
'login' => $user->login,
'email' => $user->email,
'name' => $user->name,
'level' => $user->level,
'country' => $user->country,
'city' => $user->city,
'language' => $user->language,
'info' => $user->info,
'site' => $user->site,
'phone' => $user->phone,
'gender' => $user->gender,
'birthday' => $user->birthday,
'visits' => $user->visits,
'allprivat' => $user->getCountMessages(),
'newprivat' => $user->newprivat,
'newwall' => $user->newwall,
'allforum' => $user->allforum,
'allguest' => $user->allguest,
'allcomments' => $user->allcomments,
'themes' => $user->themes,
'timezone' => $user->timezone,
'point' => $user->point,
'money' => $user->money,
'status' => $user->getStatus()->toHtml(),
'color' => $user->color,
'avatar' => $user->avatar ? config('app.url') . $user->avatar : null,
'picture' => $user->picture ? config('app.url') . $user->picture : null,
'rating' => $user->rating,
'lastlogin' => $user->updated_at,
],
]);
}
/**
* Api пользователей
*
* @param string $login
*
* @return Response
*/
public function users(string $login): Response
{
$user = getUserByLogin($login);
if (! $user) {
abort(404, __('validator.user'));
}
return response()->json([
'success' => true,
'data' => [
'login' => $user->login,
'name' => $user->name,
'level' => $user->level,
'country' => $user->country,
'city' => $user->city,
'info' => $user->info,
'site' => $user->site,
'gender' => $user->gender,
'birthday' => $user->birthday,
'visits' => $user->visits,
'allforum' => $user->allforum,
'allguest' => $user->allguest,
'allcomments' => $user->allcomments,
'themes' => $user->themes,
'point' => $user->point,
'money' => $user->money,
'status' => $user->getStatus()->toHtml(),
'color' => $user->color,
'avatar' => $user->avatar ? config('app.url') . $user->avatar : null,
'picture' => $user->picture ? config('app.url') . $user->picture : null,
'rating' => $user->rating,
'lastlogin' => $user->updated_at,
],
]);
}
/**
* Api диалогов
*
* @param Request $request
*
* @return Response
*/
public function dialogues(Request $request): Response
{
/** @var User $user */
$user = $request->attributes->get('user');
$lastMessage = Dialogue::query()
->select('author_id', DB::raw('max(message_id) as message_id'))
->where('user_id', $user->id)
->groupBy('author_id');
$dialogues = Message::query()
->select('d.*', 'm.text')
->from('messages as m')
->join('dialogues as d', 'd.message_id', 'm.id')
->joinSub($lastMessage, 'd2', static function (JoinClause $join) {
$join->on('d.message_id', 'd2.message_id');
})
->where('d.user_id', $user->id)
->with('author')
->orderByDesc('d.created_at')
->paginate(setting('privatpost'));
$messages = [];
foreach ($dialogues as $message) {
$message->text = bbCode($message->text);
$messages[] = [
'id' => $message->id,
'login' => $message->author->exists ? $message->author->login : null,
'name' => $message->author_id ? $message->author->getName() : __('messages.system'),
'text' => $message->text->toHtml(),
'type' => $message->type,
'created_at' => $message->created_at,
];
}
return response()->json([
'success' => true,
'data' => $messages,
'links' => [
'next' => $dialogues->nextPageUrl(),
'prev' => $dialogues->previousPageUrl(),
],
'meta' => [
'current_page' => $dialogues->currentPage(),
'last_page' => $dialogues->lastPage(),
'path' => $dialogues->path(),
'per_page' => $dialogues->perPage(),
'total' => $dialogues->total(),
],
]);
}
/**
* Api приватных сообщений
*
* @param string $login
* @param Request $request
*
* @return Response
*/
public function talk(string $login, Request $request): Response
{
/** @var User $user */
$user = $request->attributes->get('user');
if (is_numeric($login)) {
$author = new User();
$author->id = $login;
} else {
$author = getUserByLogin($login);
if (! $author) {
abort(404, __('validator.user'));
}
}
if ($user->id === $author->id) {
abort(200, __('messages.empty_dialogue'));
}
Dialogue::query()
->where('user_id', $user->id)
->where('author_id', $author->id)
->where('reading', 0)
->update(['reading' => 1]);
$messages = Message::query()
->select('d.*', 'm.id', 'm.text')
->from('messages as m')
->join('dialogues as d', 'd.message_id', 'm.id')
->where('d.user_id', $user->id)
->where('d.author_id', $author->id)
->orderByDesc('d.created_at')
->with('user', 'author')
->paginate(setting('privatpost'));
$msg = [];
foreach ($messages as $message) {
$message->text = bbCode($message->text);
$author = $message->type === $message::IN ? $message->author : $message->user;
$msg[] = [
'id' => $message->id,
'login' => $author->exists ? $author->login : null,
'name' => $author->exists ? $author->getName() : __('messages.system'),
'text' => $message->text->toHtml(),
'type' => $message->type,
'created_at' => $message->created_at,
];
}
return response()->json([
'success' => true,
'data' => $msg,
'links' => [
'next' => $messages->nextPageUrl(),
'prev' => $messages->previousPageUrl(),
],
'meta' => [
'current_page' => $messages->currentPage(),
'last_page' => $messages->lastPage(),
'path' => $messages->path(),
'per_page' => $messages->perPage(),
'total' => $messages->total(),
],
]);
}
/**
* Api форума
*
* @param int $id
*
* @return Response
*/
public function forums(int $id): Response
{
/** @var Forum $forum */
$forum = Forum::query()->find($id);
if (! $forum) {
abort(404, __('forums.forum_not_exist'));
}
$topics = Topic::query()
->where('forum_id', $id)
->orderBy('created_at')
->paginate(setting('forumtem'));
$data = [];
/** @var Topic $topic */
foreach ($topics as $topic) {
$data[] = [
'id' => $topic->id,
'title' => $topic->title,
'login' => $topic->user->login,
'closed' => $topic->closed,
'locked' => $topic->locked,
'count_posts' => $topic->count_posts,
'visits' => $topic->visits,
'moderators' => $topic->moderators,
'note' => $topic->note,
'last_post_id' => $topic->last_post_id,
'close_user_id' => $topic->close_user_id,
'updated_at' => $topic->updated_at,
'created_at' => $topic->created_at,
];
}
return response()->json([
'success' => true,
'data' => $data,
'links' => [
'next' => $topics->nextPageUrl(),
'prev' => $topics->previousPageUrl(),
],
'meta' => [
'current_page' => $topics->currentPage(),
'last_page' => $topics->lastPage(),
'path' => $topics->path(),
'per_page' => $topics->perPage(),
'total' => $topics->total(),
],
]);
}
/**
* Api постов темы в форуме
*
* @param int $id
*
* @return Response
*/
public function topics(int $id): Response
{
/** @var Topic $topic */
$topic = Topic::query()->find($id);
if (! $topic) {
abort(404, __('forums.topic_not_exist'));
}
$posts = Post::query()
->where('topic_id', $id)
->orderBy('created_at')
->paginate(setting('forumpost'));
$data = [];
foreach ($posts as $post) {
$post->text = bbCode($post->text);
$data[] = [
'id' => $post->id,
'login' => $post->user->login,
'text' => $post->text->toHtml(),
'rating' => $post->rating,
'updated_at' => $post->updated_at,
'created_at' => $post->created_at,
];
}
return response()->json([
'success' => true,
'data' => $data,
'links' => [
'next' => $posts->nextPageUrl(),
'prev' => $posts->previousPageUrl(),
],
'meta' => [
'current_page' => $posts->currentPage(),
'last_page' => $posts->lastPage(),
'path' => $posts->path(),
'per_page' => $posts->perPage(),
'total' => $posts->total(),
],
]);
}
}