62 lines
1.7 KiB
PHP
62 lines
1.7 KiB
PHP
<?php
|
|
|
|
namespace App\Observers;
|
|
|
|
use App\Enums\FlightNotificationType;
|
|
use App\Models\User;
|
|
use App\Models\UserFlight;
|
|
use App\Services\FollowerNotificationService;
|
|
use Illuminate\Support\Facades\Cache;
|
|
|
|
class FlightObserver
|
|
{
|
|
|
|
protected function clearCache(UserFlight $flight): void
|
|
{
|
|
Cache::forget("user_flights_{$flight->user->id}");
|
|
|
|
$flight
|
|
->user
|
|
->followers()
|
|
->get()
|
|
->each(fn ($follower) => Cache::forget("user_following_flights_{$follower->id}"));
|
|
}
|
|
|
|
|
|
/**
|
|
* Recalculate after a flight is created.
|
|
*/
|
|
public function created(UserFlight $flight): void
|
|
{
|
|
$flight->user->calculateAchievements();
|
|
$this->clearCache($flight);
|
|
new FollowerNotificationService()->notifyFlightEvent($flight, FlightNotificationType::forCreation($flight));
|
|
}
|
|
|
|
/**
|
|
* Recalculate after a flight is updated.
|
|
* Cabin class, flight type, airline, etc. may have changed,
|
|
* which could unlock or revoke achievements.
|
|
*/
|
|
public function updated(UserFlight $flight): void
|
|
{
|
|
\Log::info('Observer fired for flight ' . $flight->id);
|
|
$flight->user->calculateAchievements();
|
|
$this->clearCache($flight);
|
|
}
|
|
|
|
/**
|
|
* Recalculate after a flight is deleted.
|
|
* Previously earned achievements may no longer be valid.
|
|
*/
|
|
public function deleted(UserFlight $flight): void
|
|
{
|
|
$flight->user->calculateAchievements();
|
|
$this->clearCache($flight);
|
|
|
|
if ($flight->departure_date->isFuture()) {
|
|
new FollowerNotificationService()->notifyFlightEvent($flight, FlightNotificationType::Cancelled);
|
|
}
|
|
}
|
|
}
|