*/ use HasFactory; public const string TypeDirect = 'direct'; public const string TypeGroup = 'group'; /** * @return BelongsTo */ public function creator(): BelongsTo { return $this->belongsTo(User::class, 'created_by_id'); } /** * @return HasMany */ public function participants(): HasMany { return $this->hasMany(ConversationParticipant::class); } /** * @return BelongsToMany */ public function users(): BelongsToMany { return $this->belongsToMany(User::class, 'conversation_participants') ->withPivot(['role', 'joined_at', 'last_read_at', 'muted_until']) ->withTimestamps(); } /** * @return HasMany */ public function messages(): HasMany { return $this->hasMany(Message::class); } /** * @return HasOne */ public function latestMessage(): HasOne { return $this->hasOne(Message::class)->latestOfMany(); } /** * @param Builder $query * @return Builder */ public function scopeForUser(Builder $query, User|int $user): Builder { $userId = $user instanceof User ? $user->id : $user; return $query->whereHas('participants', fn (Builder $participants) => $participants ->where('user_id', $userId)); } public function isGroup(): bool { return $this->type === self::TypeGroup; } }