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