const VoxeetSecret = require('../VoxeetSecret.json'); const admin = require('firebase-admin'); const fetch = require('node-fetch'); module.exports = async (req, res) => { const bodyData = JSON.parse(req.body); const { key, secret } = VoxeetSecret; const credentials = Buffer.from(encodeURI(key) + ':' + encodeURI(secret)).toString('base64'); const headers = { 'Content-Type': 'application/json', 'Cache-Control': 'no-cache', Authorization: 'Basic ' + credentials, }; const oauth = await fetch(VoxeetSecret.validateURL, { method: 'POST', headers, body: JSON.stringify({ grant_type: 'client_credentials', }), }).then((oauthResponse) => oauthResponse.json()) .catch((err) => res.status(500).send({err, message: 'Unable to generate token for call'})); const [exists, conferencePending, conference, adminOnly, adminUid] = await admin .firestore() .collection('rooms') .doc(req.params.partyName) .get() .then(snap => { const data = snap.exists ? snap.data() : {}; return [snap.exists, data.conferencePending, data.conference, data.adminOnly, data.adminUid]; }); if (exists === true) { if (conference === undefined || conference === null) { if (conferencePending === undefined || conferencePending === null) { if (!adminOnly || (adminOnly && (adminUid === bodyData.uid)) ) { await admin .firestore() .collection('rooms') .doc(req.params.partyName) .update({ conferencePending: bodyData.uid }); await admin .firestore() .collection('rooms') .doc(req.params.partyName) .collection('messages') .add({ uid: '', name: '', text: 'A call session is being created (will be available soon).', time: new Date(), }); } } } if (oauth) res.status(200).send(oauth); } else { res.status(400).send({ message: 'Unable to get party for call.' }); } return; };