feat(pulse): make heartbeat opt-in with transparency toggle
Heartbeat telemetry (домен, имя бота, версии PHP/модуля/OpenCart) больше не отправляется скрытно. Добавлен отдельный флаг pulse.heartbeat_enabled (по умолчанию выключен, opt-in), независимый от pulse.api_key: - ранний return в handleHeartbeat() при выключенном флаге (не трогает кэш/getMe); - провайдер читает флаг и инжектит в сервис; - в админке — переключатель с честным раскрытием состава данных; - debug-лог факта отправки в pushHeartbeat(). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -85,6 +85,7 @@ HTML,
|
||||
|
||||
'pulse' => [
|
||||
'api_key' => '',
|
||||
'heartbeat_enabled' => false,
|
||||
'batch_size' => 50,
|
||||
'max_attempts' => 3,
|
||||
],
|
||||
|
||||
@@ -22,6 +22,7 @@ class TeleCartPulseService
|
||||
private TeleCartEvent $eventModel;
|
||||
private ?string $apiKey;
|
||||
private ?PayloadSigner $heartbeatPayloadSigner;
|
||||
private bool $heartbeatEnabled;
|
||||
|
||||
public function __construct(
|
||||
TelegramInitDataDecoder $initDataDecoder,
|
||||
@@ -30,7 +31,8 @@ class TeleCartPulseService
|
||||
LoggerInterface $logger,
|
||||
TeleCartEvent $eventModel,
|
||||
?string $apiKey = null,
|
||||
?PayloadSigner $heartbeatPayloadSigner = null
|
||||
?PayloadSigner $heartbeatPayloadSigner = null,
|
||||
bool $heartbeatEnabled = false
|
||||
) {
|
||||
$this->initDataDecoder = $initDataDecoder;
|
||||
$this->telegramService = $telegramService;
|
||||
@@ -39,6 +41,7 @@ class TeleCartPulseService
|
||||
$this->eventModel = $eventModel;
|
||||
$this->apiKey = $apiKey;
|
||||
$this->heartbeatPayloadSigner = $heartbeatPayloadSigner;
|
||||
$this->heartbeatEnabled = $heartbeatEnabled;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -132,6 +135,10 @@ class TeleCartPulseService
|
||||
*/
|
||||
public function handleHeartbeat(): void
|
||||
{
|
||||
if (! $this->heartbeatEnabled) {
|
||||
return;
|
||||
}
|
||||
|
||||
if ($this->cache->get('telecart_pulse_heartbeat')) {
|
||||
return;
|
||||
}
|
||||
@@ -193,6 +200,10 @@ class TeleCartPulseService
|
||||
*/
|
||||
private function pushHeartbeat(array $json): void
|
||||
{
|
||||
$this->logger->debug('Pushing heartbeat', [
|
||||
'data' => $json,
|
||||
]);
|
||||
|
||||
$baseUri = rtrim(env('PULSE_API_HOST', 'http://localhost'), '/') . '/';
|
||||
|
||||
$client = new Client([
|
||||
|
||||
@@ -22,6 +22,7 @@ class TeleCartPulseServiceProvider extends ServiceProvider
|
||||
$this->container->singleton(TeleCartPulseService::class, function (Container $app) {
|
||||
$heartbeatSecret = $app->getConfigValue('pulse.heartbeat_secret') ?? env('PULSE_HEARTBEAT_SECRET');
|
||||
$heartbeatSigner = $heartbeatSecret ? new PayloadSigner($heartbeatSecret) : null;
|
||||
$heartbeatEnabled = (bool) $app->getConfigValue('pulse.heartbeat_enabled');
|
||||
|
||||
return new TeleCartPulseService(
|
||||
$app->get(TelegramInitDataDecoder::class),
|
||||
@@ -31,6 +32,7 @@ class TeleCartPulseServiceProvider extends ServiceProvider
|
||||
$app->get(TeleCartEvent::class),
|
||||
$app->getConfigValue('pulse.api_key'),
|
||||
$heartbeatSigner,
|
||||
$heartbeatEnabled,
|
||||
);
|
||||
});
|
||||
|
||||
|
||||
Reference in New Issue
Block a user