Проблема с удалением аккаунта и документов в firestore

Я хочу удалить учетную запись пользователя и все ее документы в Firestore, но при асинхронных запросах Firebase удаляет учетную запись раньше всех документов.

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

db.collection("users").document(self.user.uid).collection("sachets").getDocuments() { (QuerySnapshot, err) in
    if let err = err{
        print("Erreur de lecture : \(err)")
    } else {
        for document in QuerySnapshot!.documents {
            db.collection("users").document(self.user.uid).collection("sachets").document(document.documentID).delete(){ err in
                if let err = err {
                    print("   🔴 Probleme de suppression des docuemnts \(err)")
                } else {
                    print("   🔵 Documents supprimés")
                }
            }
        }
    }
}
self.user?.delete { error in
    if let error = error {
        print("   🔴 Probleme de suppression du compte Utilisateur \(error)")
    } else {
        print("   🔵 Utilisateur supprimé")
    }
}

Кто-нибудь может подсказать, как это сделать? Благодарность

пожалуйста, отформатируйте свой код правильно

jrswgtr 31.10.2018 14:06
2
1
858
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ваш метод getDocuments() является асинхронным, поэтому вам следует удалить учетную запись только после удаления документов.

Просто поместите метод user?.delete в обратный вызов getDocuments()

db.collection("users").document(self.user.uid).collection("sachets").getDocuments() { (QuerySnapshot, err) in
    if let err = err{
        print("Erreur de lecture : \(err)")
    } else {
        for document in QuerySnapshot!.documents {
            db.collection("users").document(self.user.uid).collection("sachets").document(document.documentID).delete(){ err in
                if let err = err {
                    print("   🔴 Problème de suppression des documents \(err)")
                } else {
                    print("   🔵 Documents supprimés")
                }
            }
        }
    }

    self.user?.delete { error in
        if let error = error {
            print("   🔴 Problème de suppression du compte Utilisateur \(error)")
        } else {
            print("   🔵 Utilisateur supprimé")
        }
    }
}
Ответ принят как подходящий

Хорошо, я создал тестовый проект и решаю эту проблему. Вам также необходимо убедиться, что вы удалили все данные из пользовательских полей. Например, если у вас есть name, age и т. д. На узле user.

Первый Я создал функцию для получения uid текущих пользователей:

func currentUser() -> String {
    return Auth.auth().currentUser!.uid
}

потом Я создал функцию для удаления всех данных для вошедшего в систему пользователя. Это сначала удалит все данные субколлекции, а затем удалит документ для userID.

Для обработки асинхронных методов вы можете использовать DispatchGroup для уведомления, когда все асинхронные вызовы выполнены.

Одна сторона примечания: убедитесь, что НИКОГДА принудительно развернул значение, если вы не можете на 100% гарантировать наличие документов. В противном случае ваше приложение, скорее всего, выйдет из строя. Чтобы решить эту проблему, используйте guard или if let для решения этой проблемы.

// Where "user" is the result from currentUser()
func removeData(from user: String) {
    db.collection("users").document(user).collection("sachets").getDocuments { (snapshot, error) in
        if let error = error {
            // Handle error
        } else if let documents = snapshot?.documents {
            // Using if let to see if there are documents

            // Time to delete all the subCollection for the user
            self.deleteSubCollectionData(for: user, documents, completion: {

                // Once that done, make sure to delete all the fields on the highest level.
                self.db.collection("users").document(user).delete(completion: { (error) in
                    if let error = error {
                        // Handle error
                    } else {
                        // Delete the account
                        self.deleteAccount()
                    }
                })
            })
        }
    }
}

// This function will remove the subCollectionData
fileprivate func deleteSubCollectionData(for user: String, _ documents: [QueryDocumentSnapshot], completion: @escaping () -> ()) {
    let group = DispatchGroup()
    documents.forEach({
        group.enter()
        self.db.collection("users").document(user).collection("sachets").document($0.documentID).delete(completion: { (error) in
            if let error = error {
                // Handle error
            }
            group.leave()
        })
    })

    // Once the dispatchGroup is done...
    group.notify(queue: .main) {
        completion()
    }
}

И в конце...

func deleteAccount() {
    Auth.auth().currentUser?.delete { (error) in
        if let error = error {
            print(error)
        } else {
            print("Deleted account")
        }
    }
}

Если вы не удалите все уровни данных, в Firestore все равно останутся данные.

Спасибо ... я попробую это

laurent espinosa 01.11.2018 23:54

Ага, давай. Одна вещь, о которой я не упомянул, - это то, что вам нужно обязательно удалить все пользовательские данные перед удалением учетной записи. ЕСЛИ бы произошло что-нибудь необычное. Например, при удалении данных произошла ошибка. Тогда мы не хотим удалять учетную запись пользователя до устранения этой проблемы. Поэтому удаление учетной записи всегда будет последним, что нужно делать.

Jacob Ahlberg 02.11.2018 07:08

Это хорошо для удаленных документов, но у меня возникла новая проблема, когда он пытается удалить учетную запись, я получил сообщение об ошибке «Эта операция является конфиденциальной и требует недавней аутентификации. Войдите снова, прежде чем повторять этот запрос».

laurent espinosa 02.11.2018 16:41

Рад, что смог вам помочь! Я нашел это, надеюсь, вы сможете немного покопаться, чтобы понять почему :) stackoverflow.com/a/47749206/7653367 Удачи! @laurentespinosa

Jacob Ahlberg 02.11.2018 22:40

Ничего страшного ... Решаю проблему, спрашивая пароль для подтверждения удаления, и перепроверяю его. Все хорошо. Большое спасибо.

laurent espinosa 03.11.2018 15:21

Другие вопросы по теме