presenceTimeout)->acceptJson()->get($config['presence_url']); if (! $response->successful()) { return Presence::Unknown; } return $response->json('present') === true ? Presence::Present : Presence::Absent; } catch (Throwable) { return Presence::Unknown; } } public function deliver(Event $event, User $user, array $config, Delivery $delivery): DeliveryOutcome { try { $response = Http::timeout(5)->asJson()->post($config['deliver_url'], self::payload($event, $delivery)); if ($response->successful()) { return DeliveryOutcome::ok(); } return DeliveryOutcome::failed("HTTP {$response->status()}: ".mb_substr($response->body(), 0, 200)); } catch (Throwable $e) { return DeliveryOutcome::failed($e->getMessage()); } } public function onDone(Event $event, Delivery $delivery): void {} /** @return array */ public static function payload(Event $event, Delivery $delivery): array { $presented = EventPresenter::forClient($event); return [ 'event' => [ 'id' => $event->id, 'state' => $presented['state'], 'due_at' => $presented['due_at'], 'source' => $event->source->name, 'title' => $event->payload['title'], 'subtitle' => $event->payload['subtitle'] ?? null, 'deep_link' => $event->payload['deep_link'] ?? null, 'done_label' => $event->payload['done_label'] ?? 'Сделано', ], 'actions' => [ 'ack' => route('action.ack', $delivery->action_token), 'done' => route('action.done', $delivery->action_token), ], ]; } }