Home > Mobile >  Why does Firestore think it retrieved a document when one doesn't exist?
Why does Firestore think it retrieved a document when one doesn't exist?

Time:05-31

I'm using swift(UI) with firebase and Google SignIn. So far sign in has been great but when I come to using a new user the code below fails - no fatal errors just doesn't add a new user document to Firestore because it seems to think it has retrieved a document which it couldn't because one with the specified ID don't exist. My guess is the mistake is in the section:

    if let error = error as NSError? {
      print("Error getting document: \(error.localizedDescription)")
        
        self.setFirestoreUser()
    }

the full function:

    func fetchUser(documentId: String) {
    let docRef = Firestore.firestore().collection("users").document(documentId)
    print("User id: \(documentId) ( via fetchUser )")
  docRef.getDocument { document, error in
    if let error = error as NSError? {
      print("Error getting document: \(error.localizedDescription)")
        
        self.setFirestoreUser()
    }
    else {
      if let document = document {
        do {
            print("Working on coding to User.self")
            self.appUser = try document.data(as: User.self)
            self.fetchSites() 
        }
        catch {
          print("func - fetchUser() error: \(error)")
        }
      }
    }
  }
}

The argument 'documentId' is passed on from the google sign process

followup func to create the new Firestore document for this new user:

func setFirestoreUser() {
    let googleUser = GIDSignIn.sharedInstance.currentUser
    let db = Firestore.firestore()
    self.appUser.emailAddress = googleUser?.profile?.email ?? "Unknown"
    self.appUser.userGivenName = googleUser?.profile?.givenName ?? ""
    self.appUser.userFirstName = googleUser?.profile?.name ?? ""
    self.appUser.userProfileURL = googleUser?.profile!.imageURL(withDimension: 100)!.absoluteString ?? ""
        do {
            try db.collection("users").document(googleUser?.userID ?? "UnknownID").setData(from: self.appUser)
            self.fetchUser(documentId: googleUser?.userID ?? "")
        } catch {
            print(error)
        }
}

CodePudding user response:

Calling getDocument on a reference to a non-existing document is not an error (as far as I know), and will return a DocumentSnapshot. To detect whether the document exists, check the exists property on the snapshot instead of (only) checking for errors.

if let document = document {
  if !document.exists {
    ...
  • Related