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; };