Skip to content

Commit 4a04ed0

Browse files
committed
support last_read_message_id
1 parent a3e6a24 commit 4a04ed0

File tree

4 files changed

+41
-5
lines changed

4 files changed

+41
-5
lines changed

src/Concerns/ParticipateToConversations.php renamed to src/Concerns/HasConversationsTrait.php

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,11 @@
1919
* @property Collection<int, TConversation> $conversations
2020
* @property Collection<int, TMessage> $messages
2121
* @property ?TMessage $latestMessage
22+
* @property ?TConversationUser $conversationUser Conversation Pivot
2223
*/
23-
trait ParticipateToConversations
24+
trait HasConversationsTrait
2425
{
25-
protected static function bootParticipateToConversations(): void
26+
protected static function bootHasConversationsTrait(): void
2627
{
2728
static::deleting(function ($model) {
2829
$model->conversations()->detach();
@@ -63,6 +64,7 @@ public static function getModelMessage(): string
6364
public function conversations(): BelongsToMany
6465
{
6566
return $this->belongsToMany(static::getModelConversation())
67+
->as('conversationUser')
6668
->using(static::getModelConversationUser())
6769
->withPivot(['id', 'last_read_message_id', 'muted_at', 'archived_at', 'conversation_id', 'user_id', 'metadata'])
6870
->withTimestamps();

src/Conversation.php

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,11 +32,12 @@
3232
* @property ?Model $conversationable
3333
* @property Collection<int, TUser> $users
3434
* @property Collection<int, TMessage> $messages
35-
* @property ?TMessage $denormalizedLatestMessage
3635
* @property ?TMessage $latestMessage
3736
* @property ?TMessage $oldestMessage
37+
* @property ?TConversationUser $conversationUser User Pivot
3838
* @property ?Carbon $messaged_at
3939
* @property ?int $latest_message_id
40+
* @property ?TMessage $denormalizedLatestMessage
4041
* @property Carbon $updated_at
4142
* @property Carbon $created_at
4243
*/
@@ -108,6 +109,7 @@ public function conversationable(): MorphTo
108109
public function users(): BelongsToMany
109110
{
110111
return $this->belongsToMany(static::getModelUser())
112+
->as('conversationUser')
111113
->using(static::getModelConversationUser())
112114
->withPivot(['id', 'last_read_message_id', 'muted_at', 'archived_at', 'conversation_id', 'user_id', 'metadata'])
113115
->withTimestamps();
@@ -167,6 +169,27 @@ public function send(Message $message): static
167169
return $this;
168170
}
169171

172+
/**
173+
* Update `last_read_message_id` pivot value
174+
*/
175+
public function markAsDenormalizedReadBy(User|int $user): static
176+
{
177+
/** @var int $userId */
178+
$userId = $user instanceof User ? $user->getKey() : $user;
179+
180+
/** @var ?ConversationUser $pivot */
181+
// @phpstan-ignore-next-line
182+
$pivot = $this->users->find($userId)?->conversationUser;
183+
184+
if ($pivot) {
185+
$pivot
186+
->markAsDenormalizedRead($this->latest_message_id)
187+
->save();
188+
}
189+
190+
return $this;
191+
}
192+
170193
public function scopeUnread(Builder $query, User|int $user): void
171194
{
172195
$userId = $user instanceof User ? $user->getKey() : $user;

src/ConversationUser.php

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,4 +29,15 @@ class ConversationUser extends Pivot
2929
'archived_at' => 'datetime',
3030
'metadata' => AsArrayObject::class,
3131
];
32+
33+
public function markAsDenormalizedRead(Message|int $message): static
34+
{
35+
$messageId = $message instanceof Message ? $message->id : $message;
36+
37+
if ($messageId > $this->last_read_message_id) {
38+
$this->last_read_message_id = $messageId;
39+
}
40+
41+
return $this;
42+
}
3243
}

tests/Models/User.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,12 @@
44

55
namespace Elegantly\Conversation\Tests\Models;
66

7-
use Elegantly\Conversation\Concerns\ParticipateToConversations;
7+
use Elegantly\Conversation\Concerns\HasConversationsTrait;
88
use Illuminate\Foundation\Auth\User as Authentificate;
99

1010
class User extends Authentificate
1111
{
12-
use ParticipateToConversations;
12+
use HasConversationsTrait;
1313

1414
protected $table = 'users';
1515
}

0 commit comments

Comments
 (0)