Home > Software engineering >  Callable cloud functions - handle error in android
Callable cloud functions - handle error in android

Time:02-04

im trying to delete an user from firestore and from auth.

I have this callable cloud function:

export const deleteUser = functions.https.onCall(async (data, context) => {
    const userEmail = data.userEmail;
    const collection = data.collection;
    
    try {
        deleteUserByEmail(userEmail, collection)
        return "deleted!"
    } catch (error) {
        throw new functions.https.HttpsError('invalid-argument', 'there is no user with that email', error);
    }
})

async function deleteUserByEmail(userEmail: string, collection: string) {
    const auth = admin.auth();
    const db = admin.firestore();
    
    const { uid } = await auth.getUserByEmail(userEmail);
    
    await db.collection(collection)
        .doc(uid)
        .delete();
    await auth.deleteUser(uid);
    
    return uid;
}

in android i have this:

fun deleteFromFirebase(){
        val data = hashMapOf(
            "userEmail" to user.email,
            "collection" to "User"
        )

        functions // Optional region: .getInstance("europe-west1")
            .getHttpsCallable("deleteUser")
            .call(data)
            .addOnCompleteListener() { task ->
                if(!task.isSuccessful)
                {
                    Log.d("User", "ERROR")
                    val e = task.exception
                    if (e != null) {
                        Log.d("Admin", e.message.toString())
                    }
                }else{
                    Log.d("User", "Deleted")
                    //make something
                }
            }
    }

If the user in auth and the document nin firestore exist, works great. But i tryed to generate some error.

So I deleted the user from auth and ran the function. The Android log says D/User: User deleted but in the console from google cloud:

Function execution took 1878 ms, finished with status code: 200 Exception from a finished function: Error: There is no user record corresponding to the provided identifier.

How can I handle the error and get correctly in android? Thanks!

CodePudding user response:

The deleteUserByEmail function is async and returns a Promise. Your return statement runs before the promises is resolved. Try refactoring the code as shown below:

export const deleteUser = functions.https.onCall(async (data, context) => {
  const userEmail = data.userEmail;
  const collection = data.collection;

  try {
    // add await, continues after Promise is resolved
    await deleteUserByEmail(userEmail, collection)
    return "deleted!"
  } catch (error) {
    console.log(error) // <-- check for any errors
    throw new functions.https.HttpsError('invalid-argument', 'there is no user with that email', error);
  }
})

async function deleteUserByEmail(userEmail: string, collection: string) {
  const auth = admin.auth();
  const db = admin.firestore();

  const { uid } = await auth.getUserByEmail(userEmail);

  return await Promise.all([
    db.collection(collection).doc(uid).delete(),
    auth.deleteUser(uid)
  ])
}
  • Related