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" }); // 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: adminUid === bodydata.uid, 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" }); return; };