90 lines
2.7 KiB
PHP
90 lines
2.7 KiB
PHP
<?php
|
|
|
|
namespace App\Services;
|
|
|
|
use App\Models\Price;
|
|
use Illuminate\Support\Facades\Cache;
|
|
|
|
class LivePriceCacheService
|
|
{
|
|
public const FULL_RESPONSE_KEY = 'live_price_full_response';
|
|
|
|
public const TTL_SECONDS = 15;
|
|
|
|
public function get(): ?array
|
|
{
|
|
$cached = Cache::get(self::FULL_RESPONSE_KEY);
|
|
if (! is_array($cached) || ! isset($cached['body'], $cached['stored_at'])) {
|
|
return null;
|
|
}
|
|
|
|
if (now()->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;
|
|
}
|
|
}
|