148 lines
3.9 KiB
PHP
148 lines
3.9 KiB
PHP
|
|
<?php
|
||
|
|
|
||
|
|
declare(strict_types=1);
|
||
|
|
|
||
|
|
namespace Modules\RestaurantDelivery\Observers;
|
||
|
|
|
||
|
|
use Illuminate\Support\Facades\Log;
|
||
|
|
use Modules\RestaurantDelivery\Models\Rider;
|
||
|
|
use Modules\RestaurantDelivery\Notifications\RiderWarningNotification;
|
||
|
|
use Modules\RestaurantDelivery\Services\Firebase\FirebaseService;
|
||
|
|
|
||
|
|
class RiderObserver
|
||
|
|
{
|
||
|
|
public function __construct(
|
||
|
|
protected FirebaseService $firebase
|
||
|
|
) {}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Handle the Rider "created" event.
|
||
|
|
*/
|
||
|
|
public function created(Rider $rider): void
|
||
|
|
{
|
||
|
|
Log::info('Rider created', [
|
||
|
|
'rider_id' => $rider->id,
|
||
|
|
'name' => $rider->full_name,
|
||
|
|
]);
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Handle the Rider "updated" event.
|
||
|
|
*/
|
||
|
|
public function updated(Rider $rider): void
|
||
|
|
{
|
||
|
|
// Check if status changed
|
||
|
|
if ($rider->isDirty('status')) {
|
||
|
|
$this->handleStatusChange($rider);
|
||
|
|
}
|
||
|
|
|
||
|
|
// Check if online status changed
|
||
|
|
if ($rider->isDirty('is_online')) {
|
||
|
|
$this->handleOnlineStatusChange($rider);
|
||
|
|
}
|
||
|
|
|
||
|
|
// Check if rating changed
|
||
|
|
if ($rider->isDirty('rating')) {
|
||
|
|
$this->handleRatingChange($rider);
|
||
|
|
}
|
||
|
|
|
||
|
|
// Check if verification status changed
|
||
|
|
if ($rider->isDirty('is_verified')) {
|
||
|
|
$this->handleVerificationChange($rider);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Handle status change.
|
||
|
|
*/
|
||
|
|
protected function handleStatusChange(Rider $rider): void
|
||
|
|
{
|
||
|
|
$originalStatus = $rider->getOriginal('status');
|
||
|
|
|
||
|
|
Log::info('Rider status changed', [
|
||
|
|
'rider_id' => $rider->id,
|
||
|
|
'from' => $originalStatus,
|
||
|
|
'to' => $rider->status,
|
||
|
|
]);
|
||
|
|
|
||
|
|
// Update Firebase
|
||
|
|
if ($this->firebase->isEnabled()) {
|
||
|
|
$this->firebase->updateRiderStatus($rider->id, $rider->status);
|
||
|
|
}
|
||
|
|
|
||
|
|
// Handle suspension
|
||
|
|
if ($rider->status === 'suspended') {
|
||
|
|
Log::warning('Rider suspended', [
|
||
|
|
'rider_id' => $rider->id,
|
||
|
|
]);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Handle online status change.
|
||
|
|
*/
|
||
|
|
protected function handleOnlineStatusChange(Rider $rider): void
|
||
|
|
{
|
||
|
|
Log::info('Rider online status changed', [
|
||
|
|
'rider_id' => $rider->id,
|
||
|
|
'is_online' => $rider->is_online,
|
||
|
|
]);
|
||
|
|
|
||
|
|
// Update Firebase
|
||
|
|
if ($this->firebase->isEnabled()) {
|
||
|
|
$this->firebase->updateRiderStatus(
|
||
|
|
$rider->id,
|
||
|
|
$rider->is_online ? 'online' : 'offline'
|
||
|
|
);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Handle rating change.
|
||
|
|
*/
|
||
|
|
protected function handleRatingChange(Rider $rider): void
|
||
|
|
{
|
||
|
|
$originalRating = $rider->getOriginal('rating');
|
||
|
|
$newRating = $rider->rating;
|
||
|
|
|
||
|
|
Log::info('Rider rating changed', [
|
||
|
|
'rider_id' => $rider->id,
|
||
|
|
'from' => $originalRating,
|
||
|
|
'to' => $newRating,
|
||
|
|
]);
|
||
|
|
|
||
|
|
$thresholds = config('restaurant-delivery.rating.thresholds');
|
||
|
|
$minRatings = $thresholds['minimum_ratings_for_threshold'] ?? 10;
|
||
|
|
|
||
|
|
// Only check thresholds if rider has enough ratings
|
||
|
|
if ($rider->rating_count >= $minRatings) {
|
||
|
|
// Check warning threshold
|
||
|
|
$warningThreshold = $thresholds['warning_threshold'] ?? 3.0;
|
||
|
|
if ($newRating <= $warningThreshold && $originalRating > $warningThreshold) {
|
||
|
|
$rider->notify(new RiderWarningNotification($rider, 'low_rating'));
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Handle verification change.
|
||
|
|
*/
|
||
|
|
protected function handleVerificationChange(Rider $rider): void
|
||
|
|
{
|
||
|
|
Log::info('Rider verification status changed', [
|
||
|
|
'rider_id' => $rider->id,
|
||
|
|
'is_verified' => $rider->is_verified,
|
||
|
|
]);
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Handle the Rider "deleted" event.
|
||
|
|
*/
|
||
|
|
public function deleted(Rider $rider): void
|
||
|
|
{
|
||
|
|
Log::info('Rider deleted', [
|
||
|
|
'rider_id' => $rider->id,
|
||
|
|
]);
|
||
|
|
}
|
||
|
|
}
|