const admin = require("firebase-admin"); const partyNameHasInvalidChar = (partyName) => /\\/gi.test(partyName) || /\//gi.test(partyName) || /\./gi.test(partyName); const isValidPin = (pin) => /^.*[0-9].{2}$/.test(pin); module.exports = async (req, res) => { const bodydata = JSON.parse(req.body); console.log("Requested Create - UID - ", bodydata.uid); if (!bodydata.userName) { return res.status(400).send({ message: "Missing user name" }); } else if (!bodydata.partyName) { return res.status(400).send({ message: "Missing party name" }); } else if (!bodydata.partyPin) { return res.status(400).send({ message: "Missing party pin" }); } else if (partyNameHasInvalidChar(bodydata.partyName)) { res .status(400) .send({ message: 'Party name can not have "\\" or "/" or "."' }); } else if (!isValidPin(bodydata.partyPin)) { return res.status(400).send({ message: "Party pin can only have digits and must be atleast 3 digits", }); } else { const roomNameTaken = await admin .firestore() .collection("rooms") .doc(bodydata.partyName.replace("/", "\\")) .get() .then((docSnap) => docSnap.exists); if (roomNameTaken) { return res .status(409) .send({ message: "That party name is already taken" }); } else { await admin .firestore() .collection("rooms") .doc(bodydata.partyName) .set({ name: bodydata.partyName, pin: bodydata.partyPin, player: bodydata.player, createdAt: new Date(), adminUid: bodydata.uid, adminOnly: bodydata.adminOnly, publicParty: Boolean(bodydata.publicParty), }) .catch((err) => { res.status(500).send({ message: "Unable to start party." }); console.error(err); }); await admin .firestore() .collection("rooms") .doc(bodydata.partyName) .collection("messages") .add({ uid: "", name: "", text: `${bodydata.userName} started the party.`, time: new Date(), }) .catch((err) => { console.error( `Failed to add system create party message : \n\t Room: ${bodydata.partyName}`, err ); }); await admin .firestore() .collection("rooms") .doc(bodydata.partyName) .collection("users") .doc(bodydata.uid) .set({ admin: true, name: bodydata.userName, }) .catch((err) => { console.error( `Failed to set admin when creating party : \n\t Room: ${bodydata.partyName} \n\t User: ${bodydata.uid}`, err ); }); return res .status(201) .send({ roomId: bodydata.partyName, message: "Started a party!" }); } } return; };