Files
watchparty/functions/modules/joinRoom.js
T
2020-08-08 20:39:09 -04:00

153 lines
4.3 KiB
JavaScript

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: "<system>",
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" });
};