142 lines
4.1 KiB
JavaScript
142 lines
4.1 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" });
|
|
// 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: 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;
|
|
};
|