|null $lastPayload */ public function broadcastAfterPriceUpdate(?array $lastPayload = null, bool $force = false): void { $stream = app(PriceStreamService::class); if (! $stream->isEnabled()) { return; } if ($lastPayload === null) { $cache = app(LivePriceCacheService::class); $lastPayload = $cache->get() ?? $cache->buildFromDatabase(); } if ($force) { if (is_array($lastPayload) && $lastPayload !== []) { $stream->publish('last', $lastPayload); } $listPayload = $this->buildProductListPayload(); if ($listPayload !== null) { $stream->publish('list', $listPayload); } return; } $lastChanged = is_array($lastPayload) && $lastPayload !== [] && $this->rememberHashIfChanged(self::LAST_HASH_KEY, $lastPayload); $this->publishListIfChanged(); if ($lastChanged && is_array($lastPayload)) { $stream->publish('last', $lastPayload); } } public function broadcastLastIfChanged(?array $lastPayload): void { $stream = app(PriceStreamService::class); if (! $stream->isEnabled()) { return; } if (! is_array($lastPayload) || $lastPayload === []) { return; } if (! $this->rememberHashIfChanged(self::LAST_HASH_KEY, $lastPayload)) { return; } $stream->publish('last', $lastPayload); } public function broadcastListIfChanged(): bool { $stream = app(PriceStreamService::class); if (! $stream->isEnabled()) { return false; } return $this->publishListIfChanged(); } private function publishListIfChanged(): bool { $listPayload = $this->buildProductListPayload(); if ($listPayload === null) { return false; } if (! $this->rememberHashIfChanged(self::LIST_HASH_KEY, $listPayload)) { return false; } app(PriceStreamService::class)->publish('list', $listPayload); return true; } /** * @param array|array $payload */ private function rememberHashIfChanged(string $cacheKey, array $payload): bool { $hash = md5(json_encode($payload, JSON_UNESCAPED_UNICODE)); if (Cache::get($cacheKey) === $hash) { return false; } Cache::put($cacheKey, $hash, now()->addHour()); return true; } /** * @return array|null */ private function buildProductListPayload(): ?array { $request = Request::create('/customer/product/list', 'GET'); app()->instance('request', $request); $response = app(ProductController::class)->listProduct(); $decoded = json_decode($response->getContent(), true); return is_array($decoded) ? $decoded : null; } }