Added Notifications

This commit is contained in:
2026-05-18 14:31:53 +10:00
parent 1d5b9f340f
commit 10b5b6a5c9
18 changed files with 545 additions and 166 deletions
+3
View File
@@ -15,10 +15,12 @@ class Aircraft extends Model
'engine_type',
'engine_count',
'wtc',
'preferred'
];
protected $casts = [
'engine_count' => 'integer',
'preferred' => 'boolean'
];
protected $appends = [
@@ -51,6 +53,7 @@ class Aircraft extends Model
'A380' => ['A380', 'A388'],
];
protected function displayName() : Attribute{
return Attribute::make(
get: function () {
+20
View File
@@ -41,6 +41,26 @@ class User extends Authenticatable
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();
+16
View File
@@ -2,6 +2,7 @@
namespace App\Models;
use Illuminate\Database\Eloquent\Casts\Attribute;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
@@ -26,6 +27,21 @@ class UserAchievement extends Model
'progress' => 'integer',
];
protected $appends = [
'unlocked',
];
protected function unlocked(): Attribute
{
return Attribute::make(
get: function () {
if (!$this->achievement) return false;
if (!$this->achievement->progressive || !$this->achievement->threshold) return true;
return ($this->progress ?? 0) >= $this->achievement->threshold;
}
);
}
// ---------------------------------------------------------------
// Relationships
// ---------------------------------------------------------------