Lines 100.00% 23 / 23
Methods 100.00% 4 / 4
Classes 100.00% 1 / 1
Name Lines Methods CRAP
 __construct 100.00% 1 / 1 100.00% 1 / 1 1
 handledMessageClass 100.00% 1 / 1 100.00% 1 / 1 1
 handle 100.00% 1 / 1 100.00% 1 / 1 1
 callHomeAssistant 100.00% 20 / 20 100.00% 1 / 1 3
20final readonly class ServiceCallRequestHandler implements WorkerMessageHandler
21{
22    public function __construct(
23        private HaSession $session,
24        private HaClient $client,
25        private HaCallSlots $slots,
26        private ServiceCallPolicy $policy,
27        private LoggerInterface $logger,
28    ) {}
29
30    public function handledMessageClass(): string
31    {
32        return ServiceCallRequest::class;
33    }
34
35    /** @param ServiceCallRequest $message */
36    public function handle(WorkerHandle $handle, WorkerMessage $message): void
37    {
38        $this->slots->runBounded($handle, $message, fn(): ServiceCallResult => $this->callHomeAssistant($message));
39    }
40
41    /** @throws ServiceCallException */
42    private function callHomeAssistant(ServiceCallRequest $request): ServiceCallResult
43    {
44        if ($this->policy->dryRun) {
45            $this->logger->info('Service call not sent: service_calls.dry_run is on', [
46                'domain' => $request->domain,
47                'service' => $request->service,
48                'target' => $request->target,
49                'data' => $request->data,
50            ]);
51
52            return new ServiceCallResult(
53                $request->correlationId,
54                new ServiceResponse($request->domain, $request->service, context: $this->policy->createDryRunContext($request->correlationId)),
55            );
56        }
57
58        if (!$this->session->isConnected()) {
59            throw $request->createUnreachableFailure('Home Assistant is disconnected');
60        }
61
62        return new ServiceCallResult($request->correlationId, $this->client->callService(
63            $request->domain,
64            $request->service,
65            $request->data,
66            $request->target,
67            $request->returnResponse,
68        ));
69    }
70}