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.partyName); // GET ROOM EXISTS, ROOM SOURCE, & ROOM PIN const [exists, roomSource, roomPin, adminUid] = await admin .firestore() .collection('rooms') .doc(bodydata.partyName) .get() .then((roomSnap) => [ roomSnap.exists, roomSnap.exists ? roomSnap.data().player.source : '', roomSnap.exists ? roomSnap.data().pin : '', roomSnap.exists ? roomSnap.data().adminUid : '', ]) .catch((err) => { console.error( `Failed to get room when joining room : \n\t Room: ${bodydata.partyName} \n\t User: ${bodydata.uid}`, err ); }); if (exists && roomPin !== bodydata.partyPin) return res.status(401).send({ message: 'Incorrect party pin' }); if (adminUid === bodydata.uid) { await admin .firestore() .collection('rooms') .doc(bodydata.partyName) .collection('users') .doc(bodydata.uid) .set({ admin: true, name: bodydata.userName, }); } // GET IF USER EXISTS AND IS ADMIN const [userExists, userAdmin, userName] = await admin .firestore() .collection('rooms') .doc(bodydata.partyName) .collection('users') .doc(bodydata.uid) .get() .then((userSnap) => [ userSnap.exists, userSnap.exists ? userSnap.data().admin : false, userSnap.exists ? userSnap.data().name : '', ]) .catch((err) => { console.error( `Failed to get user when joining room : \n\t Room: ${bodydata.partyName} \n\t User: ${bodydata.uid}`, err ); }); // IF USER PRE-EXISTS AND SAME SOURCE - JOIN if (userExists && exists && roomSource === bodydata.source) { // UPDATE NAME IF NEEDED if (userName !== bodydata.userName) { await admin .firestore() .collection('rooms') .doc(bodydata.partyName) .collection('users') .doc(bodydata.uid) .update({ name: bodydata.userName }); } res.status(200).send({ partyName: bodydata.partyName, message: 'Joined a party' }); } // USER DOES NOT PRE-EXIST BUT SAME SOURCE AND RIGHT PIN else if ( !userExists && exists && bodydata.partyName && bodydata.userName && roomSource === bodydata.source && roomPin === bodydata.partyPin ) { await admin .firestore() .collection('rooms') .doc(bodydata.partyName) .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: ${partyName} \n\t ${bodydata.uid}`, err ); }); await admin .firestore() .collection('rooms') .doc(bodydata.partyName) .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: ${partyName} \n\t User: ${bodydata.uid}`, err ); }); res.status(200).send({ partyName: bodydata.partyName, message: 'Joined a party' }); } // ONLY WRONG SOURCE else if (exists && roomSource !== bodydata.source) { // MOVE SOURCE IF ADMIN if (userAdmin === true) { await admin .firestore() .collection('rooms') .doc(bodydata.partyName) .update({ player: { showName: null, source: bodydata.source, status: 'NOT_PLAYING', time: 0, updatedBy: bodydata.uid, }, }) .catch(() => { console.error( `Failed to update player source when admin joining party \n\t Room: ${partyName} \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' }); };