belongsToMany(Mod::class); } /** * The data that is searchable by Scout. */ public function toSearchableArray(): array { return [ 'id' => (int) $this->id, 'name' => $this->name, ]; } /** * Determine if the model instance should be searchable. */ public function shouldBeSearchable(): bool { return ! is_null($this->email_verified_at); } /** * Check if the user has the role of a moderator. */ public function isMod(): bool { return Str::lower($this->role?->name) === 'moderator'; } /** * Check if the user has the role of an administrator. */ public function isAdmin(): bool { return Str::lower($this->role?->name) === 'administrator'; } /** * Overwritten to instead use the queued version of the VerifyEmail notification. */ public function sendEmailVerificationNotification(): void { $this->notify(new VerifyEmail); } /** * Overwritten to instead use the queued version of the ResetPassword notification. */ public function sendPasswordResetNotification(#[\SensitiveParameter] $token): void { $this->notify(new ResetPassword($token)); } /** * Get the relative URL to the user's profile page. */ public function profileUrl(): string { return route('user.show', [ 'user' => $this->id, 'username' => $this->slug(), ]); } /** * Get the slug of the user's name. */ public function slug(): string { return Str::lower(Str::slug($this->name)); } /** * Assign a role to the user. */ public function assignRole(UserRole $role): bool { $this->role()->associate($role); return $this->save(); } /** * The relationship between a user and their role. */ public function role(): BelongsTo { return $this->belongsTo(UserRole::class, 'user_role_id'); } /** * The attributes that should be cast to native types. */ protected function casts(): array { return [ 'email_verified_at' => 'datetime', 'password' => 'hashed', ]; } /** * Get the disk that profile photos should be stored on. */ protected function profilePhotoDisk(): string { return match (config('app.env')) { 'production' => 'r2', // Cloudflare R2 Storage default => 'public', // Local }; } }