khanegi setting and prices records
This commit is contained in:
@@ -0,0 +1,89 @@
|
||||
<?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;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user