userSession->getUser(); $baseUrl = $this->urlGenerator->getBaseUrl(); $serverHost = parse_url($baseUrl, PHP_URL_HOST) ?: 'localhost'; // База REST API поддержки (без завершающего слэша). Переопределение: occ config:app:set f7support support_api_base --value=https://... $supportApiBase = trim($this->config->getAppValue('f7support', 'support_api_base', 'https://support.f7cloud.ru')); if ($supportApiBase === '') { $supportApiBase = 'https://support.f7cloud.ru'; } $supportParts = parse_url($supportApiBase); $supportApiOrigin = ($supportParts['scheme'] ?? 'https') . '://' . ($supportParts['host'] ?? ''); // Optional full WebSocket URL prefix, e.g. wss://support.f7cloud.ru/api/ws (path before /tickets/{id}) $supportWsBase = $this->config->getAppValue('f7support', 'support_ws_base', ''); // Метки «прочитано» (POST …/read на API поддержки). // Порядок деплоя: (1) выкатить бэкенд с маршрутами POST /api/client/tickets/{id}/read и POST /api/operator/tickets/{id}/read; // (2) на Nextcloud: occ config:app:set f7support client_read_receipts --value=1 — тогда приложение f7support начнёт слать client /read; // панель оператора вызывает operator /read независимо от этого флага. При client_read_receipts=0 клиент не дергает client /read (нет 404 на старом API). // Отключить вызовы с клиента: occ config:app:set f7support client_read_receipts --value=0 $clientReadReceipts = $this->config->getAppValue('f7support', 'client_read_receipts', '0'); // Периодический GET /api/client/tickets (мс): has_unread и отпечаток карточки; WebSocket только у открытого тикета. // По умолчанию 3000 (3 с). Пустая строка в конфиге трактуется как 3000. Явное «0» отключает опрос. Иначе 3000…120000. occ: f7support tickets_poll_ms $rawPoll = trim((string) $this->config->getAppValue('f7support', 'tickets_poll_ms', '3000')); if ($rawPoll === '') { $rawPoll = '3000'; } $ticketsPollMs = (int) $rawPoll; if ($ticketsPollMs < 0) { $ticketsPollMs = 0; } elseif ($ticketsPollMs > 0) { if ($ticketsPollMs < 3000) { $ticketsPollMs = 3000; } if ($ticketsPollMs > 120000) { $ticketsPollMs = 120000; } } Util::addStyle('f7support', 'fonts'); Util::addStyle('f7support', 'f7support'); Util::addScript('f7support', 'main'); return new TemplateResponse('f7support', 'main', [ 'username' => $user ? $user->getUID() : '', 'serverAddress' => $serverHost, 'supportApiBase' => $supportApiBase, 'supportApiOrigin' => $supportApiOrigin, 'supportWsBase' => $supportWsBase, 'clientReadReceipts' => $clientReadReceipts, 'ticketsPollMs' => (string) $ticketsPollMs, ]); } }