*/ use HasFactory, HasAchievements, HasApiTokens, HasRoles; /** * Get the attributes that should be cast. * * @return array */ protected function casts(): array { return [ 'email_verified_at' => 'datetime', 'password' => 'hashed', ]; } public function achievements(): HasMany { return $this->hasMany(UserAchievement::class); } public function unlockedAchievements(): HasMany { return $this->achievements() ->join('achievements', 'achievements.id', '=', 'user_achievements.achievement_id') ->where(function ($query) { $query // Non-progressive achievements: always count ->where(function ($q) { $q->where('achievements.progressive', false) ->orWhereNull('achievements.progressive'); }) // Progressive achievements: only if progress >= threshold ->orWhere(function ($q) { $q->where('achievements.progressive', true) ->whereNotNull('achievements.threshold') ->whereColumn('user_achievements.progress', '>=', 'achievements.threshold'); }); }); } public function resolveRouteBinding($value, $field = null): ?User { return $this->where('name', 'ilike', $value)->firstOrFail(); } public function FlightController(): UserFlightController { return new UserFlightController($this); } public function flights(): HasMany { return $this->hasMany(UserFlight::class); } public function departedFlights() : HasMany { return $this->flights()->where('departure_date', '<=', now('UTC')); } public function upcomingFlights() : HasMany { return $this->flights()->where('departure_date', '>=', now('UTC')); } public function ImportedFlights(): HasMany { return $this->hasMany(ImportedFlight::class); } public function following(): HasMany { return $this->hasMany(Followee::class, 'user_id'); } public function followers(): HasMany { return $this->hasMany(Followee::class, 'followee_id'); } public function isFollowing(User $user): bool { return $this->following()->where('followee_id', $user->id)->exists(); } public function notifications(): HasMany { return $this->hasMany(Notification::class); } }