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; $provider = $config->priceProvider(); $montzarPrice = 0; $zaarboxPrice = 0; $mainProductPrice = 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(); $openBuy = true; $openSell = true; if ($provider === 'montzar') { $montzarPrice = $config->getInt('montzar_live_price', 0) ?: $base; $montzarDiff = (int) $config->getInt('montzar_diff', 0); $diffBuy += $montzarDiff; $diffSell += $montzarDiff; $openBuy = $config->getBool('montzar_open_buy', true); $openSell = $config->getBool('montzar_open_sell', true); } elseif ($provider === 'zaarbox') { $zaarboxPrice = $base; } elseif ($provider === 'main_product') { $mainProductPrice = $base; } $buy = $openBuy ? (int) ceil($base + $diffBuy) : 0; $sell = $openSell ? max(0, (int) ceil($base - $diffSell)) : 0; $payload = [ 'sell' => $sell, 'buy' => $buy, 'price_last' => $buy, 'price' => $base, 'main_product' => $mainProductPrice, 'montzar' => $montzarPrice, 'zaarbox' => $zaarboxPrice, '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(); $display->cacheLivePricePayload($payload); return $payload; } }