Jak částečně aktualizovat dokument v Cloud Firestore

Nastane scénář, kdy budete chtít částečně aktualizovat dokument na Cloud Firestore, aniž byste narušili pravidla zabezpečení.

Řekněme, že máte kolekci objednávek a přihlášeného uživatele s uživatelskou rolí, který může v této kolekci vytvořit nový dokument objednávky, jako na snímku obrazovky níže.

Uživatelská role

Bezpečnostní pravidla ČTENÍ a ZÁPIS pro přístup ke sbírce objednávek pro uživatele by vypadala takto:

NAPIŠTE PRAVIDLO

match /orders/{ordersId} {
      allow write: if
           request.auth.uid != null && request.auth.token.isUser == true
}

Výše uvedené bezpečnostní pravidlo umožní uživateli vytvořit nový dokument, když je přihlášen a uživatelská role je isUser.

V této fázi se můžete divit, odkud pochází role isUser?

Existuje několik způsobů, jak vytvořit uživatelské role ve Firebase. Nároky na ověření používám k vytváření rolí prostřednictvím cloudových funkcí.

Další informace o tomto tématu najdete v mém dalším článku, který podrobně popisuje, jak vytvořit uživatelské role pomocí nároků na ověření.

PŘEČTĚTE SI PRAVIDLO, aby uživatel měl přístup ke svým vlastním objednávkám, nikoli k jiným.

match /orders/{ordersId} {
      allow write: if
           request.auth.uid == resource.data.user.uid && request.auth.token.isUser == true
}

Výše uvedené bezpečnostní pravidlo umožní uživatelům přijímat objednávky, když se uid přihlášeného uživatele shoduje s uid, které je v poli uživatele v dokumentu objednávky, jako na obrázku níže.

Bezpečnostní pravidlo také kontroluje, zda má přihlášený uživatel roli isUser.

To je docela přímočaré.

Role řidiče

Jak můžete vidět na obrázku objednávky níže, hned po vytvoření jsem k objednávce přiřadil ovladač. Udělal jsem to tímto způsobem pro demonstrační účely.

Ve skutečném světě budete muset přiřadit ovladač po zadání objednávky prostřednictvím panelu Správce nebo odesláním oznámení o objednávce dostupným ovladačům, aby objednávku přijali před zadáním objednávky, a poté ji přidejte do dokumentu objednávky.

Když je řidič přiřazen k objednávce, potřebuje přístup k určitým informacím v objednávce, jako je název obchodu, adresa obchodu, adresa uživatele atd.

Udělme tedy přístup READ k objednávce, ke které je ovladač přiřazen.

match /orders/{ordersId} {
      allow read: if
           request.auth.uid == resource.data.driver.uid && request.auth.token.isDriver == true
}

To je dobře.

Nyní může uživatel ČÍST a ZAPSAT svou vlastní objednávku a řidič může pouze ČÍST dokument objednávky.

Pěkné.

Stav objednávky

Nyní chci uživateli poskytnout stav objednávky, jak řidič postupuje s objednávkou, jako je například vychystání, doručení atd.

Pokračovat ve čtení...