v1.6.0/conference call upgrade

- anyone can start call
- colision check for calls
- better error handing for calls
This commit is contained in:
2020-08-02 01:11:48 -04:00
parent c80a99cea1
commit 86ee168045
9 changed files with 184 additions and 51 deletions
+47 -4
View File
@@ -1,6 +1,9 @@
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 = {
@@ -14,8 +17,48 @@ module.exports = async (req, res) => {
body: JSON.stringify({
grant_type: 'client_credentials',
}),
})
.then((oauthResponse) => oauthResponse.json())
.catch((err) => res.status(500).send(err));
if (oauth) res.status(200).send(oauth);
}).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: '<system>',
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;
};
+54 -33
View File
@@ -1,47 +1,68 @@
const admin = require('firebase-admin');
module.exports = async (req, res) => {
const { conference, partyName, partyPin, userName } = JSON.parse(req.body);
const { conference, partyName, partyPin, userName, uid } = JSON.parse(req.body);
// GET ROOM PIN
const roomPin = await admin
const [exists, roomPin, conferencePending, partyConference] = await admin
.firestore()
.collection('rooms')
.doc(partyName)
.get()
.then((roomSnap) => (roomSnap.exists ? roomSnap.data().pin : null));
.then((roomSnap) => {
const data = roomSnap.exists ? roomSnap.data() : {};
return [roomSnap.exists, data.pin, data.conferencePending, data.conference];
});
// CHECK IF ROOM EXISTS
if (roomPin) {
// CHECK FOR CORRECT PIN
if (roomPin === partyPin) {
// UPDATE CONFERENCE DETAILS
await admin
.firestore()
.collection('rooms')
.doc(partyName)
.update({ conference })
.catch((err) =>
res.status(500).send({ message: 'Unable to update the call details', error: err })
);
// ADD SYSTEM MESSAGE
await admin
.firestore()
.collection('rooms')
.doc(partyName)
.collection('messages')
.add({
uid: '<system>',
name: '',
text: `${userName} started the call.`,
time: new Date(),
})
.catch((err) => console.error('Failed to add update conference message', err));
res.status(200).send({ message: 'Started the conference' });
} else {
// WRONG ROOM PIN
return res.status(401).send({ message: 'Wrong party pin, try rejoining' });
if (exists === true) {
if (roomPin) {
// CHECK FOR CORRECT PIN
if (roomPin === partyPin) {
if (conferencePending) {
if (conferencePending === uid) {
// UPDATE CONFERENCE DETAILS
await admin
.firestore()
.collection('rooms')
.doc(partyName)
.update({ conference })
.catch((err) =>
res.status(500).send({ message: 'Unable to update the call details', error: err })
);
// REMOVE PENDING STATUS
await admin
.firestore()
.collection('rooms')
.doc(partyName)
.update({ conferencePending : admin.firestore.FieldValue.delete() })
.catch((err) => console.error('Failed to remove pending status', err));
// ADD SYSTEM MESSAGE
await admin
.firestore()
.collection('rooms')
.doc(partyName)
.collection('messages')
.add({
uid: '<system>',
name: '',
text: `${userName} started the call, everyone can join now.`,
time: new Date(),
})
.catch((err) => console.error('Failed to add update conference message', err));
res.status(200).send({ message: 'Started the conference' });
} else {
res.status(409).send({ message: 'Looks like someone is already starting a call' });
}
} else if (partyConference) {
res.status(409).send({ message: 'Call already exists', conference: partyConference });
}
} else {
// WRONG ROOM PIN
res.status(401).send({ message: 'Wrong party pin, try rejoining' });
}
}
} else {
// ROOM DOESN'T EXIST
return res.status(404).send({ message: 'Party Not Found' });
res.status(404).send({ message: 'Party Not Found' });
}
return;
};