Swift Firebase aciona Cloud Function na exclusão

Oct 02 2020

Gostaria de usar a função de gatilho ao excluir dentro do meu projeto, onde primeiro excluo o usuário da autenticação e, depois, excluo o usuário do banco de dados.

No link fornecido está um exemplo, mas não consigo fazer funcionar no Swift. Digamos que eu possa fazer funcionar, posso chamar algo assim? Ou Auth.auth().currentUsernão está mais disponível? E há alguma solução alternativa para isso?

Auth.user.onDelete() { 
    let db = Firestore.firestore()
    let user = Auth.auth().currentUser
    db.collection("users").document(user).delete() { err in
        if err != nil {
            Utilities.showErrorPopUp(labelContent: "Fehler", description: err!.localizedDescription)
            finished(false)
        } else {
            finished(true)
        }
    }
}

Eu sei que poderia excluir o usuário do banco de dados primeiro e da autenticação depois, mas isso não é adequado para o meu caso de uso. Alguém pode me ajudar aqui? Além disso, deixe-me saber se algo não estiver claro e se você precisar de mais informações.

Respostas

1 FrankvanPuffelen Oct 02 2020 at 14:45

Eu acho que você pode estar confundindo algumas coisas aqui.

O Cloud Functions é escrito em Node.js e executado nos servidores do Google - o que permite que eles respondam a eventos que acontecem em seus projetos do Firebase. Você não pode responder a todos esses mesmos eventos, como uma conta de usuário sendo excluída, em seu código Swift do lado do cliente. Portanto, embora seja perfeitamente viável usar o Cloud Functions para excluir um documento do Cloud Firestore em resposta à exclusão de uma conta de usuário do Firebase Authentication, você não pode fazer isso no código Swift do lado do cliente.

O que você pode fazer no seu código Swift é excluir a conta do usuário conectado no momento e excluir o documento do Firestore. A ordem típica para fazer isso é primeiro deletar o documento, e só então deletar a conta, já que deletar o documento provavelmente / deve exigir que o usuário ainda exista e seja autenticado.

Seria algo como:

db.collection("cities").document("DC").delete() { err in
    if let err = err {
        print("Error removing document: \(err)")
    } else {
        print("Document successfully removed!")
        let user = Auth.auth().currentUser
    
        user?.delete { error in
          if let error = error {
            // An error happened.
          } else {
            // Account deleted.
          }
        }
    }
}

O código acima é principalmente 1: 1 copiado do documento ao excluir dados do Firestore e excluir um usuário do Firebase Authentication .