Files
kulakpos_web/public/restaurant/Modules/RestaurantDelivery/app/Observers/RiderObserver.php

148 lines
3.9 KiB
PHP
Raw Normal View History

2026-03-15 17:08:23 +07:00
<?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,
]);
}
}