From 19a7adf62ce71e14943655497b1bf22337feee31 Mon Sep 17 00:00:00 2001 From: Ayushya Amitabh Date: Thu, 16 Jul 2020 16:13:22 -0400 Subject: [PATCH] v.1.4.3/api update --- app/package.json | 2 +- app/public/manifest.json | 2 +- app/src/Api.js | 4 +- functions/app.js | 21 +-- functions/index.js | 6 +- functions/modules/authenticator.js | 60 ++++---- functions/modules/cleanUpRoom.js | 6 +- functions/modules/createRoom.js | 31 ++-- functions/modules/index.js | 6 + functions/modules/joinRoom.js | 77 ++++++---- functions/modules/scheduledCleanUp.js | 21 ++- functions/modules/timeDiff.js | 2 +- .../{modules2 => modules}/tokenRefresher.js | 0 .../{modules2 => modules}/tokenValidator.js | 0 functions/modules/updatePlayer.js | 58 +++---- .../{modules2 => modules}/updateVoxeet.js | 0 functions/modules2/authenticator.js | 42 ------ functions/modules2/cleanUpRoom.js | 32 ---- functions/modules2/createRoom.js | 65 -------- functions/modules2/deleteRoom.js | 62 -------- functions/modules2/index.js | 29 ---- functions/modules2/joinRoom.js | 141 ------------------ functions/modules2/leaveRoom.js | 19 --- functions/modules2/scheduledCleanUp.js | 44 ------ functions/modules2/sendMessage.js | 46 ------ functions/modules2/timeDiff.js | 7 - functions/modules2/updatePlayer.js | 82 ---------- functions/package.json | 4 +- package.json | 2 +- 29 files changed, 176 insertions(+), 695 deletions(-) rename functions/{modules2 => modules}/tokenRefresher.js (100%) rename functions/{modules2 => modules}/tokenValidator.js (100%) rename functions/{modules2 => modules}/updateVoxeet.js (100%) delete mode 100644 functions/modules2/authenticator.js delete mode 100644 functions/modules2/cleanUpRoom.js delete mode 100644 functions/modules2/createRoom.js delete mode 100644 functions/modules2/deleteRoom.js delete mode 100644 functions/modules2/index.js delete mode 100644 functions/modules2/joinRoom.js delete mode 100644 functions/modules2/leaveRoom.js delete mode 100644 functions/modules2/scheduledCleanUp.js delete mode 100644 functions/modules2/sendMessage.js delete mode 100644 functions/modules2/timeDiff.js delete mode 100644 functions/modules2/updatePlayer.js diff --git a/app/package.json b/app/package.json index b73e710..13be558 100644 --- a/app/package.json +++ b/app/package.json @@ -1,6 +1,6 @@ { "name": "watch-party-crx", - "version": "1.4.2", + "version": "1.4.3", "private": true, "dependencies": { "@giphy/js-fetch-api": "^1.5.8", diff --git a/app/public/manifest.json b/app/public/manifest.json index 10ae023..c962b5a 100644 --- a/app/public/manifest.json +++ b/app/public/manifest.json @@ -1,7 +1,7 @@ { "name": "Watch Party", "short_name": "WP", - "version": "1.4.2", + "version": "1.4.3", "description": "Watch streamed content together.", "background": { "page": "background.html" diff --git a/app/src/Api.js b/app/src/Api.js index 550cc7c..b28a7d3 100644 --- a/app/src/Api.js +++ b/app/src/Api.js @@ -1,8 +1,8 @@ /*global chrome*/ const API_HOST = window.location.href.startsWith('http://localhost') - ? 'http://localhost:5000/watch-party-crx/us-central1/widgets2' - : 'https://us-central1-watch-party-crx.cloudfunctions.net/widgets2'; + ? 'http://localhost:5000/watch-party-crx/us-central1/widgets' + : 'https://us-central1-watch-party-crx.cloudfunctions.net/widgets'; export const PLAYER_STATUS = { PLAYING: 'PLAYING', diff --git a/functions/app.js b/functions/app.js index f1d466d..05fd299 100644 --- a/functions/app.js +++ b/functions/app.js @@ -1,33 +1,22 @@ const FunctionModules = require('./modules/index'); -const FunctionModules2 = require('./modules2/index'); const express = require('express'); const cors = require('cors'); // VERSION 1 +// VERSION 2 const app = express(); app.use(cors({ origin: true })); app.use(FunctionModules.authenticator); +app.get('/validator', FunctionModules.tokenValidator); +app.get('/refresher/:token', FunctionModules.tokenRefresher); app.post('/create', FunctionModules.createRoom); app.post('/join', FunctionModules.joinRoom); app.post('/message', FunctionModules.sendMessage); +app.post('/updatePlayer', FunctionModules.updatePlayer); +app.post('/updateVoxeet', FunctionModules.updateVoxeet); app.delete('/leave/:rid/users/:uid', FunctionModules.leaveRoom); app.delete('/delete/:rid', FunctionModules.deleteRoom); -app.post('/updatePlayer', FunctionModules.updatePlayer); -// VERSION 2 -const app2 = express(); -app2.use(cors({ origin: true })); -app2.use(FunctionModules2.authenticator); -app2.get('/validator', FunctionModules2.tokenValidator); -app2.get('/refresher/:token', FunctionModules2.tokenRefresher); -app2.post('/create', FunctionModules2.createRoom); -app2.post('/join', FunctionModules2.joinRoom); -app2.post('/message', FunctionModules2.sendMessage); -app2.post('/updatePlayer', FunctionModules2.updatePlayer); -app2.post('/updateVoxeet', FunctionModules2.updateVoxeet); -app2.delete('/leave/:rid/users/:uid', FunctionModules2.leaveRoom); -app2.delete('/delete/:rid', FunctionModules2.deleteRoom); module.exports = { v1: app, - v2: app2, }; diff --git a/functions/index.js b/functions/index.js index 33f7cfc..7331905 100644 --- a/functions/index.js +++ b/functions/index.js @@ -1,4 +1,4 @@ -const FunctionModules2 = require('./modules2/index'); +const FunctionModules = require('./modules/index'); const functions = require('firebase-functions'); const secret = require('./FirebaseSecret.json'); const admin = require('firebase-admin'); @@ -14,8 +14,8 @@ admin.initializeApp(FIREBASE_OPTIONS); // VERSION 1 exports.widgets = functions.https.onRequest(REST.v1); // VERSION 2 -exports.widgets2 = functions.https.onRequest(REST.v2); +exports.widgets2 = functions.https.onRequest(REST.v1); exports.scheduledCleanUp = functions.pubsub .schedule('every 60 minutes') - .onRun(FunctionModules2.scheduledCleanUp); + .onRun(FunctionModules.scheduledCleanUp); diff --git a/functions/modules/authenticator.js b/functions/modules/authenticator.js index 9bf1a02..878697c 100644 --- a/functions/modules/authenticator.js +++ b/functions/modules/authenticator.js @@ -6,31 +6,37 @@ module.exports = (req, res, next) => { res.status(200).send(); return next(); } - const token = req.headers.authorization.split(' ')[1]; - const reqToken = token.split(':')[0]; - const reqUid = token.split(':')[1]; - admin - .auth() - .verifyIdToken(reqToken) - .then((user) => { - if (user.uid === reqUid) { - console.info('Verified Token - UID - ', reqUid); - if (req.method === 'POST') { - const bodydata = JSON.parse(req.body); - bodydata.uid = user.uid; - req.body = JSON.stringify(bodydata); - } - if (req.method === 'GET' || req.method === 'DELETE') { - req.body = JSON.stringify({ uid: user.uid }); - } - return next(); - } else { - return res.status(401).send({ message: 'Unauthorized' }); - } - }) - .catch((err) => { - console.error('Failed Auth - ', req.headers.authorization, '\n', err); - return res.status(500).send({ message: 'Unable to verify user token', error: err }); - }); - return null; + if (req.headers.authorization) { + try { + const token = req.headers.authorization.split(' ')[1]; + const reqToken = token.split(':')[0]; + const reqUid = token.split(':')[1]; + admin + .auth() + .verifyIdToken(reqToken) + .then((user) => { + if (user.uid === reqUid) { + console.info('Verified Token - UID - ', reqUid); + if (req.method === 'POST') { + const bodydata = JSON.parse(req.body); + bodydata.uid = user.uid; + req.body = JSON.stringify(bodydata); + } + if (req.method === 'GET' || req.method === 'DELETE') { + req.body = JSON.stringify({ uid: user.uid }); + } + return next(); + } else { + return res.status(401).send({ message: 'Unauthorized' }); + } + }) + .catch((err) => { + console.error('Failed Auth - ', req.headers.authorization, '\n', err); + return res.status(500).send({ message: 'Unable to verify user token' }); + }); + } catch (err) { + console.log(err); + return res.status(401).send({ message: 'Something went wrong when authorizing' }); + } + } else return res.status(401).send({ message: 'Got no user token' }); }; diff --git a/functions/modules/cleanUpRoom.js b/functions/modules/cleanUpRoom.js index f33a8ff..c268db2 100644 --- a/functions/modules/cleanUpRoom.js +++ b/functions/modules/cleanUpRoom.js @@ -1,7 +1,7 @@ const admin = require('firebase-admin'); module.exports = async (roomId) => { - await admin + admin .firestore() .collection('rooms') .doc(roomId) @@ -11,7 +11,7 @@ module.exports = async (roomId) => { .catch((err) => { console.error(`Failed to run auto clean up (delete room messages) @ ${roomId}`, err); }); - await admin + admin .firestore() .collection('rooms') .doc(roomId) @@ -21,7 +21,7 @@ module.exports = async (roomId) => { .catch((err) => { console.error(`Failed to run auto clean up (delete room users) @ ${roomId}`, err); }); - await admin + admin .firestore() .collection('rooms') .doc(roomId) diff --git a/functions/modules/createRoom.js b/functions/modules/createRoom.js index 9e8cd71..eb2353c 100644 --- a/functions/modules/createRoom.js +++ b/functions/modules/createRoom.js @@ -4,16 +4,26 @@ module.exports = async (req, res) => { const bodydata = JSON.parse(req.body); console.log('Requested Create - UID - ', bodydata.uid); if (!bodydata.userName) res.status(400).send({ message: 'Missing user name' }); - const roomId = await admin + if (!bodydata.partyName) res.status(400).send({ message: 'Missing party name' }); + if (!bodydata.partyPin) res.status(400).send({ message: 'Missing party pin' }); + const roomNameTaken = await admin .firestore() .collection('rooms') - .add({ - name: bodydata.roomName, + .doc(bodydata.partyName.replace('/', '\\')) + .get() + .then((docSnap) => docSnap.exists); + if (roomNameTaken) return res.status(409).send({ message: 'That party name is already taken' }); + await admin + .firestore() + .collection('rooms') + .doc(bodydata.partyName) + .set({ + name: bodydata.partyName, + pin: bodydata.partyPin, player: bodydata.player, createdAt: new Date(), updatedAt: new Date(), }) - .then((ref) => ref.id) .catch((err) => { res.status(500).send({ message: 'Unable to start party.' }); console.error(err); @@ -21,7 +31,7 @@ module.exports = async (req, res) => { await admin .firestore() .collection('rooms') - .doc(roomId) + .doc(bodydata.partyName) .collection('messages') .add({ uid: '', @@ -30,12 +40,15 @@ module.exports = async (req, res) => { time: new Date(), }) .catch((err) => { - console.error(`Failed to add system create party message : \n\t Room: ${roomId}`, err); + console.error( + `Failed to add system create party message : \n\t Room: ${bodydata.partyName}`, + err + ); }); await admin .firestore() .collection('rooms') - .doc(roomId) + .doc(bodydata.partyName) .collection('users') .doc(bodydata.uid) .set({ @@ -44,9 +57,9 @@ module.exports = async (req, res) => { }) .catch((err) => { console.error( - `Failed to set admin when creating party : \n\t Room: ${roomId} \n\t User: ${bodydata.uid}`, + `Failed to set admin when creating party : \n\t Room: ${bodydata.partyName} \n\t User: ${bodydata.uid}`, err ); }); - res.status(201).send({ roomId, message: 'Started a party!' }); + res.status(201).send({ roomId: bodydata.partyName, message: 'Started a party!' }); }; diff --git a/functions/modules/index.js b/functions/modules/index.js index aabb20c..19d7b75 100644 --- a/functions/modules/index.js +++ b/functions/modules/index.js @@ -8,6 +8,9 @@ const leaveRoom = require('./leaveRoom'); const deleteRoom = require('./deleteRoom'); const timeDiff = require('./timeDiff'); const updatePlayer = require('./updatePlayer'); +const tokenValidator = require('./tokenValidator'); +const tokenRefresher = require('./tokenRefresher'); +const updateVoxeet = require('./updateVoxeet'); module.exports = { authenticator, @@ -20,4 +23,7 @@ module.exports = { scheduledCleanUp, cleanUpRoom, timeDiff, + tokenValidator, + tokenRefresher, + updateVoxeet, }; diff --git a/functions/modules/joinRoom.js b/functions/modules/joinRoom.js index d68f97d..b1d628b 100644 --- a/functions/modules/joinRoom.js +++ b/functions/modules/joinRoom.js @@ -2,46 +2,72 @@ 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.roomId); - const [exists, roomSource] = await admin + console.log('Requested Join - UID - ', bodydata.uid, '\n\tRoom - ', bodydata.partyName); + // GET ROOM EXISTS, ROOM SOURCE, & ROOM PIN + const [exists, roomSource, roomPin] = await admin .firestore() .collection('rooms') - .doc(bodydata.roomId) + .doc(bodydata.partyName) .get() - .then((roomSnap) => [roomSnap.exists, roomSnap.exists ? roomSnap.data().player.source : '']) + .then((roomSnap) => [ + roomSnap.exists, + roomSnap.exists ? roomSnap.data().player.source : '', + roomSnap.exists ? roomSnap.data().pin : '', + ]) .catch((err) => { console.error( - `Failed to get room when joining room : \n\t Room: ${bodydata.roomId} \n\t User: ${bodydata.uid}`, + `Failed to get room when joining room : \n\t Room: ${bodydata.partyName} \n\t User: ${bodydata.uid}`, err ); }); - const [userExists, userAdmin] = await admin + 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.roomId) + .doc(bodydata.partyName) .collection('users') .doc(bodydata.uid) .get() - .then((userSnap) => [userSnap.exists, userSnap.exists ? userSnap.data().admin : false]) + .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.roomId} \n\t User: ${bodydata.uid}`, + `Failed to get user when joining room : \n\t Room: ${bodydata.partyName} \n\t User: ${bodydata.uid}`, err ); }); - if (userExists && exists && roomSource === bodydata.source) - res.status(200).send({ roomId: bodydata.roomId, message: 'Joined a party' }); + // 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.roomId && + bodydata.partyName && bodydata.userName && - roomSource === bodydata.source + roomSource === bodydata.source && + roomPin === bodydata.partyPin ) { await admin .firestore() .collection('rooms') - .doc(bodydata.roomId) + .doc(bodydata.partyName) .collection('messages') .add({ uid: '', @@ -51,14 +77,14 @@ module.exports = async (req, res) => { }) .catch((err) => { console.error( - `Failed to add system join party message : \n\t Room: ${roomId} \n\t ${bodydata.uid}`, + `Failed to add system join party message : \n\t Room: ${partyName} \n\t ${bodydata.uid}`, err ); }); await admin .firestore() .collection('rooms') - .doc(bodydata.roomId) + .doc(bodydata.partyName) .collection('users') .doc(bodydata.uid) .set({ @@ -67,36 +93,37 @@ module.exports = async (req, res) => { }) .catch((err) => { console.error( - `Failed to set admin when joining party : \n\t Room: ${roomId} \n\t User: ${bodydata.uid}`, + `Failed to set admin when joining party : \n\t Room: ${partyName} \n\t User: ${bodydata.uid}`, err ); }); await admin .firestore() .collection('rooms') - .doc(bodydata.roomId) + .doc(bodydata.partyName) .update({ updatedAt: new Date(), }) .catch((err) => { console.error( - `Failed to set updated time when joining party : \n\t Room: ${roomId} \n\t User: ${bodydata.uid}`, + `Failed to set updated time when joining party : \n\t Room: ${partyName} \n\t User: ${bodydata.uid}`, err ); }); - res.status(200).send({ roomId: bodydata.roomId, message: 'Joined a party' }); - } else if (!userExists && !bodydata.userName) - res.status(400).send({ message: 'Missing user name' }); + 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.roomId) + .doc(bodydata.partyName) .update({ player: { showName: null, - source: roomSource, + source: null, status: 'NOT_PLAYING', time: 0, updatedBy: bodydata.uid, @@ -104,7 +131,7 @@ module.exports = async (req, res) => { }) .catch(() => { console.error( - `Failed to update player source when admin joining party \n\t Room: ${roomId} \n\t User: ${bodydata.uid}` + `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' }); }); diff --git a/functions/modules/scheduledCleanUp.js b/functions/modules/scheduledCleanUp.js index 8fcb181..8bb3a03 100644 --- a/functions/modules/scheduledCleanUp.js +++ b/functions/modules/scheduledCleanUp.js @@ -1,5 +1,13 @@ const admin = require('firebase-admin'); -const FunctionModules = require('./index'); +const cleanUpRoom = require('./cleanUpRoom'); + +const timeDiff = (ds1, ds2) => { + const d1 = new Date(ds1); + const d2 = new Date(ds2); + var diff = (d2.getTime() - d1.getTime()) / 1000; + diff /= 60 * 60; + return Math.abs(Math.round(diff)); +}; module.exports = async () => { const startedTime = new Date(); @@ -19,11 +27,12 @@ module.exports = async () => { .get() .then(async (roomSnap) => { if ( - FunctionModules.timeDiff(roomSnap.createTime.toDate(), startedTime) >= 24 || - FunctionModules.timeDiff(roomSnap.updateTime.toDate(), startedTime) >= 12 - ) - await FunctionModules.cleanUpRoom(roomSnap.id); - console.info(`Deleted room ${roomSnap.id} from auto cleanup`); + timeDiff(roomSnap.createTime.toDate(), startedTime) >= 24 || + timeDiff(roomSnap.updateTime.toDate(), startedTime) >= 12 + ) { + await cleanUpRoom(roomSnap.id); + console.info(`Deleted room ${roomSnap.id} from auto cleanup`); + } return; }) .catch((err) => { diff --git a/functions/modules/timeDiff.js b/functions/modules/timeDiff.js index 5acc187..7c16ead 100644 --- a/functions/modules/timeDiff.js +++ b/functions/modules/timeDiff.js @@ -1,4 +1,4 @@ -module.exports = (ds1, ds2) => { +module.exports = function (ds1, ds2) { const d1 = new Date(ds1); const d2 = new Date(ds2); var diff = (d2.getTime() - d1.getTime()) / 1000; diff --git a/functions/modules2/tokenRefresher.js b/functions/modules/tokenRefresher.js similarity index 100% rename from functions/modules2/tokenRefresher.js rename to functions/modules/tokenRefresher.js diff --git a/functions/modules2/tokenValidator.js b/functions/modules/tokenValidator.js similarity index 100% rename from functions/modules2/tokenValidator.js rename to functions/modules/tokenValidator.js diff --git a/functions/modules/updatePlayer.js b/functions/modules/updatePlayer.js index a38087c..777a155 100644 --- a/functions/modules/updatePlayer.js +++ b/functions/modules/updatePlayer.js @@ -2,18 +2,18 @@ const admin = require('firebase-admin'); module.exports = async (req, res) => { const { player, roomId, uid, showChanged, userName } = JSON.parse(req.body); - const statusString = - player.status === 'PLAYING' - ? 'started playing from' - : player.status === 'PAUSED' - ? 'paused at' - : player.status === 'NOT_PLAYING' - ? 'stopped at' - : 'is at'; - const timeString = - player.time > 3600 - ? new Date(player.time * 1000).toISOString().substr(11, 8) - : new Date(player.time * 1000).toISOString().substr(14, 5); + // const statusString = + // player.status === 'PLAYING' + // ? 'started playing from' + // : player.status === 'PAUSED' + // ? 'paused at' + // : player.status === 'NOT_PLAYING' + // ? 'stopped at' + // : 'is at'; + // const timeString = + // player.time > 3600 + // ? new Date(player.time * 1000).toISOString().substr(11, 8) + // : new Date(player.time * 1000).toISOString().substr(14, 5); const [roomExists, roomData] = await admin .firestore() .collection('rooms') @@ -55,23 +55,23 @@ module.exports = async (req, res) => { console.error(`Failed to update player : \n\t Room: ${roomId} \n\t ${uid}`, err); res.status(500).send({ message: "Uh oh party could't be synced", err }); }); - await admin - .firestore() - .collection('rooms') - .doc(roomId) - .collection('messages') - .add({ - uid: '', - name: '', - text: `${userName} ${statusString} ${timeString}`, - time: new Date(), - }) - .catch((err) => { - console.error( - `Failed to add system update player message : \n\t Room: ${roomId} \n\t ${uid}`, - err - ); - }); + // await admin + // .firestore() + // .collection('rooms') + // .doc(roomId) + // .collection('messages') + // .add({ + // uid: '', + // name: '', + // text: `${userName} ${statusString} ${timeString}`, + // time: new Date(), + // }) + // .catch((err) => { + // console.error( + // `Failed to add system update player message : \n\t Room: ${roomId} \n\t ${uid}`, + // err + // ); + // }); return res.status(200).send({ message: 'Synced party player' }); } else { return res.status(208).send({ message: 'Player already up to date' }); diff --git a/functions/modules2/updateVoxeet.js b/functions/modules/updateVoxeet.js similarity index 100% rename from functions/modules2/updateVoxeet.js rename to functions/modules/updateVoxeet.js diff --git a/functions/modules2/authenticator.js b/functions/modules2/authenticator.js deleted file mode 100644 index 878697c..0000000 --- a/functions/modules2/authenticator.js +++ /dev/null @@ -1,42 +0,0 @@ -const admin = require('firebase-admin'); - -module.exports = (req, res, next) => { - res.set('Access-Control-Allow-Origin', ['*']); - if (req.method === 'OPTIONS') { - res.status(200).send(); - return next(); - } - if (req.headers.authorization) { - try { - const token = req.headers.authorization.split(' ')[1]; - const reqToken = token.split(':')[0]; - const reqUid = token.split(':')[1]; - admin - .auth() - .verifyIdToken(reqToken) - .then((user) => { - if (user.uid === reqUid) { - console.info('Verified Token - UID - ', reqUid); - if (req.method === 'POST') { - const bodydata = JSON.parse(req.body); - bodydata.uid = user.uid; - req.body = JSON.stringify(bodydata); - } - if (req.method === 'GET' || req.method === 'DELETE') { - req.body = JSON.stringify({ uid: user.uid }); - } - return next(); - } else { - return res.status(401).send({ message: 'Unauthorized' }); - } - }) - .catch((err) => { - console.error('Failed Auth - ', req.headers.authorization, '\n', err); - return res.status(500).send({ message: 'Unable to verify user token' }); - }); - } catch (err) { - console.log(err); - return res.status(401).send({ message: 'Something went wrong when authorizing' }); - } - } else return res.status(401).send({ message: 'Got no user token' }); -}; diff --git a/functions/modules2/cleanUpRoom.js b/functions/modules2/cleanUpRoom.js deleted file mode 100644 index f33a8ff..0000000 --- a/functions/modules2/cleanUpRoom.js +++ /dev/null @@ -1,32 +0,0 @@ -const admin = require('firebase-admin'); - -module.exports = async (roomId) => { - await admin - .firestore() - .collection('rooms') - .doc(roomId) - .collection('messages') - .listDocuments() - .then((messages) => messages.forEach((message) => message.delete())) - .catch((err) => { - console.error(`Failed to run auto clean up (delete room messages) @ ${roomId}`, err); - }); - await admin - .firestore() - .collection('rooms') - .doc(roomId) - .collection('users') - .listDocuments() - .then((users) => users.forEach((user) => user.delete())) - .catch((err) => { - console.error(`Failed to run auto clean up (delete room users) @ ${roomId}`, err); - }); - await admin - .firestore() - .collection('rooms') - .doc(roomId) - .delete() - .catch((err) => { - console.error(`Failed to run auto clean up (delete room) @ ${roomId}`, err); - }); -}; diff --git a/functions/modules2/createRoom.js b/functions/modules2/createRoom.js deleted file mode 100644 index 5927774..0000000 --- a/functions/modules2/createRoom.js +++ /dev/null @@ -1,65 +0,0 @@ -const admin = require('firebase-admin'); - -module.exports = async (req, res) => { - const bodydata = JSON.parse(req.body); - console.log('Requested Create - UID - ', bodydata.uid); - if (!bodydata.userName) res.status(400).send({ message: 'Missing user name' }); - if (!bodydata.partyName) res.status(400).send({ message: 'Missing party name' }); - if (!bodydata.partyPin) res.status(400).send({ message: 'Missing party pin' }); - const roomNameTaken = await admin - .firestore() - .collection('rooms') - .doc(bodydata.partyName) - .get() - .then((docSnap) => docSnap.exists); - if (roomNameTaken) return res.status(409).send({ message: 'That party name is already taken' }); - await admin - .firestore() - .collection('rooms') - .doc(bodydata.partyName) - .set({ - name: bodydata.partyName, - pin: bodydata.partyPin, - player: bodydata.player, - createdAt: new Date(), - updatedAt: new Date(), - }) - .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 - ); - }); - res.status(201).send({ roomId: bodydata.partyName, message: 'Started a party!' }); -}; diff --git a/functions/modules2/deleteRoom.js b/functions/modules2/deleteRoom.js deleted file mode 100644 index e0b37fb..0000000 --- a/functions/modules2/deleteRoom.js +++ /dev/null @@ -1,62 +0,0 @@ -const admin = require('firebase-admin'); - -module.exports = async (req, res) => { - console.log('Requested Delete - Room - ', req.params.rid); - console.log(req.body); - const isAdmin = await admin - .firestore() - .collection('rooms') - .doc(req.params.rid) - .collection('users') - .doc(JSON.parse(req.body).uid) - .get() - .then((v) => { - if (v.exists) { - return v.data().admin; - } - return false; - }); - if (!isAdmin) { - console.log('[UNAUTHORIZED] Requested Delete - Room - ', req.params.rid); - res.status(401).send({ message: 'Not authorized to end this party.' }); - return; - } - await admin - .firestore() - .collection('rooms') - .doc(req.params.rid) - .collection('messages') - .listDocuments() - .then((messages) => messages.forEach((message) => message.delete())) - .catch((err) => { - console.error( - `Failed to delete room messages : \n\t Room: ${req.params.rid} \n\t User: ${req.params.uid}`, - err - ); - }); - await admin - .firestore() - .collection('rooms') - .doc(req.params.rid) - .collection('users') - .listDocuments() - .then((users) => users.forEach((user) => user.delete())) - .catch((err) => { - console.error( - `Failed to delete room users : \n\t Room: ${req.params.rid} \n\t User: ${req.params.uid}`, - err - ); - }); - await admin - .firestore() - .collection('rooms') - .doc(req.params.rid) - .delete() - .catch((err) => { - console.error( - `Failed to delete room : \n\t Room: ${req.params.rid} \n\t User: ${req.params.uid}`, - err - ); - }); - res.status(200).send({ message: 'Ended the party' }); -}; diff --git a/functions/modules2/index.js b/functions/modules2/index.js deleted file mode 100644 index 19d7b75..0000000 --- a/functions/modules2/index.js +++ /dev/null @@ -1,29 +0,0 @@ -const authenticator = require('./authenticator'); -const cleanUpRoom = require('./cleanUpRoom'); -const scheduledCleanUp = require('./scheduledCleanUp'); -const createRoom = require('./createRoom'); -const joinRoom = require('./joinRoom'); -const sendMessage = require('./sendMessage'); -const leaveRoom = require('./leaveRoom'); -const deleteRoom = require('./deleteRoom'); -const timeDiff = require('./timeDiff'); -const updatePlayer = require('./updatePlayer'); -const tokenValidator = require('./tokenValidator'); -const tokenRefresher = require('./tokenRefresher'); -const updateVoxeet = require('./updateVoxeet'); - -module.exports = { - authenticator, - createRoom, - joinRoom, - sendMessage, - updatePlayer, - leaveRoom, - deleteRoom, - scheduledCleanUp, - cleanUpRoom, - timeDiff, - tokenValidator, - tokenRefresher, - updateVoxeet, -}; diff --git a/functions/modules2/joinRoom.js b/functions/modules2/joinRoom.js deleted file mode 100644 index b882c70..0000000 --- a/functions/modules2/joinRoom.js +++ /dev/null @@ -1,141 +0,0 @@ -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] = await admin - .firestore() - .collection('rooms') - .doc(bodydata.partyName) - .get() - .then((roomSnap) => [ - roomSnap.exists, - roomSnap.exists ? roomSnap.data().player.source : '', - roomSnap.exists ? roomSnap.data().pin : '', - ]) - .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(body.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: '', - 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: false, - name: bodydata.userName, - }) - .catch((err) => { - console.error( - `Failed to set admin when joining party : \n\t Room: ${partyName} \n\t User: ${bodydata.uid}`, - err - ); - }); - await admin - .firestore() - .collection('rooms') - .doc(bodydata.partyName) - .update({ - updatedAt: new Date(), - }) - .catch((err) => { - console.error( - `Failed to set updated time 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: null, - 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' }); -}; diff --git a/functions/modules2/leaveRoom.js b/functions/modules2/leaveRoom.js deleted file mode 100644 index fe0ba5b..0000000 --- a/functions/modules2/leaveRoom.js +++ /dev/null @@ -1,19 +0,0 @@ -const admin = require('firebase-admin'); - -module.exports = async (req, res) => { - console.log('Requested Leave - UID - ', req.params.uid, '\n\tRoom - ', req.params.rid); - await admin - .firestore() - .collection('rooms') - .doc(req.params.rid) - .collection('users') - .doc(req.params.uid) - .delete() - .catch((err) => - console.error( - `Failed to remove user from party : \n\t Room: ${req.params.rid} \n\t User: ${req.params.uid}`, - err - ) - ); - res.status(200).send({ message: 'Left the party' }); -}; diff --git a/functions/modules2/scheduledCleanUp.js b/functions/modules2/scheduledCleanUp.js deleted file mode 100644 index 605f7c0..0000000 --- a/functions/modules2/scheduledCleanUp.js +++ /dev/null @@ -1,44 +0,0 @@ -const admin = require('firebase-admin'); -const cleanUpRoom = require('./cleanUpRoom'); - -const timeDiff = (ds1, ds2) => { - const d1 = new Date(ds1); - const d2 = new Date(ds2); - var diff = (d2.getTime() - d1.getTime()) / 1000; - diff /= 60 * 60; - return Math.abs(Math.round(diff)); -}; - -module.exports = async () => { - const startedTime = new Date(); - const roomList = await admin - .firestore() - .collection('rooms') - .listDocuments() - .then((rL) => rL) - .catch((err) => { - console.error( - `Failed to run auto clean up (get room list) @ ${new Date().toLocaleTimeString()}`, - err - ); - }); - roomList.forEach((roomRef) => { - roomRef - .get() - .then(async (roomSnap) => { - if ( - timeDiff(roomSnap.createTime.toDate(), startedTime) >= 24 || - timeDiff(roomSnap.updateTime.toDate(), startedTime) >= 12 - ) - await cleanUpRoom(roomSnap.id); - console.info(`Deleted room ${roomSnap.id} from auto cleanup`); - return; - }) - .catch((err) => { - console.error( - `Failed to run auto clean up (get room snap) @ ${new Date().toLocaleTimeString()}`, - err - ); - }); - }); -}; diff --git a/functions/modules2/sendMessage.js b/functions/modules2/sendMessage.js deleted file mode 100644 index d9b4581..0000000 --- a/functions/modules2/sendMessage.js +++ /dev/null @@ -1,46 +0,0 @@ -const admin = require('firebase-admin'); - -module.exports = async (req, res) => { - const { name, text, uid, roomId, type } = JSON.parse(req.body); - - const roomExists = await admin - .firestore() - .collection('rooms') - .doc(roomId) - .get() - .then((roomSnap) => roomSnap.exists); - if (roomExists) { - await admin - .firestore() - .collection('rooms') - .doc(roomId) - .collection('messages') - .add({ - name, - text: text || '', - time: new Date(), - uid, - type: type || '', - }) - .catch((err) => { - console.error(`Failed to send message to party : \n\t Room: ${roomId} \n\t ${uid}`, err); - res.status(500).send({ message: "Couldn't send your message", error: messageErr }); - }); - await admin - .firestore() - .collection('rooms') - .doc(roomId) - .update({ - updatedAt: new Date(), - }) - .catch((err) => { - console.error( - `Failed to set updated time when sending messasge to party : \n\t Room: ${roomId} \n\t User: ${uid}`, - err - ); - }); - res.status(200).send({ message: 'Sent a message' }); - } else { - res.status(404).send({ message: 'Looks like this party is over' }); - } -}; diff --git a/functions/modules2/timeDiff.js b/functions/modules2/timeDiff.js deleted file mode 100644 index 7c16ead..0000000 --- a/functions/modules2/timeDiff.js +++ /dev/null @@ -1,7 +0,0 @@ -module.exports = function (ds1, ds2) { - const d1 = new Date(ds1); - const d2 = new Date(ds2); - var diff = (d2.getTime() - d1.getTime()) / 1000; - diff /= 60 * 60; - return Math.abs(Math.round(diff)); -}; diff --git a/functions/modules2/updatePlayer.js b/functions/modules2/updatePlayer.js deleted file mode 100644 index 777a155..0000000 --- a/functions/modules2/updatePlayer.js +++ /dev/null @@ -1,82 +0,0 @@ -const admin = require('firebase-admin'); - -module.exports = async (req, res) => { - const { player, roomId, uid, showChanged, userName } = JSON.parse(req.body); - // const statusString = - // player.status === 'PLAYING' - // ? 'started playing from' - // : player.status === 'PAUSED' - // ? 'paused at' - // : player.status === 'NOT_PLAYING' - // ? 'stopped at' - // : 'is at'; - // const timeString = - // player.time > 3600 - // ? new Date(player.time * 1000).toISOString().substr(11, 8) - // : new Date(player.time * 1000).toISOString().substr(14, 5); - const [roomExists, roomData] = await admin - .firestore() - .collection('rooms') - .doc(roomId) - .get() - .then((docSnap) => [docSnap.exists, docSnap.data()]); - if (!roomExists) return res.status(404).send({ message: 'Party not found.' }); - const userExists = await admin - .firestore() - .collection('rooms') - .doc(roomId) - .collection('users') - .doc(uid) - .get() - .then((userSnap) => userSnap.exists); - if (userExists) { - if (showChanged === true) { - await admin - .firestore() - .collection('rooms') - .doc(roomId) - .collection('messages') - .add({ - uid: '', - name: '', - text: `${userName} changed \n${player.showName ? 'to ' + player.showName : ''}`, - time: new Date(), - }); - } - if (roomData.status !== player.status) { - await admin - .firestore() - .collection('rooms') - .doc(roomId) - .update({ - player, - }) - .catch((err) => { - console.error(`Failed to update player : \n\t Room: ${roomId} \n\t ${uid}`, err); - res.status(500).send({ message: "Uh oh party could't be synced", err }); - }); - // await admin - // .firestore() - // .collection('rooms') - // .doc(roomId) - // .collection('messages') - // .add({ - // uid: '', - // name: '', - // text: `${userName} ${statusString} ${timeString}`, - // time: new Date(), - // }) - // .catch((err) => { - // console.error( - // `Failed to add system update player message : \n\t Room: ${roomId} \n\t ${uid}`, - // err - // ); - // }); - return res.status(200).send({ message: 'Synced party player' }); - } else { - return res.status(208).send({ message: 'Player already up to date' }); - } - } else { - return res.status(401).send({ message: 'Not in room to sync' }); - } -}; diff --git a/functions/package.json b/functions/package.json index 323ab0d..fead5f1 100644 --- a/functions/package.json +++ b/functions/package.json @@ -1,6 +1,6 @@ { "name": "watch-party-api", - "version": "1.4.2", + "version": "1.4.3", "description": "Cloud Functions for Watch Party", "scripts": { "lint": "eslint .", @@ -11,7 +11,7 @@ "logs": "firebase functions:log" }, "engines": { - "node": "8" + "node": "10" }, "dependencies": { "cors": "^2.8.5", diff --git a/package.json b/package.json index 2d4ce45..8651df8 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "watch-party", - "version": "1.4.2", + "version": "1.4.3", "description": "Watch Party", "scripts": { "start": "firebase emulators:start",