diffInSeconds($cached['stored_at']) > self::TTL_SECONDS) { return null; } return $cached['body']; } public function put(array $body): array { Cache::put(self::FULL_RESPONSE_KEY, [ 'body' => $body, 'stored_at' => now(), ], now()->addSeconds(self::TTL_SECONDS + 5)); app(ProductDisplayPriceService::class)->cacheLivePricePayload($body); return $body; } /** پاسخ سریع بدون API خارجی — از آخرین رکورد prices + تنظیمات */ public function buildFromDatabase(): array { $config = app(ConfigService::class); $display = app(ProductDisplayPriceService::class); $last = Price::orderByDesc('id')->first(); $base = $last ? (int) $last->price : 0; if ($base <= 0) { $payload = [ 'sell' => 0, 'buy' => 0, 'price_last' => 0, 'price' => 0, 'main_product' => 0, 'montzar' => 0, 'zaarbox' => 0, 'closed' => true, 'time' => now(), ]; } else { $diffBuy = (int) $config->displayBuySpreadRial(); $diffSell = (int) $config->displaySellSpreadRial(); $buy = (int) ceil($base + $diffBuy); $sell = max(0, (int) ceil($base - $diffSell)); $payload = [ 'sell' => $sell, 'buy' => $buy, 'price_last' => $buy, 'price' => $base, 'main_product' => 0, 'montzar' => 0, 'zaarbox' => 0, 'closed' => false, 'time' => now(), ]; } $payload['up'] = $config->resolvedDailyBaseExtremes()['up'] > 0 ? [ 'sell' => max(0, (int) ceil($config->resolvedDailyBaseExtremes()['down'] - $config->displaySellSpreadRial())), 'buy' => (int) ceil($config->resolvedDailyBaseExtremes()['up'] + $config->displayBuySpreadRial()), ] : ['sell' => $payload['sell'] ?? 0, 'buy' => $payload['buy'] ?? 0]; $payload['last_historical'] = $display->resolveHistoricalBasePrice(); return $payload; } }