как заставить обновление Serverless Angular SPA PWA, размещенного на Firebase и работающего с FireStore - PullRequest
2 голосов
/ 28 января 2020

Фон:

An Angular 8 PWA SPA. Использует проверку подлинности Firebase. И Firestore как БД. (включая Иони c 4)

Все операции чтения и записи и c выполняются через AngularFire npm.

Здесь и там есть облачные функции, которые выполняют бизнес-логику c.

Все пакеты являются последними.

Сценарий:

Пользователь, находящийся в движении с открытой версией PWA 3.1 в автономном режиме, выполняет обновление документа тип «SampleDo c», ожидающий синхронизации с Firestore.

Пользователь переводит свой ноутбук в спящий режим на выходные.

В выходные выкатывается обновление ПО, которое изменяет структуру документов SampleDo c, в которых БД обновляется до нового формата. Развернута новая версия PWA 4.0.

Пользователь открывает свой ноутбук в понедельник в офисе с WiFi, и изменения применяются к БД, повреждающей данные.

Как это предотвратить?

Я из мира серверов Classi c Spring Boot. Вот как мы это обрабатываем:

Каждый HTTP-запрос, отправляемый на сервер, обнажает заголовок с версией API, называемой примером ApiVersion: 3.1.0

, на сервере есть фильтр которая проверяет текущую версию по сравнению с входящей версией и, если она не совпадает, отклоняет запрос с кодом ошибки HTTP, который веб-приложение знает, что ему необходимо обновить себя. Пользователь уведомил, что изменения не могут быть применены, и пользователь upp обновится.

В случае бессерверной Angular SPA PWA, работающей напрямую с FireStore, нет возможности добавить такой фильтр.

Как правильно решить эту проблему в этом техническом стеке?

Одна из идей - подписаться на do c, который содержит текущую версию DB / APP, но будет приходит уведомление об обновлении До AngularFire попытается применить изменения?

Есть ли способ предотвратить эти изменения?

1 Ответ

0 голосов
/ 28 января 2020

Я бы сделал то же самое в Firestore, но затем включил бы номер версии в данные, которые вы пишете. Поэтому в свой документ включите поле номера версии, а затем убедитесь, что в правилах безопасности вашей базы данных на стороне сервера:

allow write: if (request.resource.data.clientVersion >= 5);

Несколько более сложная версия - написать эту clientVersion значение в отдельный документ, и объединить это с регулярным обновлением в пакетной записи Затем вы будете использовать getAfter() в ваших правилах безопасности для проверки версии:

allow write: if getAfter(/databases/$(database)/documents/users/$(request.auth.uid)).data.clientVersion >= 5;
...