|
|
|
<?php
|
|
|
|
|
|
|
|
namespace App\Models;
|
|
|
|
|
|
|
|
use AdamWathan\EloquentOAuth\OAuthIdentity;
|
|
|
|
use App\Models\Concerns\Reportable;
|
|
|
|
use Illuminate\Database\Eloquent\Collection;
|
|
|
|
use Illuminate\Database\Eloquent\Relations\HasMany;
|
|
|
|
use Illuminate\Database\Eloquent\Relations\MorphMany;
|
|
|
|
use Illuminate\Notifications\Notifiable;
|
|
|
|
use Illuminate\Foundation\Auth\User as Authenticatable;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* A user in the application
|
|
|
|
*
|
|
|
|
* @property Proposal[]|Collection $proposals
|
|
|
|
*/
|
|
|
|
class User extends Authenticatable
|
|
|
|
{
|
|
|
|
use Reportable;
|
|
|
|
use Notifiable;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* The attributes that are mass assignable.
|
|
|
|
*
|
|
|
|
* @var array
|
|
|
|
*/
|
|
|
|
protected $fillable = [
|
|
|
|
'name', 'email', 'password',
|
|
|
|
];
|
|
|
|
|
|
|
|
/**
|
|
|
|
* The attributes that should be hidden for arrays.
|
|
|
|
*
|
|
|
|
* @var array
|
|
|
|
*/
|
|
|
|
protected $hidden = [
|
|
|
|
'password', 'remember_token',
|
|
|
|
];
|
|
|
|
|
|
|
|
protected static function boot()
|
|
|
|
{
|
|
|
|
parent::boot();
|
|
|
|
|
|
|
|
static::deleting(function(User $self) {
|
|
|
|
// manually delete proposals to ensure row refcounts are updated
|
|
|
|
foreach ($self->proposals as $proposal) {
|
|
|
|
$proposal->delete();
|
|
|
|
}
|
|
|
|
|
|
|
|
$self->notificationsCaused()->delete();
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
/** Owned tables */
|
|
|
|
public function dataTables()
|
|
|
|
{
|
|
|
|
return $this->hasMany(Table::class, 'owner_id');
|
|
|
|
}
|
|
|
|
|
|
|
|
/** Assigned OAuth identities */
|
|
|
|
public function socialIdentities()
|
|
|
|
{
|
|
|
|
return $this->hasMany(OAuthIdentity::class);
|
|
|
|
}
|
|
|
|
|
|
|
|
/** Authored proposals */
|
|
|
|
public function proposals()
|
|
|
|
{
|
|
|
|
return $this->hasMany(Proposal::class, 'author_id');
|
|
|
|
}
|
|
|
|
|
|
|
|
/** Authored comments */
|
|
|
|
public function tableComments()
|
|
|
|
{
|
|
|
|
return $this->hasMany(TableComment::class, 'author_id');
|
|
|
|
}
|
|
|
|
|
|
|
|
/** User's favourite tables (personal collection) */
|
|
|
|
public function favouriteTables()
|
|
|
|
{
|
|
|
|
return $this->belongsToMany(Table::class, 'table_favourites');
|
|
|
|
}
|
|
|
|
|
|
|
|
/** Tables whose discussions user follows (this is similar to favourites) */
|
|
|
|
public function followedDiscussions()
|
|
|
|
{
|
|
|
|
return $this->belongsToMany(Table::class, 'discussion_follows');
|
|
|
|
}
|
|
|
|
|
|
|
|
/** Reports sent by this user */
|
|
|
|
public function authoredReports()
|
|
|
|
{
|
|
|
|
return $this->hasMany(ContentReport::class, 'author_id');
|
|
|
|
}
|
|
|
|
|
|
|
|
/** Notifications for this user */
|
|
|
|
public function notifications()
|
|
|
|
{
|
|
|
|
return $this->hasMany(Notification::class);
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Notifications caused by this user
|
|
|
|
*
|
|
|
|
* @return HasMany
|
|
|
|
*/
|
|
|
|
public function notificationsCaused()
|
|
|
|
{
|
|
|
|
return $this->hasMany(Notification::class, 'actor_id');
|
|
|
|
}
|
|
|
|
|
|
|
|
// --------- Relation Helpers ---------
|
|
|
|
|
|
|
|
public function addFavourite(Table $table)
|
|
|
|
{
|
|
|
|
$this->favouriteTables()->attach($table);
|
|
|
|
}
|
|
|
|
|
|
|
|
public function removeFavourite(Table $table)
|
|
|
|
{
|
|
|
|
$this->favouriteTables()->detach($table);
|
|
|
|
}
|
|
|
|
|
|
|
|
public function followDiscussion(Table $table)
|
|
|
|
{
|
|
|
|
$this->followedDiscussions()->attach($table);
|
|
|
|
}
|
|
|
|
|
|
|
|
public function unfollowDiscussion(Table $table)
|
|
|
|
{
|
|
|
|
$this->followedDiscussions()->detach($table);
|
|
|
|
}
|
|
|
|
}
|