. */ declare(strict_types=1); namespace FireflyIII; use FireflyIII\Events\RequestedNewPassword; use FireflyIII\Models\CurrencyExchangeRate; use Illuminate\Database\Eloquent\Relations\BelongsToMany; use Illuminate\Database\Eloquent\Relations\HasMany; use Illuminate\Database\Eloquent\Relations\HasManyThrough; use Illuminate\Database\QueryException; use Illuminate\Foundation\Auth\User as Authenticatable; use Illuminate\Notifications\Notifiable; use Log; use Request; /** * Class User. */ class User extends Authenticatable { use Notifiable; /** * The attributes that are mass assignable. * * @var array */ protected $fillable = ['email', 'password', 'blocked', 'blocked_code']; /** * The attributes excluded from the model's JSON form. * * @var array */ protected $hidden = ['password', 'remember_token']; /** * The database table used by the model. * * @var string */ protected $table = 'users'; /** * @codeCoverageIgnore * Link to accounts. * * @return HasMany */ public function accounts(): HasMany { return $this->hasMany('FireflyIII\Models\Account'); } /** * Alias to eloquent many-to-many relation's attach() method. * * Full credit goes to: https://github.com/Zizaco/entrust * * @param mixed $role */ public function attachRole($role) { if (is_object($role)) { $role = $role->getKey(); } if (is_array($role)) { $role = $role['id']; } try { $this->roles()->attach($role); } catch (QueryException $e) { // don't care Log::info(sprintf('Query exception when giving user a role: %s', $e->getMessage())); } } /** * @codeCoverageIgnore * Link to attachments * * @return HasMany */ public function attachments(): HasMany { return $this->hasMany('FireflyIII\Models\Attachment'); } /** * @codeCoverageIgnore * Link to available budgets * * @return HasMany */ public function availableBudgets(): HasMany { return $this->hasMany('FireflyIII\Models\AvailableBudget'); } /** * @codeCoverageIgnore * Link to bills. * * @return HasMany */ public function bills(): HasMany { return $this->hasMany('FireflyIII\Models\Bill'); } /** * @codeCoverageIgnore * Link to budgets. * * @return HasMany */ public function budgets(): HasMany { return $this->hasMany('FireflyIII\Models\Budget'); } /** * @codeCoverageIgnore * Link to categories * * @return HasMany */ public function categories(): HasMany { return $this->hasMany('FireflyIII\Models\Category'); } /** * @codeCoverageIgnore * Link to currency exchange rates * * @return HasMany */ public function currencyExchangeRates(): HasMany { return $this->hasMany(CurrencyExchangeRate::class); } /** * @codeCoverageIgnore * Link to export jobs * * @return HasMany */ public function exportJobs(): HasMany { return $this->hasMany('FireflyIII\Models\ExportJob'); } /** * @codeCoverageIgnore * Generates access token. * * @return string */ public function generateAccessToken(): string { $bytes = random_bytes(16); return strval(bin2hex($bytes)); } /** * @codeCoverageIgnore * Checks if the user has a role by its name. * * Full credit goes to: https://github.com/Zizaco/entrust * * @param string $name * * @return bool */ public function hasRole(string $name): bool { foreach ($this->roles as $role) { if ($role->name === $name) { return true; } } return false; } /** * @codeCoverageIgnore * Link to import jobs. * * @return HasMany */ public function importJobs(): HasMany { return $this->hasMany('FireflyIII\Models\ImportJob'); } /** * @codeCoverageIgnore * Link to piggy banks. * * @return HasManyThrough */ public function piggyBanks(): HasManyThrough { return $this->hasManyThrough('FireflyIII\Models\PiggyBank', 'FireflyIII\Models\Account'); } /** * @codeCoverageIgnore * Link to preferences. * * @return HasMany */ public function preferences(): HasMany { return $this->hasMany('FireflyIII\Models\Preference'); } /** * @codeCoverageIgnore * Link to roles. * * @return \Illuminate\Database\Eloquent\Relations\BelongsToMany */ public function roles(): BelongsToMany { return $this->belongsToMany('FireflyIII\Models\Role'); } /** * @codeCoverageIgnore * Link to rule groups. * * @return HasMany */ public function ruleGroups(): HasMany { return $this->hasMany('FireflyIII\Models\RuleGroup'); } /** * @codeCoverageIgnore * Link to rules. * * @return HasMany */ public function rules(): HasMany { return $this->hasMany('FireflyIII\Models\Rule'); } /** * @codeCoverageIgnore * Send the password reset notification. * * @param string $token */ public function sendPasswordResetNotification($token) { $ipAddress = Request::ip(); event(new RequestedNewPassword($this, $token, $ipAddress)); } /** * @codeCoverageIgnore * Link to tags. * * @return HasMany */ public function tags(): HasMany { return $this->hasMany('FireflyIII\Models\Tag'); } /** * @codeCoverageIgnore * Link to transaction journals. * * @return HasMany */ public function transactionJournals(): HasMany { return $this->hasMany('FireflyIII\Models\TransactionJournal'); } /** * @codeCoverageIgnore * Link to transactions. * * @return HasManyThrough */ public function transactions(): HasManyThrough { return $this->hasManyThrough('FireflyIII\Models\Transaction', 'FireflyIII\Models\TransactionJournal'); } }