Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
26 changes: 18 additions & 8 deletions app/Http/Controllers/HerdController.php
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
namespace App\Http\Controllers;

use App\Queries\TradingUsersQuery;
use App\Queries\MessagesQuery;
use App\Queries\ElephpantsQuery;
use App\User;
use Illuminate\Support\Facades\Auth;
Expand Down Expand Up @@ -47,19 +48,13 @@ private function prepareTradePossibilities($elephpants, $userElephpants)
}


public function show(string $username, TradingUsersQuery $query)
public function show(string $username, TradingUsersQuery $query, MessagesQuery $mQuery)
{
$user = User::whereUsername($username)->firstOrFail();
$elephpants = $user->elephpants()->orderBy('year', 'desc')->orderBy('name', 'desc')->get();
$userElephpants = $user->elephpantsWithQuantity()->toArray();

$loggedUser = auth()->user();

if ($loggedUser) {
$possibleTrades = $query->fetchAllForUser($loggedUser, $user->id);
} else {
$possibleTrades = null;
}
$possibleTrades = $this->getPossibleTrades($user, $query, $mQuery);

$stats = [
'unique' => $unique = count($userElephpants),
Expand All @@ -69,4 +64,19 @@ public function show(string $username, TradingUsersQuery $query)

return view('herd.show', compact('user', 'elephpants', 'stats', 'possibleTrades'));
}

private function getPossibleTrades(User $user, TradingUsersQuery $query, MessagesQuery $mQuery)
{
$loggedUser = auth()->user();
$possibleTrades = null;

if ($loggedUser) {
$possibleTrades = $query->fetchAllForUser($loggedUser, $user->id);
foreach ($possibleTrades as $tradeUser) {
$tradeUser->messages = $mQuery->getMessagesWithLoggedInUserAndSomeoneElse($tradeUser->id);
}
}

return $possibleTrades;
}
}
10 changes: 10 additions & 0 deletions app/Http/Controllers/MessageController.php
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@
use App\Message;
use App\User;
use Illuminate\Support\Facades\Mail;
use Illuminate\Support\Facades\Auth;
use App\Queries\MessagesQuery;

class MessageController extends Controller
{
Expand All @@ -23,4 +25,12 @@ public function store(MessageRequest $request)

return response()->json(null, 204);
}

public function history(MessagesQuery $query)
{
$interlocutorMessages = $query->getMessagesWithLoggedInUser();
$loggedInUser = Auth::user();

return view('messages.history', compact('interlocutorMessages', 'loggedInUser'));
}
}
18 changes: 15 additions & 3 deletions app/Http/Controllers/TradeController.php
Original file line number Diff line number Diff line change
Expand Up @@ -3,34 +3,46 @@
namespace App\Http\Controllers;

use App\Queries\TradingUsersQuery;
use App\Queries\MessagesQuery;
use App\User;

class TradeController extends Controller
{
public function index(TradingUsersQuery $query)
public function index(TradingUsersQuery $query, MessagesQuery $mQuery)
{
/** @var User $loggedUser */
$loggedUser = auth()->user();
$users = $query->fetchAll($loggedUser);

$this->feedMessages($users, $mQuery);

return view('trade.index', compact('users'));
}

public function senders(int $elephpantId, TradingUsersQuery $query)
public function senders(int $elephpantId, TradingUsersQuery $query, MessagesQuery $mQuery)
{
/** @var User $loggedUser */
$loggedUser = auth()->user();
$users = $query->fetchAllOnlyIfHeHasElephpant($loggedUser, $elephpantId);

$this->feedMessages($users, $mQuery);
return view('trade.index', compact('users'));
}

public function receivers(int $elephpantId, TradingUsersQuery $query)
public function receivers(int $elephpantId, TradingUsersQuery $query, MessagesQuery $mQuery)
{
/** @var User $loggedUser */
$loggedUser = auth()->user();
$users = $query->fetchAllWhoLackElephpant($loggedUser, $elephpantId);
$this->feedMessages($users, $mQuery);

return view('trade.index', compact('users'));
}

private function feedMessages($users, MessagesQuery $mQuery)
{
foreach ($users as $user) {
$user->messages = $mQuery->getMessagesWithLoggedInUserAndSomeoneElse($user->id);
}
}
}
17 changes: 16 additions & 1 deletion app/Message.php
Original file line number Diff line number Diff line change
Expand Up @@ -6,5 +6,20 @@

class Message extends Model
{
protected $fillable = ['receiver_id', 'message'];
protected $fillable = ['receiver_id', 'message', 'sender_id', 'created_at'];

public function sender()
{
return $this->belongsTo(User::class, 'sender_id');
}

public function receiver()
{
return $this->belongsTo(User::class, 'receiver_id');
}

public function interlocutor()
{
return $this->belongsTo(User::class, 'interlocutor_id');
}
}
70 changes: 70 additions & 0 deletions app/Queries/MessagesQuery.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
<?php

declare(strict_types=1);

namespace App\Queries;

use App\Message;
use Illuminate\Database\Eloquent\Collection;

final class MessagesQuery
{
public function getMessagesWithLoggedInUser(): Collection
{
$authUserId = auth()->id();

return $this->getAllQuery()
->where(function ($query) use ($authUserId) {
$query->where('m.sender_id', '=', $authUserId)
->orWhere('m.receiver_id', '=', $authUserId);
})
->orderBy('m.created_at', 'asc')

->get()
->groupBy('interlocutor_id');
}

public function getMessagesWithLoggedInUserAndSomeoneElse(int $userId): Collection
{
$authUserId = auth()->id();

return $this->getAllQuery()
->where(function ($query) use ($authUserId, $userId) {
$query->where('m.sender_id', '=', $authUserId)
->orWhere('m.sender_id', '=', $userId);
})
->where(function ($query) use ($authUserId, $userId) {
$query->where('m.receiver_id', '=', $userId)
->orWhere('m.receiver_id', '=', $authUserId);
})
->orderBy('m.created_at', 'asc')
->get();
}

public function getAllQuery()
{
$authUserId = auth()->id();

return Message::query()
->select([
'm.message',
'm.created_at',
'sender.id as sender_id',
'receiver.id as receiver_id',
'interlocutor.id as interlocutor_id',
])
->with('sender')
->with('receiver')
->with('interlocutor')
->from('messages as m')
->join('users as sender', 'm.sender_id', '=', 'sender.id')
->join('users as receiver', 'm.receiver_id', '=', 'receiver.id')
->join('users as interlocutor', Message::raw("CASE WHEN m.sender_id = {$authUserId} then m.receiver_id else m.sender_id end"), '=', 'interlocutor.id');
}

public function fetchAll(): Collection
{
return $this->getAllQuery()
->get();
}
}
27 changes: 27 additions & 0 deletions public/css/app.css
Original file line number Diff line number Diff line change
Expand Up @@ -13038,3 +13038,30 @@ body {
font-weight: bold;
}

.user-message-container .user-message-username {
background-color: #3e86f9;
color: white;
padding: 0.1em 0.5em;
border-radius: 0.5em;
max-width: 16em;
margin: 0 0.1em;
}

.user-message-container .user-message-timestamp {
background-color: #ccc;
padding: 0.1em 0.5em;
border-radius: 0.5em;
}

.user-message-container .user-message-text {
padding: 0.1em 0.5em;
}

.messages-exchanges-container .messages-exchanges-list {
display: none;
}

.messages-exchanges-container .messages-exchanges-infotext {
line-height: 3em;
}

Loading