jeudi 26 avril 2018

How to display messages received from other users using Laravel

I am working on a messaging functionality on my website between two users and I have managed to make the messaging system work quite alright. But I have a little issue which I can't find a solution to it. I want to be able to show, A list of all message received from other users when the user clicks on this route /conversations. But right now what it does is that it display a list of all users in the users table when I click on the route /conversations which I don't want.

Here are my routes in web

Route::get('/conversations', 'ConversationsController@index')->name('conversations');

Route::get('/conversations/{user}', 'ConversationsController@show')->name('conversations.show');

Route::post('/conversations/{user}', 'ConversationsController@store');

Here is my list of conversations route for index

<div class="contact-edit" id="ci">
 <h3>MEssages</h3>

   @include('conversations.users', ['users'=>$users, 'unread'=>$unread])

</div>

Here is the conversation.users

<div class="col-md-3">

        <div class="list-group">


            @foreach($users as $user)
            <a class = "list-group-item d-flex justify-content-between align-items-center" href="">
                 

                @if(isset($unread[$user->id]))
                    <span class="badge-pill badge-primary"></span>
                @endif

            </a>

            @endforeach


        </div>

Here is my route opening the conversations tab

<a href="">Ecrire un message</a>

Here is my conversation controller

class ConversationsController extends Controller {

private $r;

private $auth;


public function __construct(ConversationRepository $conversationRepository, AuthManager $auth)
{
    $this->r = $conversationRepository;
    $this->middleware('auth');
    $this->auth = $auth;
}



public function index (User $user){

    $me = Auth::user(); 

    //dd(Auth::user());
    return view('conversations/index', [
        'users'=>$this->r->getConversations(Auth::user()->id),
        'unread' => $this->r->unreadCount(Auth::user()->id)

    ]);
}


public function show (User $user){

 $me = Auth::user();   
 $messages = $this->r->getMessagesFor($me->id, $user->id)->paginate(5);
 $unread = $this->r->unreadCount($me->id);

 if (isset($unread[$user->id])) {
     $this->r->readAllFrom($user->id, $me->id);
     unset($unread[$user->id]);
 }

    return view('conversations/show', [
        'users'=>$this->r->getConversations($me->id),
        'user'=>$user,
        'messages'=>$messages,
        'unread' => $unread 
    ]);


}


public function store (User $user, StoreMessageRequest $request){

    $message = $this->r->createMessage(

        $request->get('content'), 
        Auth::user()->id,
        $user->id
    );

    $user->notify(new MessageReceived($message));

    return redirect(route('conversations.show', ['id'=>$user->id]));

}

}

And here is my conversation repository

class ConversationRepository 
   {

private $user;
private $message;

public function __construct(User $user, Message $message)
{
    $this->user = $user;
    $this->message = $message;
}

public function getConversations(int $userId)
{
    $conversations =  $this->user->newQuery()
        ->select('name','surname','photo','id')
        ->where('id', '!=', $userId)
        ->whereType('jobber')
        ->get();

    return $conversations;

}

public function createMessage(string $content, int $from, int $to)
{
    return $this->message->newQuery()->create([

        'content'=>$content,
        'from_id'=>$from,
        'to_id'=>$to,
        'created_at'=>\Carbon\Carbon::now()
    ]);

}

public function getMessagesFor(int $from, int $to) : Builder
{
    return $this->message->newQuery()

        ->whereRaw("((from_id = $from AND to_id = $to )OR(from_id = $to AND to_id = $from))")

        ->orderBy('created_at', 'DESC')

        ->with([

            'from'=> function ($query){ return $query->select('name', 'id');}

        ]);


}


//Recupere le nombre de message non lu pour chaque conversation

public function unreadCount (int $userId)
{

    return $this->message->newQuery()
        ->where('to_id', $userId)
        ->groupBy('from_id')
        ->selectRaw('from_id, COUNT(id) as count')
        ->whereRaw('read_at IS NULL')
        ->get()
        ->pluck('count', 'from_id');
}

Any help will be welcome



via Chebli Mohamed

Aucun commentaire:

Enregistrer un commentaire