angular - Firebase Firestore returnează true la ștergerea eșuată a documentului


Am o aplicație care folosește Firestore de la Firebase pentru persistență. Folosesc Snackbar de la Material pentru notificări. Am în serviciul meu...

deleteProvider(data) {
    return this.db.collection(data.table).doc('xzc').delete();
  }

Unde parametrul data este pur și simplu un obiect care conține tabelul asupra căruia doresc să efectuez acțiunea și id-ul documentului pe care doresc să îl șterg.

data: { table: 'providers', id: 'some firebase identifier'}

Și în componenta mea

onDeleteEntry(event) {
    if (event.table === 'providers') {
      this.providerService.deleteProvider(event)
        .then(() => {
          this.snackBar.open('Provider deleted');
        })
        .catch((error) => {
          this.snackBar.open('Error deleting provider', error);
        });
    }
  }

Acest lucru șterge documentul perfect, dar la testarea cazului eșuat, returnează adevărat.

De exemplu, dacă introduc manual 'xyz' în metoda .doc('xyz'). Răspunsul apelează metoda mea next(), mai degrabă decât catch() al meu.

deleteProvider(data) {
    return this.db.collection(data.table).doc('xyz').delete();
  } // returns true on a non-existent document

Documentația Firebase subliniază faptul că colecțiile imbricate vor rămâne după ștergere, dar în afară de asta, funcționalitatea de bază de ștergere a unui document este simplă și nu oferă foarte multe informații în afară de

db.collection("cities").doc("DC").delete().then(function() {
    console.log("Document successfully deleted!");
}).catch(function(error) {
    console.error("Error removing document: ", error);
});

Ce îmi lipsește?

AIT

Răspuns #1

În prezent, delete nu eșuează dacă un document nu există. Într-un fel, acest lucru este inconsecvent cu create, care eșuează dacă există deja.

Totuși, se pare că această caracteristică este/fusese planificată. În SDK-ul Java, delete poate lua un obiect Precondition:

  /**
   * Deletes the document referred to by this DocumentReference.
   *
   * @param options Preconditions to enforce for this delete.
   * @return An ApiFuture that will be resolved when the delete completes.
   */
  @Nonnull
  public ApiFuture<WriteResult> delete(@Nonnull Precondition options) {
    WriteBatch writeBatch = firestore.batch();
    return extractFirst(writeBatch.delete(this, options).commit());
  }

În Precondition, există o metodă de ajutor:

  /**
   * Creates a Precondition that enforces that a document exists.
   *
   * @param exists Whether the document should exist.
   * @return A new Precondition
   */
  // TODO: Make public once backend supports verify.
  @Nonnull
  static Precondition exists(Boolean exists) {
    return new Precondition(exists, null);
  }

Rețineți că nu este public. Comentariul spune că îi lipsește suportul backend. Numai echipa Firestore cunoaște starea actuală a acestuia.