|
@@ -13,14 +13,6 @@ const stations = require('../stations');
|
|
|
const songs = require('../songs');
|
|
|
const hooks = require('./hooks');
|
|
|
|
|
|
-cache.sub('station.locked', stationId => {
|
|
|
- io.io.to(`station.${stationId}`).emit("event:stations.locked");
|
|
|
-});
|
|
|
-
|
|
|
-cache.sub('station.unlocked', stationId => {
|
|
|
- io.io.to(`station.${stationId}`).emit("event:stations.unlocked");
|
|
|
-});
|
|
|
-
|
|
|
cache.sub('station.pause', stationId => {
|
|
|
io.io.to(`station.${stationId}`).emit("event:stations.pause");
|
|
|
});
|
|
@@ -41,8 +33,34 @@ cache.sub('station.queueUpdate', stationId => {
|
|
|
|
|
|
cache.sub('station.create', stationId => {
|
|
|
stations.initializeStation(stationId, (err, station) => {
|
|
|
+ console.log("*************", err, station);
|
|
|
//TODO Emit to admin station page
|
|
|
- io.io.to('home').emit("event:stations.created", station);
|
|
|
+
|
|
|
+ // TODO If community, check if on whitelist
|
|
|
+ console.log("*************", station.privacy);
|
|
|
+ if (station.privacy === 'public') io.io.to('home').emit("event:stations.created", station);
|
|
|
+ else {
|
|
|
+ let sockets = io.io.to('home').sockets;
|
|
|
+ console.log("*************", sockets.length);
|
|
|
+ for (let socketId in sockets) {
|
|
|
+ let socket = sockets[socketId];
|
|
|
+ let session = sockets[socketId].session;
|
|
|
+ console.log("*************", session);
|
|
|
+ if (session.sessionId) {
|
|
|
+ cache.hget('sessions', session.sessionId, (err, session) => {
|
|
|
+ console.log("*************", err, session);
|
|
|
+ if (!err && session) {
|
|
|
+ console.log("*************");
|
|
|
+ db.models.user.findOne({_id: session.userId}, (err, user) => {
|
|
|
+ console.log("*************", err, user.role, station.type, station.owner, session.userId);
|
|
|
+ if (user.role === 'admin') socket.emit("event:stations.created", station);
|
|
|
+ else if (station.type === "community" && station.owner === session.userId) socket.emit("event:stations.created", station);
|
|
|
+ });
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
});
|
|
|
});
|
|
|
|
|
@@ -56,8 +74,6 @@ module.exports = {
|
|
|
* @return {{ status: String, stations: Array }}
|
|
|
*/
|
|
|
index: (session, cb) => {
|
|
|
- // TODO: the logic should be a bit more personalized to the users preferred genres
|
|
|
- // and it should probably just a different cache table then 'stations'
|
|
|
cache.hgetall('stations', (err, stations) => {
|
|
|
|
|
|
if (err && err !== true) {
|
|
@@ -72,6 +88,7 @@ module.exports = {
|
|
|
for (let prop in stations) {
|
|
|
// TODO If community, check if on whitelist
|
|
|
let station = stations[prop];
|
|
|
+ console.log(station)
|
|
|
if (station.privacy === 'public') add(true, station);
|
|
|
else if (!session.sessionId) add(false);
|
|
|
else {
|
|
@@ -129,9 +146,7 @@ module.exports = {
|
|
|
|
|
|
stations.getStation(stationId, (err, station) => {
|
|
|
|
|
|
- if (err && err !== true) {
|
|
|
- return cb({ status: 'error', message: 'An error occurred while joining the station' });
|
|
|
- }
|
|
|
+ if (err && err !== true) return cb({ status: 'error', message: 'An error occurred while joining the station' });
|
|
|
|
|
|
if (station) {
|
|
|
|
|
@@ -172,7 +187,10 @@ module.exports = {
|
|
|
timePaused: station.timePaused,
|
|
|
description: station.description,
|
|
|
displayName: station.displayName,
|
|
|
- privacy: station.privacy
|
|
|
+ privacy: station.privacy,
|
|
|
+ partyMode: station.partyMode,
|
|
|
+ owner: station.owner,
|
|
|
+ privatePlaylist: station.privatePlaylist
|
|
|
}
|
|
|
});
|
|
|
});
|
|
@@ -187,7 +205,8 @@ module.exports = {
|
|
|
timePaused: station.timePaused,
|
|
|
description: station.description,
|
|
|
displayName: station.displayName,
|
|
|
- privacy: station.privacy
|
|
|
+ privacy: station.privacy,
|
|
|
+ owner: station.owner
|
|
|
}
|
|
|
});
|
|
|
}
|
|
@@ -234,7 +253,7 @@ module.exports = {
|
|
|
});
|
|
|
},*/
|
|
|
|
|
|
- forceSkip: hooks.adminRequired((session, stationId, cb) => {
|
|
|
+ forceSkip: hooks.ownerRequired((session, stationId, cb) => {
|
|
|
stations.getStation(stationId, (err, station) => {
|
|
|
|
|
|
if (err && err !== true) {
|
|
@@ -280,7 +299,7 @@ module.exports = {
|
|
|
});
|
|
|
},
|
|
|
|
|
|
- updateDisplayName: hooks.adminRequired((session, stationId, newDisplayName, cb) => {
|
|
|
+ updateDisplayName: hooks.ownerRequired((session, stationId, newDisplayName, cb) => {
|
|
|
db.models.station.update({_id: stationId}, {$set: {displayName: newDisplayName}}, (err) => {
|
|
|
if (err) return cb({ status: 'failure', message: 'Something went wrong when saving the station.' });
|
|
|
stations.updateStation(stationId, () => {
|
|
@@ -290,7 +309,7 @@ module.exports = {
|
|
|
});
|
|
|
}),
|
|
|
|
|
|
- updateDescription: hooks.adminRequired((session, stationId, newDescription, cb) => {
|
|
|
+ updateDescription: hooks.ownerRequired((session, stationId, newDescription, cb) => {
|
|
|
db.models.station.update({_id: stationId}, {$set: {description: newDescription}}, (err) => {
|
|
|
if (err) return cb({ status: 'failure', message: 'Something went wrong when saving the station.' });
|
|
|
stations.updateStation(stationId, () => {
|
|
@@ -300,7 +319,7 @@ module.exports = {
|
|
|
});
|
|
|
}),
|
|
|
|
|
|
- updatePrivacy: hooks.adminRequired((session, stationId, newPrivacy, cb) => {
|
|
|
+ updatePrivacy: hooks.ownerRequired((session, stationId, newPrivacy, cb) => {
|
|
|
db.models.station.update({_id: stationId}, {$set: {privacy: newPrivacy}}, (err) => {
|
|
|
if (err) return cb({ status: 'failure', message: 'Something went wrong when saving the station.' });
|
|
|
stations.updateStation(stationId, () => {
|
|
@@ -310,7 +329,22 @@ module.exports = {
|
|
|
});
|
|
|
}),
|
|
|
|
|
|
- pause: hooks.adminRequired((session, stationId, cb) => {
|
|
|
+ updatePartyMode: hooks.ownerRequired((session, stationId, newPartyMode, cb) => {
|
|
|
+ stations.getStation(stationId, (err, station) => {
|
|
|
+ if (err) return cb({ status: 'failure', message: err });
|
|
|
+ if (station.partyMode === newPartyMode) return cb({ status: 'failure', message: 'The party mode was already ' + ((newPartyMode) ? 'enabled.' : 'disabled.') });
|
|
|
+ db.models.station.update({_id: stationId}, {$set: {partyMode: newPartyMode}}, (err) => {
|
|
|
+ if (err) return cb({ status: 'failure', message: 'Something went wrong when saving the station.' });
|
|
|
+ stations.updateStation(stationId, () => {
|
|
|
+ //TODO Pub/sub for privacy change
|
|
|
+ stations.skipStation(stationId)();
|
|
|
+ cb({ status: 'success', message: 'Successfully updated the party mode.' });
|
|
|
+ })
|
|
|
+ });
|
|
|
+ });
|
|
|
+ }),
|
|
|
+
|
|
|
+ pause: hooks.ownerRequired((session, stationId, cb) => {
|
|
|
stations.getStation(stationId, (err, station) => {
|
|
|
if (err && err !== true) {
|
|
|
return cb({ status: 'error', message: 'An error occurred while pausing the station' });
|
|
@@ -336,7 +370,7 @@ module.exports = {
|
|
|
});
|
|
|
}),
|
|
|
|
|
|
- resume: hooks.adminRequired((session, stationId, cb) => {
|
|
|
+ resume: hooks.ownerRequired((session, stationId, cb) => {
|
|
|
stations.getStation(stationId, (err, station) => {
|
|
|
if (err && err !== true) {
|
|
|
return cb({ status: 'error', message: 'An error occurred while resuming the station' });
|
|
@@ -360,14 +394,17 @@ module.exports = {
|
|
|
});
|
|
|
}),
|
|
|
|
|
|
- remove: hooks.adminRequired((session, stationId, cb) => {
|
|
|
- db.models.station.remove({ _id: stationId });
|
|
|
- cache.hdel('stations', stationId, () => {
|
|
|
- return cb({ status: 'success', message: 'Station successfully removed' });
|
|
|
+ remove: hooks.ownerRequired((session, stationId, cb) => {
|
|
|
+ db.models.station.remove({ _id: stationId }, (err) => {
|
|
|
+ console.log(err, stationId);
|
|
|
+ if (err) return cb({status: 'failure', message: 'Something went wrong when deleting that station.'});
|
|
|
+ cache.hdel('stations', stationId, () => {
|
|
|
+ return cb({ status: 'success', message: 'Station successfully removed' });
|
|
|
+ });
|
|
|
});
|
|
|
}),
|
|
|
|
|
|
- create: hooks.adminRequired((session, data, cb) => {
|
|
|
+ create: hooks.loginRequired((session, data, cb) => {
|
|
|
async.waterfall([
|
|
|
|
|
|
(next) => {
|
|
@@ -385,61 +422,41 @@ module.exports = {
|
|
|
|
|
|
(station, next) => {
|
|
|
if (station) return next({ 'status': 'failure', 'message': 'A station with that id already exists' });
|
|
|
- const { _id, displayName, description, genres, playlist } = data;
|
|
|
- db.models.station.create({
|
|
|
- _id,
|
|
|
- displayName,
|
|
|
- description,
|
|
|
- type: "official",
|
|
|
- playlist,
|
|
|
- genres,
|
|
|
- currentSong: stations.defaultSong
|
|
|
- }, next);
|
|
|
+ const { _id, displayName, description, genres, playlist, type } = data;
|
|
|
+ if (type == 'official') {
|
|
|
+ db.models.station.create({
|
|
|
+ _id,
|
|
|
+ displayName,
|
|
|
+ description,
|
|
|
+ type,
|
|
|
+ privacy: 'private',
|
|
|
+ playlist,
|
|
|
+ genres,
|
|
|
+ currentSong: stations.defaultSong
|
|
|
+ }, next);
|
|
|
+ } else if (type == 'community') {
|
|
|
+ cache.hget('sessions', session.sessionId, (err, session) => {
|
|
|
+ db.models.station.create({
|
|
|
+ _id,
|
|
|
+ displayName,
|
|
|
+ description,
|
|
|
+ type,
|
|
|
+ privacy: 'private',
|
|
|
+ owner: session.userId,
|
|
|
+ queue: [],
|
|
|
+ currentSong: null
|
|
|
+ }, next);
|
|
|
+ });
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
], (err, station) => {
|
|
|
- if (err) {console.log(err); return cb({ 'status': 'failure', 'message': 'Something went wrong.'});}
|
|
|
- cache.pub('station.create', data._id);
|
|
|
+ if (err) console.log(err); return cb({ 'status': 'failure', 'message': 'Something went wrong.'});
|
|
|
return cb(null, { 'status': 'success', 'message': 'Successfully created station.' });
|
|
|
- });
|
|
|
- }),
|
|
|
-
|
|
|
- createCommunity: hooks.loginRequired((session, data, cb) => {
|
|
|
- async.waterfall([
|
|
|
-
|
|
|
- (next) => {
|
|
|
- return (data) ? next() : cb({ 'status': 'failure', 'message': 'Invalid data' });
|
|
|
- },
|
|
|
-
|
|
|
- // check the cache for the station
|
|
|
- (next) => cache.hget('stations', data._id, next),
|
|
|
-
|
|
|
- // if the cached version exist
|
|
|
- (station, next) => {
|
|
|
- if (station) return next({ 'status': 'failure', 'message': 'A station with that id already exists' });
|
|
|
- db.models.station.findOne({ _id: data._id }, next);
|
|
|
- },
|
|
|
-
|
|
|
- (station, next) => {
|
|
|
- if (station) return next({ 'status': 'failure', 'message': 'A station with that id already exists' });
|
|
|
- const { _id, displayName, description } = data;
|
|
|
- db.models.station.create({
|
|
|
- _id,
|
|
|
- displayName,
|
|
|
- description,
|
|
|
- type: "community",
|
|
|
- queue: [],
|
|
|
- currentSong: null
|
|
|
- }, next);
|
|
|
- }
|
|
|
-
|
|
|
- ], (err, station) => {
|
|
|
- if (err) console.error(err);
|
|
|
cache.pub('station.create', data._id);
|
|
|
- return cb({ 'status': 'success', 'message': 'Successfully created station.' });
|
|
|
});
|
|
|
}),
|
|
|
-
|
|
|
+
|
|
|
addToQueue: hooks.loginRequired((session, stationId, songId, cb, userId) => {
|
|
|
stations.getStation(stationId, (err, station) => {
|
|
|
if (err) return cb(err);
|
|
@@ -481,7 +498,7 @@ module.exports = {
|
|
|
});
|
|
|
}),
|
|
|
|
|
|
- removeFromQueue: hooks.adminRequired((session, stationId, songId, cb, userId) => {
|
|
|
+ removeFromQueue: hooks.ownerRequired((session, stationId, songId, cb, userId) => {
|
|
|
stations.getStation(stationId, (err, station) => {
|
|
|
if (err) return cb(err);
|
|
|
if (station.type === 'community') {
|
|
@@ -513,4 +530,26 @@ module.exports = {
|
|
|
});
|
|
|
}),
|
|
|
|
|
|
+ selectPrivatePlaylist: hooks.csOwnerRequired((session, stationId, playlistId, cb, userId) => {
|
|
|
+ stations.getStation(stationId, (err, station) => {
|
|
|
+ if (err) return cb(err);
|
|
|
+ if (station.type === 'community') {
|
|
|
+ if (station.privatePlaylist === playlistId) return cb({'status': 'failure', 'message': 'That playlist is already selected.'});
|
|
|
+ db.models.playlist.findOne({_id: playlistId}, (err, playlist) => {
|
|
|
+ if (err) return cb(err);
|
|
|
+ if (playlist) {
|
|
|
+ db.models.station.update({_id: stationId}, {$set: {privatePlaylist: playlistId, currentSongIndex: 0}}, (err) => {
|
|
|
+ if (err) return cb(err);
|
|
|
+ stations.updateStation(stationId, (err, station) => {
|
|
|
+ if (err) return cb(err);
|
|
|
+ stations.skipStation(stationId)();
|
|
|
+ cb({'status': 'success', 'message': 'Playlist selected.'});
|
|
|
+ });
|
|
|
+ });
|
|
|
+ } else cb({'status': 'failure', 'message': 'Playlist not found.'});
|
|
|
+ });
|
|
|
+ } else cb({'status': 'failure', 'message': 'That station is not a community station.'});
|
|
|
+ });
|
|
|
+ }),
|
|
|
+
|
|
|
};
|