==== Web Push API ====
Данный модуль позволяет отправлять Push уведомления клиентам и администраторам через Web Push платформу.\\
\\
Клиент реализован на ServiceWorker, поэтому будет работать только на домене с валидным SSL (HTTPS) серитификатом.
\\
Для отправки в Chrome нужен ключ Google API Platform Key.( Брать в [[https://console.cloud.google.com/| Google Cloud Console ]] ).\\
Ключ нужно записать в ''libexec/config.pl'' **$conf{GOOGLE_API_KEY}**.\\
\\
Пуши в Firefox работают без ключа.\\
После записи ключа создать файл манифеста ''cgi-bin/manifest.json''.
# cd /usr/abills/cgi-bin/
# cp ../misc/gcm/manifest.json.default manifest.json
Заменить ''%GCM_APPLICATION_NUMBER%'' на номер своего проекта в ''Google Cloud Console''.
# vim manifest.json
Создать таблицы, в которых хранятся клиенты и сообщения
# mysql -D abills < db/Push.sql
После этого можно включить скрипты Push переменной конфигурации $conf{PUSH_ENABLED}.
Администраторы подписываются на Push уведомления на странице "Профиль".\\
{{ :abills:docs:manual:sender:admin_push_subscribe.png?nolink |}}
\\
Пользователям предложит подписаться сразу при входе в кабинет.\\
{{ :abills:docs:manual:sender:client_push_subscribe.png?nolink |}}
\\
==== Для разработчиков ====
Пример использования:
# Подключаем модуль
use Abills::Sender::Core;
my $Sender = Abills::Sender::Core->new($db, $admin, \%conf, {
SENDER_TYPE => 'Push'
});
# Отправляем сообщение
my $request_sent = $Sender->send_message({
UID => 2,
TITLE => 'ABillS Push',
MESSAGE => 'Hello, world sended via Push message'
});
# $request_sent == 1, если запрос к сервису Push завершился успешно. (но это не гарантирует доставку)
==== Детали реализации ====
Сама схема работы WebPush хорошо расписана в [[https://developers.google.com/web/fundamentals/engage-and-retain/push-notifications/|документации для разработчиков Google]].
В даном случае есть ServiceWorker в браузере, который отвечает за подписку и уведомление сервера о своей подписке.\\
Сервер, получив даные о подписке записывает контакты в таблицу ''push_contacts'' (модуль ''Contacts'') и отдаёт клиенту ''contact_id'', который сохраняется внутри ''indexedDB'' в браузере \\
Когда нужно отправить уведомление, модуль ''Push'' получает контакт из таблицы и отправляет запрос на ''Push-уведомление'' сервису Push. Если запрос завершился удачно, сообщение сохраняется в таблицу ''push_messages'' с некоторым TTL (24 часа).
Когда клиент получает ''Push-уведомление'' от Push-сервиса, он используя сохранённый ''contact_id'', получает с сервера ABillS сообщение для этого ''contact_id''. После отправки сообщения клиенту, оно удаляется из таблицы.
Дневной периодик функцией ''msgs_clear_push_messages'', удаляет сообщения которые так и не были доставлены.\\
Для модуля ''Notepad'' есть [[abills:docs:manual:periodic:periodic#plagin_notepad|billd плагин]], для рассылки напоминаний через Push.