const admin = require('firebase-admin'); module.exports = async (req, res) => { const bodydata = JSON.parse(req.body); console.log('Requested Join - UID - ', bodydata.uid, '\n\tRoom - ', bodydata.roomId); const [exists, roomSource] = await admin .firestore() .collection('rooms') .doc(bodydata.roomId) .get() .then((roomSnap) => [roomSnap.exists, roomSnap.exists ? roomSnap.data().player.source : '']) .catch((err) => { console.error( `Failed to get room when joining room : \n\t Room: ${bodydata.roomId} \n\t User: ${bodydata.uid}`, err ); }); const [userExists, userAdmin] = await admin .firestore() .collection('rooms') .doc(bodydata.roomId) .collection('users') .doc(bodydata.uid) .get() .then((userSnap) => [userSnap.exists, userSnap.exists ? userSnap.data().admin : false]) .catch((err) => { console.error( `Failed to get user when joining room : \n\t Room: ${bodydata.roomId} \n\t User: ${bodydata.uid}`, err ); }); if (userExists && exists && roomSource === bodydata.source) res.status(200).send({ roomId: bodydata.roomId, message: 'Joined a party' }); else if ( !userExists && exists && bodydata.roomId && bodydata.userName && roomSource === bodydata.source ) { await admin .firestore() .collection('rooms') .doc(bodydata.roomId) .collection('messages') .add({ uid: '', name: '', text: `${bodydata.userName} joined the party.`, time: new Date(), }) .catch((err) => { console.error( `Failed to add system join party message : \n\t Room: ${roomId} \n\t ${bodydata.uid}`, err ); }); await admin .firestore() .collection('rooms') .doc(bodydata.roomId) .collection('users') .doc(bodydata.uid) .set({ admin: false, name: bodydata.userName, }) .catch((err) => { console.error( `Failed to set admin when joining party : \n\t Room: ${roomId} \n\t User: ${bodydata.uid}`, err ); }); await admin .firestore() .collection('rooms') .doc(bodydata.roomId) .update({ updatedAt: new Date(), }) .catch((err) => { console.error( `Failed to set updated time when joining party : \n\t Room: ${roomId} \n\t User: ${bodydata.uid}`, err ); }); res.status(200).send({ roomId: bodydata.roomId, message: 'Joined a party' }); } else if (!userExists && !bodydata.userName) res.status(400).send({ message: 'Missing user name' }); else if (exists && roomSource !== bodydata.source) { if (userAdmin === true) { await admin .firestore() .collection('rooms') .doc(bodydata.roomId) .update({ player: { showName: null, source: roomSource, status: 'NOT_PLAYING', time: 0, updatedBy: bodydata.uid, }, }) .catch(() => { console.error( `Failed to update player source when admin joining party \n\t Room: ${roomId} \n\t User: ${bodydata.uid}` ); res.status(500).send({ message: 'Unable to move party, please try again' }); }); res.status(200).send({ message: `Moved party to ${roomSource}` }); } else res.status(417).send({ message: `This party is on ${roomSource}` }); } else res.status(404).send({ message: 'Party Not Found' }); };