*/ use HasFactory, Notifiable, TwoFactorAuthenticatable; protected static function booted(): void { static::deleting(function (self $user): void { $user->permissionAssignments()->delete(); }); } /** * Get the attributes that should be cast. * * @return array */ protected function casts(): array { return [ 'email_verified_at' => 'datetime', 'password' => 'hashed', 'two_factor_confirmed_at' => 'datetime', ]; } public function permissionAssignments(): MorphMany { return $this->morphMany(PermissionAssignment::class, 'assignee'); } public function teams(): BelongsToMany { return $this->belongsToMany(Team::class) ->withTimestamps(); } public function gitConnections(): HasMany { return $this->hasMany(UserGitConnection::class) ->orderBy('provider') ->orderBy('base_url'); } public function assignedTickets(): HasMany { return $this->hasMany(Ticket::class, 'assignee_user_id'); } public function authoredTickets(): HasMany { return $this->hasMany(Ticket::class, 'author_user_id'); } public function scopeVisibleToProject(Builder $query, Project $project): Builder { $permissionService = app(PermissionService::class); return $query->where(function (Builder $builder) use ($permissionService, $project): void { foreach (User::query()->select('id')->cursor() as $candidate) { if ($permissionService->allows($candidate, \App\Enums\Permission::ProjectRead, $project)) { $builder->orWhereKey($candidate->id); } } }); } }