From a1a29b255eda61f0d06cdddbe9c0a79751c6fe09 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Kan=C4=9Bra?= Date: Wed, 12 May 2021 21:41:11 +0200 Subject: [PATCH] feat(functions): on user delete --- functions/src/index.ts | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/functions/src/index.ts b/functions/src/index.ts index 996c82c..0b09b55 100644 --- a/functions/src/index.ts +++ b/functions/src/index.ts @@ -252,3 +252,40 @@ exports.notifications = functions.pubsub.schedule('every 24 hours').timeZone('Eu } } }); + +exports.deleteUserData = functions.auth.user().onDelete(async (user) => { + const userRef = db.collection('users').doc(user.uid); + const projectRef = db.collection('projects').where('studentId', '==', user.uid).limit(1); + const proposalRef = db.collection('proposals').where('studentId', '==', user.uid).limit(1); + + try { + await db.runTransaction(async (transaction) => { + const userDoc = await transaction.get(userRef); + const projectDoc = (await transaction.get(projectRef)).docs[0]; + const proposalDoc = (await transaction.get(proposalRef)).docs[0]; + const projectFilesDoc = ((await transaction.get(db.collection('projectFiles').where('projectId', '==', projectDoc.id).limit(1))).docs[0]); + + if (userDoc?.exists) transaction.delete(userRef); + if (projectDoc?.exists) transaction.delete(projectDoc.ref); + if (proposalDoc?.exists) transaction.delete(proposalDoc.ref); + if (projectFilesDoc?.exists) { + const storage = admin.storage(); + const bucket = storage.bucket('ps-project-files'); + + const filesData = projectFilesDoc.data(); + await Promise.all([ + ...filesData?.mandatory.map((file: any) => bucket.file(file.filePath).delete()), + ...filesData?.optional.map((file: any) => bucket.file(file.filePath).delete()) + ]); + + transaction.delete(projectFilesDoc.ref); + } + + return transaction; + }); + } catch(e) { + functions.logger.error(e); + } + + return; +});