Angular Push Notification - избегайте хранения повторяющихся объектов подписки - PullRequest
0 голосов
/ 23 октября 2019

Я сослался на несколько фрагментов кода, и почти везде код для запроса разрешения на использование push-уведомлений с использованием angular похож на этот:

export class AppComponent {

    constructor(swPush: SwPush) {
        if (swPush.isEnabled) {
            swPush.requestSubscription({
                serverPublicKey: VAPID_PUBLIC
            }).then(subscription => {
                // save subscription object in db
            }).catch(console.error);
        }
    }

}

Я реализовал то же самое в своем приложении, ноЯ сталкиваюсь с этой проблемой -

Когда пользователь впервые загружает приложение, браузер запрашивает разрешение, а если пользователь «Разрешает», обещание будет разрешено, а объект подписки будет сохранен в дБ.

В следующий раз, когда пользователь загружает приложение, поскольку разрешение уже предоставлено, обещание будет выполнено, и объект подписки снова будет сохранен в базе данных. Таким образом, в БД будут повторяться записи.


Чтобы избежать дублирования записей в БД, я хотел бы понять, какое из этих двух решений лучше (или если есть какой-либо другой лучший подход):

1. Вызовите swPush.requestSubscription, если нет активной подписки

export class AppComponent {

    constructor(swPush: SwPush) {
        if (swPush.isEnabled) {
            swPush.subscription.pipe(take(1)).subscribe(subscription => {
                if(subscription == null) {
                    swPush.requestSubscription({
                        serverPublicKey: VAPID_PUBLIC
                    }).then(subscription => {
                        // save subscription object in db
                    }).catch(console.error);
                }
            }
        }
    }

}

2. Пусть swPush.requestSubscription вызывается каждый раз при загрузке страницы иобрабатывать вставку дублированных записей БД в коде на стороне сервера.

...