From f07e56ed7051bea9c84caa60f6399d7f7ca94bf7 Mon Sep 17 00:00:00 2001 From: adonis Date: Sun, 14 Jun 2026 13:15:45 +0330 Subject: [PATCH] fix price --- .../Controllers/Site/ReportController.php | 14 ++++++--- app/Services/LivePriceCacheService.php | 29 +++++++++++++++++-- app/Services/LivePriceTickService.php | 2 ++ routes/api.php | 2 +- 4 files changed, 39 insertions(+), 8 deletions(-) diff --git a/app/Http/Controllers/Site/ReportController.php b/app/Http/Controllers/Site/ReportController.php index 4d289f3..50ae70f 100644 --- a/app/Http/Controllers/Site/ReportController.php +++ b/app/Http/Controllers/Site/ReportController.php @@ -129,7 +129,10 @@ class ReportController extends Controller app(ProductDisplayPriceService::class)->cacheLivePricePayload($payload); if ($saveFullCache || request()->boolean('force_refresh')) { - return app(LivePriceCacheService::class)->put($payload); + $cache = app(LivePriceCacheService::class); + $cache->markTick(); + + return $cache->put($payload); } return $payload; @@ -147,9 +150,12 @@ class ReportController extends Controller return $cached; } - $dbBuilt = $cache->buildFromDatabase(); - if (($dbBuilt['price'] ?? 0) > 0) { - return $cache->put($dbBuilt); + // فقط وقتی کران اخیراً tick زده — وگرنه API زنده (جلوگیری از قفل قیمت) + if ($cache->hasRecentTick()) { + $dbBuilt = $cache->buildFromDatabase(); + if (($dbBuilt['price'] ?? 0) > 0) { + return $cache->put($dbBuilt); + } } } diff --git a/app/Services/LivePriceCacheService.php b/app/Services/LivePriceCacheService.php index 018ec4b..0bdc2fb 100644 --- a/app/Services/LivePriceCacheService.php +++ b/app/Services/LivePriceCacheService.php @@ -9,7 +9,13 @@ class LivePriceCacheService { public const FULL_RESPONSE_KEY = 'live_price_full_response'; - public const TTL_SECONDS = 15; + public const LAST_TICK_KEY = 'live_price_last_tick_at'; + + /** هم‌تراز با کران ۱۰ ثانیه‌ای */ + public const TTL_SECONDS = 10; + + /** اگر tick اخیر نباشد، buildFromDatabase قیمت را قفل می‌کند */ + public const TICK_MAX_AGE_SECONDS = 20; public function get(): ?array { @@ -37,7 +43,22 @@ class LivePriceCacheService return $body; } - /** پاسخ سریع بدون API خارجی — از آخرین رکورد prices + تنظیمات (همان فرمول lastPrice) */ + public function markTick(): void + { + Cache::put(self::LAST_TICK_KEY, now(), now()->addMinutes(10)); + } + + public function hasRecentTick(): bool + { + $lastTick = Cache::get(self::LAST_TICK_KEY); + if ($lastTick === null) { + return false; + } + + return now()->diffInSeconds($lastTick) <= self::TICK_MAX_AGE_SECONDS; + } + + /** پاسخ سریع بدون API خارجی — فقط وقتی کران اخیراً tick زده (همان فرمول lastPrice) */ public function buildFromDatabase(): array { $config = app(ConfigService::class); @@ -66,8 +87,10 @@ class LivePriceCacheService if ($provider === 'montzar') { $liveMontzar = (float) $config->get('montzar_live_price', 0); + if ($liveMontzar > 0) { + $base = $liveMontzar; + } $montzarSource = (int) ($liveMontzar > 0 ? $liveMontzar : $base); - // DB از آخرین tick montzar پر شده — همان فرمول نمایش معامله $priceSource = 'montzar'; } elseif ($provider === 'zaarbox') { $zaarboxSource = (int) $base; diff --git a/app/Services/LivePriceTickService.php b/app/Services/LivePriceTickService.php index 88db7e2..c8bdd8b 100644 --- a/app/Services/LivePriceTickService.php +++ b/app/Services/LivePriceTickService.php @@ -76,6 +76,8 @@ class LivePriceTickService if ($payload !== []) { app(PriceSnapshotService::class)->recordTick($payload); } + + app(LivePriceCacheService::class)->markTick(); } finally { $lock->release(); } diff --git a/routes/api.php b/routes/api.php index ba7c6f3..2498bca 100644 --- a/routes/api.php +++ b/routes/api.php @@ -28,7 +28,7 @@ use App\Http\Controllers\Admin\CategoryController; Route::get('/candle',[ReportController::class, 'candleChart']); Route::get('/price/up',[ReportController::class, 'upDownPrice']); -Route::get('/price/last',[ReportController::class, 'lastPrice']); +Route::match(['get', 'post'],'/price/last',[ReportController::class, 'lastPrice']); Route::get('/price/updatePrise',[ReportController::class, 'updatePrise']); Route::get('/const/key/{key}',[ConstController::class, 'showValue']); Route::get('/check',[ReportController::class, 'check']);