Вход Регистрация
Файл: app/Http/Controllers/MessageController.php
Строк: 147
<?php

declare(strict_types=1);

namespace 
AppHttpControllers;

use 
AppClassesValidator;
use 
AppModelsDialogue;
use 
AppModelsFile;
use 
AppModelsFlood;
use 
AppModelsMessage;
use 
AppModelsUser;
use 
IlluminateDatabaseQueryJoinClause;
use 
IlluminateHttpRedirectResponse;
use 
IlluminateHttpRequest;
use 
IlluminateSupportFacadesDB;
use 
IlluminateViewView;
use 
SymfonyComponentHttpFoundationResponse;

class 
MessageController extends Controller
{
    public ?
User $user;

    
/**
     * Конструктор
     */
    
public function __construct()
    {
        
$this->middleware(function ($request, $next) {
            
$this->user = $request->user();

            return 
$next($request);
        });
    }

    
/**
     * Главная страница
     */
    
public function index(): View
    
{
        
$lastMessage = Dialogue::query()
            ->
select(
                
'author_id',
                
DB::raw('max(message_id) as message_id'),
                
DB::raw('min(case when reading then 1 else 0 end) as all_reading')
            )
            ->
where('user_id', $this->user->id)
            ->
groupBy('author_id');

        
$messages = Message::query()
            ->
select('d.*', 'm.text', 'd2.all_reading', 'd3.reading as recipient_read')
            ->
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');
            })
            ->
leftJoin('dialogues as d3', function ($join) {
                
$join->on('d.user_id', 'd3.author_id')
                    ->
whereColumn('d.message_id', 'd3.message_id');
            })
            ->
where('d.user_id', $this->user->id)
            ->
with('author')
            ->
orderByDesc('d.created_at')
            ->
paginate(setting('privatpost'));

        return 
view('messages/index', compact('messages'));
    }

    
/**
     * Диалог
     */
    
public function talk(string $login): View
    
{
        if (
is_numeric($login)) {
            
$user = (new User())->setAttribute('id', $login);
        } else {
            
$user = getUserByLogin($login);

            if (! 
$user) {
                
abort(404, __('validator.user'));
            }
        }

        if (
$user->id === $this->user->id) {
            
abort(200, __('messages.empty_dialogue'));
        }

        
$messages = Message::query()
            ->
select('d.*', 'm.id', 'm.text', 'd2.reading as recipient_read')
            ->
from('messages as m')
            ->
join('dialogues as d', 'd.message_id', 'm.id')
            ->
leftJoin('dialogues as d2', function ($join) {
                
$join->on('d.user_id', 'd2.author_id')
                    ->
whereColumn('d.message_id', 'd2.message_id');
            })
            ->
where('d.user_id', $this->user->id)
            ->
where('d.author_id', $user->id)
            ->
orderByDesc('d.created_at')
            ->
with('user', 'author', 'files')
            ->
paginate(setting('privatpost'));

        
Dialogue::query()
            ->
where('user_id', $this->user->id)
            ->
where('author_id', $user->id)
            ->
where('reading', 0)
            ->
update(['reading' => 1]);

        
$files = File::query()
            ->
where('relate_type', Message::$morphName)
            ->
where('relate_id', 0)
            ->
where('user_id', $this->user->id)
            ->
orderBy('created_at')
            ->
get();

        
$countMessages = $this->user->newprivat;
        
$view = $user->id ? 'messages/talk' : 'messages/talk_system';

        return 
view($view, compact('messages', 'user', 'files', 'countMessages'));
    }

    
/**
     * Отправка сообщений
     */
    
public function send(Request $request, Validator $validator, Flood $flood): RedirectResponse
    
{
        
$login = $request->input('user');
        
$msg = $request->input('msg');

        
$user = getUserByLogin($login);

        if (! 
$user) {
            
abort(404, __('validator.user'));
        }

        
$validator
            
->length($msg, setting('comment_text_min'), setting('comment_text_max'), ['msg' => __('validator.text')])
            ->
false($flood->isFlood(), ['msg' => __('validator.flood', ['sec' => $flood->getPeriod()])])
            ->
notEqual($user->id, $this->user->id, __('messages.send_yourself'));

        if (! 
captchaVerify() && $this->user->point < setting('privatprotect')) {
            
$validator->addError(['protect' => __('validator.captcha')]);
        }

        if (
$validator->isValid()) {
            
$msg = antimat($msg);
            
$message = $user->sendMessage($this->user, $msg);

            
File::query()
                ->
where('relate_type', Message::$morphName)
                ->
where('relate_id', 0)
                ->
where('user_id', $this->user->id)
                ->
update(['relate_id' => $message->id]);

            
$flood->saveState();

            return 
redirect('messages/talk/' . $user->login)
                ->
with('success', __('messages.success_sent'));
        }

        return 
redirect('messages/talk/' . $user->login)
            ->
withInput()
            ->
withErrors($validator->getErrors());
    }

    
/**
     * Удаление переписки
     */
    
public function delete(int $uid, Request $request, Validator $validator): RedirectResponse
    
{
        
$page = int($request->input('page', 1));

        
$dialogues = Dialogue::query()
            ->
where('user_id', $this->user->id)
            ->
where('author_id', $uid)
            ->
get();

        
$validator
            
->notEmpty($dialogues->count(), ['user' => __('messages.empty_dialogue')])
            ->
empty(getUser('newprivat'), __('messages.unread_messages'));

        if (! 
$validator->isValid()) {
            return 
redirect('messages?page=' . $page)
                ->
withErrors($validator->getErrors());
        }

        foreach (
$dialogues as $dialogue) {
            
$dialogue->delete();
        }

        return 
redirect('messages?page=' . $page)
            ->
with('success', __('messages.success_deleted'));
    }

    
/**
     * New messages
     */
    
public function newMessages(Request $request): Response
    
{
        if (! 
$request->ajax()) {
            return 
redirect('/');
        }

        
$countMessages = Dialogue::query()
            ->
where('user_id', $this->user->id)
            ->
where('reading', 0)
            ->
count();

        if (
$countMessages) {
            
$dialogues = Dialogue::query()
                ->
select(
                    
'author_id',
                    
DB::raw('max(created_at) as last_created_at')
                )
                ->
selectRaw('count(*) as cnt')
                ->
where('user_id', $this->user->id)
                ->
where('reading', 0)
                ->
with('author')
                ->
groupBy('author_id')
                ->
limit(3)
                ->
get();

            if (
$dialogues->isNotEmpty()) {
                
$view = view('messages/_new', compact('dialogues'))->render();

                return 
response()->json([
                    
'success'       => true,
                    
'dialogues'     => $view,
                    
'countMessages' => $countMessages,
                ]);
            }
        }

        return 
response()->json(['success' => false]);
    }
}
Онлайн: 2
Реклама