Cloud functions
const newData = value.data(); //<<< field modification
Code:
exports.productCopy = functions.https.onCall( async (data, context)=>{
const uid = context.auth.uid;
data.selectedProductId.forEach((docId){
const productRef = admin.firestore()
.collection('products')
.doc(docId);
const newProductRef = admin.firestore()
.collection('products')
.doc();
const product = await productRef.get().then((value)=>{
const newData = value.data();
newProductRef.add(value.data())
});
});
return {status:'success', isError: false};
});
First, is good to know that each document is immutable, after you get a document in a variable you can modify that variable, and then you will need to put/update/patch the new document.
I meant you need to do 2 API calls, to save correctly the document in your database.
You can't really use await
in forEach
block. If you want to wait for multiple actions, use Promise.all()
.
It should be something like this:
exports.productCopy = functions.https.onCall((data, context) => {
const uid = context.auth.uid;
const promises = data.selectedProductId.map((docId) => {
return admin.firestore() // ๐ Return promise, which bubbles up
.collection('products')
.doc() // ๐ You need to specify a document ID here, uid maybe?
.get()
.then((doc) => {
const newData = doc.data();
return admin.firestore() // ๐ Return promise, which bubbles up
.collection('products')
.doc(docId)
.add(value.data());
});
});
return Promise.all(promises).then((results) => { // ๐ Wait for all promises to resolve
return { status:'success', isError: false };
})
});
In general it's best to not mix async
/await
with then()
, as it's easy to get into situations as you had. Here, just using promises keep the code as simple as possible