Re-worked playlistHandler.js for site-wide playlist collections.

This commit is contained in:
rainbow napkin 2026-06-23 03:56:33 -04:00
parent 0b7f99725d
commit 7530b5fa5f
2 changed files with 210 additions and 114 deletions

View file

@ -79,12 +79,12 @@ class playlistHandler{
/** /**
* Validates client requests involving playlist names * Validates client requests involving playlist names
* @param {Socket} socket - Newly connected socket to define listeners against * @param {Socket} socket - Newly connected socket to define listeners against
* @param {Object} data - Data handed over from the client * @param {Object} playlist - String containing raw playlist title
* @returns {String} returns escaped/trimmed name upon success * @returns {String} returns escaped/trimmed name upon success
*/ */
playlistTitleValidator(socket, data){ playlistTitleValidator(socket, playlist){
//If the title is too long //If the title is too long
if(typeof data.playlist != 'string' || !validator.isLength(data.playlist, {min: 1, max:30})){ if(typeof playlist != 'string' || !validator.isLength(playlist, {min: 1, max:30})){
//Bitch, moan, complain... //Bitch, moan, complain...
loggerUtils.socketErrorHandler(socket, "Invalid Playlist Name!", "validation"); loggerUtils.socketErrorHandler(socket, "Invalid Playlist Name!", "validation");
//and ignore it! //and ignore it!
@ -92,7 +92,7 @@ class playlistHandler{
} }
//Escape/trim the playlist name //Escape/trim the playlist name
return validator.escape(validator.trim(data.playlist)); return validator.escape(validator.trim(playlist));
} }
//Validation/Sanatization functions //Validation/Sanatization functions
@ -107,7 +107,7 @@ class playlistHandler{
const safeTitles = []; const safeTitles = [];
//Validate title //Validate title
const playlist = this.playlistTitleValidator(socket, data); const playlist = this.playlistTitleValidator(socket, data.playlist);
//If title is bad //If title is bad
if(playlist == null){ if(playlist == null){
@ -242,7 +242,17 @@ class playlistHandler{
*/ */
async getChannelPlaylists(socket){ async getChannelPlaylists(socket){
try{ try{
const playlists = await channelPlaylistModel.find({channel: this.channel._id}); //pull all of the channels playlists
const foundPlaylists = await channelPlaylistModel.find({channel: this.channel._id});
//Create a new array to hold dehydated playlists
const playlists = [];
//For each found playlist
for(let playlist of foundPlaylists){
//Dehydrate it and put it in our lists of playlist to send to the user
playlists.push(playlist.dehydrate());
}
//Return playlists //Return playlists
socket.emit('chanPlaylists', playlists); socket.emit('chanPlaylists', playlists);
@ -257,7 +267,17 @@ class playlistHandler{
*/ */
async getUserPlaylists(socket){ async getUserPlaylists(socket){
try{ try{
const playlists = await userPlaylistModel.find({user: socket.request.session.user._id}); //pull all of users playlists
const foundPlaylists = await userPlaylistModel.find({user: socket.request.session.user._id});
//Create a new array to hold dehydated playlists
const playlists = [];
//For each found playlist
for(let playlist of foundPlaylists){
//Dehydrate it and put it in our lists of playlist to send to the user
playlists.push(playlist.dehydrate());
}
//Return playlists //Return playlists
socket.emit('userPlaylists', playlists); socket.emit('userPlaylists', playlists);
@ -372,7 +392,7 @@ class playlistHandler{
try{ try{
//Validate playlist name //Validate playlist name
const playlist = this.playlistTitleValidator(socket, data); const playlist = this.playlistTitleValidator(socket, data.playlist);
//If playlist title isnt valid //If playlist title isnt valid
if(playlist == null){ if(playlist == null){
@ -416,7 +436,7 @@ class playlistHandler{
try{ try{
//Validate playlist name //Validate playlist name
const playlist = this.playlistTitleValidator(socket, data); const playlist = this.playlistTitleValidator(socket, data.playlist);
//If playlist title isnt valid //If playlist title isnt valid
if(playlist == null){ if(playlist == null){
@ -454,7 +474,7 @@ class playlistHandler{
async addToChannelPlaylist(socket, data, chanDB){ async addToChannelPlaylist(socket, data, chanDB){
try{ try{
//Validate playlist name //Validate playlist name
const playlist = this.playlistTitleValidator(socket, data); const playlist = this.playlistTitleValidator(socket, data.playlist);
//If playlist title isnt valid //If playlist title isnt valid
if(playlist == null){ if(playlist == null){
@ -512,7 +532,7 @@ class playlistHandler{
async addToUserPlaylist(socket, data){ async addToUserPlaylist(socket, data){
try{ try{
//Validate playlist name //Validate playlist name
const playlist = this.playlistTitleValidator(socket, data); const playlist = this.playlistTitleValidator(socket, data.playlist);
//syntatic suger XP //syntatic suger XP
const userID = socket.request.session.user._id; const userID = socket.request.session.user._id;
@ -565,7 +585,7 @@ class playlistHandler{
async queueChannelPlaylist(socket, data, chanDB){ async queueChannelPlaylist(socket, data, chanDB){
try{ try{
//Validate playlist name //Validate playlist name
const playlist = this.playlistTitleValidator(socket, data); const playlist = this.playlistTitleValidator(socket, data.playlist);
//If playlist title isnt valid //If playlist title isnt valid
if(playlist == null){ if(playlist == null){
@ -622,14 +642,13 @@ class playlistHandler{
* Queues an entire user playlist * Queues an entire user playlist
* @param {Socket} socket - Requesting socket * @param {Socket} socket - Requesting socket
* @param {Object} data - Data handed over from the client * @param {Object} data - Data handed over from the client
* @param {Mongoose.Document} userDB - User Document Passthrough to save on DB Access
* @param {Mongoose.Document} chanDB - Channel Document Passthrough to save on DB Access * @param {Mongoose.Document} chanDB - Channel Document Passthrough to save on DB Access
*/ */
async queueUserPlaylist(socket, data, userDB, chanDB){ async queueUserPlaylist(socket, data, chanDB){
try{ try{
//Validate playlist name //Validate playlist name
const playlist = this.playlistTitleValidator(socket, data); const playlist = this.playlistTitleValidator(socket, data.playlist);
//syntatic suger XP //syntatic suger XP
const userID = socket.request.session.user._id; const userID = socket.request.session.user._id;
@ -639,12 +658,6 @@ class playlistHandler{
return; return;
} }
//if we wherent handed a user document
if(userDB == null){
//Find the user in the Database
userDB = await userModel.findOne({user: socket.request.session.user.user});
}
//if we wherent handed a channel document //if we wherent handed a channel document
if(chanDB == null){ if(chanDB == null){
//Pull it based on channel name //Pull it based on channel name
@ -707,6 +720,14 @@ class playlistHandler{
return; return;
} }
//Validate playlist name
const playlist = this.playlistTitleValidator(socket, data.playlist);
//If playlist title isnt valid
if(playlist == null){
return;
}
//if we wherent handed a channel document //if we wherent handed a channel document
if(chanDB == null){ if(chanDB == null){
//Pull it based on channel name //Pull it based on channel name
@ -715,11 +736,11 @@ class playlistHandler{
//Permcheck the user //Permcheck the user
if((!this.channel.queue.locked && await chanDB.permCheck(socket.user, 'scheduleMedia')) || await chanDB.permCheck(socket.user, 'scheduleAdmin')){ if((!this.channel.queue.locked && await chanDB.permCheck(socket.user, 'scheduleMedia')) || await chanDB.permCheck(socket.user, 'scheduleAdmin')){
//Grab playlist //Check for existing playlists of the same name
const playlist = chanDB.getPlaylistByName(data.playlist); const foundPlaylist = await channelPlaylistModel.findOne({channel: this.channel._id, name: playlist});
//If we didn't find a real playlist //If we didn't find a real playlist
if(playlist == null){ if(foundPlaylist == null){
//Bitch, moan, complain... //Bitch, moan, complain...
loggerUtils.socketErrorHandler(socket, "Playlist not found!", "validation"); loggerUtils.socketErrorHandler(socket, "Playlist not found!", "validation");
//and ignore it! //and ignore it!
@ -727,10 +748,10 @@ class playlistHandler{
} }
//Pull and rehydrate media from playlist //Pull and rehydrate media from playlist
const media = playlist.findMediaByUUID(data.uuid).rehydrate(); const media = foundPlaylist.findMediaByUUID(data.uuid).rehydrate();
//Set title from default titles //Set title from default titles
media.title = playlist.pickDefaultTitle(media.title); media.title = foundPlaylist.pickDefaultTitle(media.title);
//Queue found media //Queue found media
this.channel.queue.scheduleMedia(queuedMedia.fromMediaArray([media], start), socket, chanDB); this.channel.queue.scheduleMedia(queuedMedia.fromMediaArray([media], start), socket, chanDB);
@ -744,10 +765,9 @@ class playlistHandler{
* Queues media from a given user playlist * Queues media from a given user playlist
* @param {Socket} socket - Requesting socket * @param {Socket} socket - Requesting socket
* @param {Object} data - Data handed over from the client * @param {Object} data - Data handed over from the client
* @param {Mongoose.Document} userDB - User Document Passthrough to save on DB Access
* @param {Mongoose.Document} chanDB - Channel Document Passthrough to save on DB Access * @param {Mongoose.Document} chanDB - Channel Document Passthrough to save on DB Access
*/ */
async queueFromUserPlaylist(socket, data, userDB, chanDB){ async queueFromUserPlaylist(socket, data, chanDB){
try{ try{
//Validate data //Validate data
const start = this.queueFromChannelPlaylistValidator(socket, data); const start = this.queueFromChannelPlaylistValidator(socket, data);
@ -758,10 +778,15 @@ class playlistHandler{
return; return;
} }
//if we wherent handed a user document //Validate playlist name
if(userDB == null){ const playlist = this.playlistTitleValidator(socket, data.playlist);
//Find the user in the Database
userDB = await userModel.findOne({user: socket.request.session.user.user}); //syntatic suger XP
const userID = socket.request.session.user._id;
//If playlist title isnt valid
if(playlist == null){
return;
} }
//if we wherent handed a channel document //if we wherent handed a channel document
@ -772,22 +797,22 @@ class playlistHandler{
//Permcheck the user //Permcheck the user
if((!this.channel.queue.locked && await chanDB.permCheck(socket.user, 'scheduleMedia')) || await chanDB.permCheck(socket.user, 'scheduleAdmin')){ if((!this.channel.queue.locked && await chanDB.permCheck(socket.user, 'scheduleMedia')) || await chanDB.permCheck(socket.user, 'scheduleAdmin')){
//Grab playlist //Check for existing playlists of the same name
const playlist = userDB.getPlaylistByName(data.playlist); const foundPlaylist = await userPlaylistModel.findOne({user: userID, name: playlist});
//If we didn't find a real playlist //If the channel doesn't exist
if(playlist == null){ if(foundPlaylist == null){
//Bitch, moan, complain... //Bitch, moan, complain...
loggerUtils.socketErrorHandler(socket, "Playlist not found!", "validation"); loggerUtils.socketErrorHandler(socket, `Playlist not found!`, "validation");
//and ignore it! //and ignore it!
return; return;
} }
//Pull and rehydrate media from playlist //Pull and rehydrate media from playlist
const media = playlist.findMediaByUUID(data.uuid).rehydrate(); const media = foundPlaylist.findMediaByUUID(data.uuid).rehydrate();
//Set title from default titles //Set title from default titles
media.title = playlist.pickDefaultTitle(media.title); media.title = foundPlaylist.pickDefaultTitle(media.title);
//Queue found media //Queue found media
this.channel.queue.scheduleMedia(queuedMedia.fromMediaArray([media], start), socket, chanDB); this.channel.queue.scheduleMedia(queuedMedia.fromMediaArray([media], start), socket, chanDB);
@ -805,6 +830,14 @@ class playlistHandler{
*/ */
async queueRandomFromChannelPlaylist(socket, data, chanDB){ async queueRandomFromChannelPlaylist(socket, data, chanDB){
try{ try{
//Validate playlist name
const playlist = this.playlistTitleValidator(socket, data.playlist);
//If playlist title isnt valid
if(playlist == null){
return;
}
//if we wherent handed a channel document //if we wherent handed a channel document
if(chanDB == null){ if(chanDB == null){
//Pull it based on channel name //Pull it based on channel name
@ -816,11 +849,11 @@ class playlistHandler{
//Pull a valid start time from input, or make one up if we can't //Pull a valid start time from input, or make one up if we can't
let start = this.channel.queue.getStart(data.start); let start = this.channel.queue.getStart(data.start);
//Grab playlist //Check for existing playlists of the same name
const playlist = chanDB.getPlaylistByName(data.playlist); const foundPlaylist = await channelPlaylistModel.findOne({channel: this.channel._id, name: playlist});
//If we didn't find a real playlist //If we didn't find a real playlist
if(playlist == null){ if(foundPlaylist == null){
//Bitch, moan, complain... //Bitch, moan, complain...
loggerUtils.socketErrorHandler(socket, "Playlist not found!", "validation"); loggerUtils.socketErrorHandler(socket, "Playlist not found!", "validation");
//and ignore it! //and ignore it!
@ -828,13 +861,13 @@ class playlistHandler{
} }
//Pick a random video ID based on the playlist's length //Pick a random video ID based on the playlist's length
const foundID = Math.round(Math.random() * (playlist.media.length - 1)); const foundID = Math.round(Math.random() * (foundPlaylist.media.length - 1));
//Pull and rehydrate media from playlist //Pull and rehydrate media from playlist
const foundMedia = playlist.media[foundID].rehydrate(); const foundMedia = foundPlaylist.media[foundID].rehydrate();
//Set title from default titles //Set title from default titles
foundMedia.title = playlist.pickDefaultTitle(foundMedia.title); foundMedia.title = foundPlaylist.pickDefaultTitle(foundMedia.title);
//Queue found media //Queue found media
this.channel.queue.scheduleMedia(queuedMedia.fromMediaArray([foundMedia], start), socket, chanDB); this.channel.queue.scheduleMedia(queuedMedia.fromMediaArray([foundMedia], start), socket, chanDB);
@ -848,47 +881,52 @@ class playlistHandler{
* Queues random media from a given user playlist * Queues random media from a given user playlist
* @param {Socket} socket - Requesting socket * @param {Socket} socket - Requesting socket
* @param {Object} data - Data handed over from the client * @param {Object} data - Data handed over from the client
* @param {Mongoose.Document} userDB - User Document Passthrough to save on DB Access
* @param {Mongoose.Document} chanDB - Channel Document Passthrough to save on DB Access * @param {Mongoose.Document} chanDB - Channel Document Passthrough to save on DB Access
*/ */
async queueRandomFromUserPlaylist(socket, data, userDB, chanDB){ async queueRandomFromUserPlaylist(socket, data, chanDB){
try{ try{
//Validate playlist name
const playlist = this.playlistTitleValidator(socket, data.playlist);
//syntatic suger XP
const userID = socket.request.session.user._id;
//If playlist title isnt valid
if(playlist == null){
return;
}
//if we wherent handed a channel document //if we wherent handed a channel document
if(chanDB == null){ if(chanDB == null){
//Pull it based on channel name //Pull it based on channel name
chanDB = await channelModel.findOne({name: this.channel.name}); chanDB = await channelModel.findOne({name: this.channel.name});
} }
//if we wherent handed a user document
if(userDB == null){
//Find the user in the Database
userDB = await userModel.findOne({user: socket.request.session.user.user});
}
//Permcheck the user //Permcheck the user
if((!this.channel.queue.locked && await chanDB.permCheck(socket.user, 'scheduleMedia')) || await chanDB.permCheck(socket.user, 'scheduleAdmin')){ if((!this.channel.queue.locked && await chanDB.permCheck(socket.user, 'scheduleMedia')) || await chanDB.permCheck(socket.user, 'scheduleAdmin')){
//Pull a valid start time from input, or make one up if we can't //Pull a valid start time from input, or make one up if we can't
let start = this.channel.queue.getStart(data.start); let start = this.channel.queue.getStart(data.start);
//Grab playlist //Check for existing playlists of the same name
const playlist = userDB.getPlaylistByName(data.playlist); const foundPlaylist = await userPlaylistModel.findOne({user: userID, name: playlist});
//If we didn't find a real playlist //If the channel doesn't exist
if(playlist == null){ if(foundPlaylist == null){
//Bitch, moan, complain... //Bitch, moan, complain...
loggerUtils.socketErrorHandler(socket, "Playlist not found!", "validation"); loggerUtils.socketErrorHandler(socket, `Playlist not found!`, "validation");
//and ignore it! //and ignore it!
return; return;
} }
//Pick a random video ID based on the playlist's length //Pick a random video ID based on the playlist's length
const foundID = Math.round(Math.random() * (playlist.media.length - 1)); const foundID = Math.round(Math.random() * (foundPlaylist.media.length - 1));
//Pull and rehydrate media from playlist //Pull and rehydrate media from playlist
const foundMedia = playlist.media[foundID].rehydrate(); const foundMedia = foundPlaylist.media[foundID].rehydrate();
//Set title from default titles //Set title from default titles
foundMedia.title = playlist.pickDefaultTitle(foundMedia.title); foundMedia.title = foundPlaylist.pickDefaultTitle(foundMedia.title);
//Queue found media //Queue found media
this.channel.queue.scheduleMedia(queuedMedia.fromMediaArray([foundMedia], start), socket, chanDB); this.channel.queue.scheduleMedia(queuedMedia.fromMediaArray([foundMedia], start), socket, chanDB);
@ -907,8 +945,16 @@ class playlistHandler{
*/ */
async renameChannelPlaylist(socket, data, chanDB){ async renameChannelPlaylist(socket, data, chanDB){
try{ try{
//Validate playlist name
const playlist = this.playlistTitleValidator(socket, data.playlist);
//If playlist title isnt valid
if(playlist == null){
return;
}
//Validate and Sanatize name //Validate and Sanatize name
const name = this.playlistTitleValidator(socket, data); const name = this.playlistTitleValidator(socket, data.name);
//If validation fucked up //If validation fucked up
if(name == null){ if(name == null){
@ -923,19 +969,22 @@ class playlistHandler{
} }
if(await chanDB.permCheck(socket.user, 'editChannelPlaylists')){ if(await chanDB.permCheck(socket.user, 'editChannelPlaylists')){
//Check for playlist to be re-named
const existingPlaylist = await channelPlaylistModel.findOne({channel: this.channel._id, name});
//If the new name already exists //If the new name already exists
if(chanDB.getPlaylistByName(name) != null){ if(existingPlaylist != null){
//Bitch, moan, complain... //Bitch, moan, complain...
loggerUtils.socketErrorHandler(socket, `Playlist named '${name}' already exists!`, "validation"); loggerUtils.socketErrorHandler(socket, `Playlist named '${name}' already exists!`, "validation");
//and ignore it! //and ignore it!
return; return;
} }
//Find playlist //Check for playlist to be re-named
let playlist = chanDB.getPlaylistByName(data.playlist); const foundPlaylist = await channelPlaylistModel.findOne({channel: this.channel._id, name: playlist});
//If we didn't find a real playlist //If we didn't find a real playlist
if(playlist == null){ if(foundPlaylist == null){
//Bitch, moan, complain... //Bitch, moan, complain...
loggerUtils.socketErrorHandler(socket, "Playlist not found!", "validation"); loggerUtils.socketErrorHandler(socket, "Playlist not found!", "validation");
//and ignore it! //and ignore it!
@ -943,10 +992,10 @@ class playlistHandler{
} }
//Change playlist name //Change playlist name
chanDB.media.playlists[playlist.listIndex].name = name; foundPlaylist.name = name;
//Save channel document //Save channel document
await chanDB.save(); await foundPlaylist.save();
//Return playlists from channel doc //Return playlists from channel doc
this.getChannelPlaylists(socket); this.getChannelPlaylists(socket);
@ -960,12 +1009,23 @@ class playlistHandler{
* Renames a user playlist * Renames a user playlist
* @param {Socket} socket - Requesting socket * @param {Socket} socket - Requesting socket
* @param {Object} data - Data handed over from the client * @param {Object} data - Data handed over from the client
* @param {Mongoose.Document} userDB - User Document Passthrough to save on DB Access
*/ */
async renameUserPlaylist(socket, data, userDB){ async renameUserPlaylist(socket, data){
try{ try{
//Validate playlist name
const playlist = this.playlistTitleValidator(socket, data.playlist);
//syntatic suger XP
const userID = socket.request.session.user._id;
//If playlist title isnt valid
if(playlist == null){
return;
}
//Validate and Sanatize name //Validate and Sanatize name
const name = this.playlistTitleValidator(socket, data); const name = this.playlistTitleValidator(socket, data.name);
//If validation fucked up //If validation fucked up
if(name == null){ if(name == null){
@ -973,36 +1033,33 @@ class playlistHandler{
return; return;
} }
//if we wherent handed a user document //Check for existing playlists of the same name
if(userDB == null){ const existingPlaylist = await userPlaylistModel.findOne({user: userID, name});
//Find the user in the Database
userDB = await userModel.findOne({user: socket.request.session.user.user});
}
//If the new name already exists //If the channel doesn't exist
if(userDB.getPlaylistByName(name) != null){ if(existingPlaylist != null){
//Bitch, moan, complain... //Bitch, moan, complain...
loggerUtils.socketErrorHandler(socket, `Playlist named '${name}' already exists!`, "validation"); loggerUtils.socketErrorHandler(socket, `Playlist named '${name}' already exists!`, "validation");
//and ignore it! //and ignore it!
return; return;
} }
//Find playlist //Check for existing playlists of the same name
let playlist = userDB.getPlaylistByName(data.playlist); const foundPlaylist = await userPlaylistModel.findOne({user: userID, name: playlist});
//If we didn't find a real playlist //If the channel doesn't exist
if(playlist == null){ if(foundPlaylist == null){
//Bitch, moan, complain... //Bitch, moan, complain...
loggerUtils.socketErrorHandler(socket, "Playlist not found!", "validation"); loggerUtils.socketErrorHandler(socket, `Playlist not found!`, "validation");
//and ignore it! //and ignore it!
return; return;
} }
//Change playlist name //Change playlist name
userDB.playlists[playlist.listIndex].name = name; foundPlaylist.name = name;
//Save channel document //Save channel document
await userDB.save(); await foundPlaylist.save();
//Return playlists from channel doc //Return playlists from channel doc
this.getUserPlaylists(socket); this.getUserPlaylists(socket);
@ -1020,6 +1077,14 @@ class playlistHandler{
*/ */
async changeDefaultTitlesChannelPlaylist(socket, data, chanDB){ async changeDefaultTitlesChannelPlaylist(socket, data, chanDB){
try{ try{
//Validate playlist name
const playlist = this.playlistTitleValidator(socket, data.playlist);
//If playlist title isnt valid
if(playlist == null){
return;
}
//if we wherent handed a channel document //if we wherent handed a channel document
if(chanDB == null){ if(chanDB == null){
//Pull it based on channel name //Pull it based on channel name
@ -1027,11 +1092,11 @@ class playlistHandler{
} }
if(await chanDB.permCheck(socket.user, 'editChannelPlaylists')){ if(await chanDB.permCheck(socket.user, 'editChannelPlaylists')){
//Find playlist //Check for existing playlists of the same name
let playlist = chanDB.getPlaylistByName(data.playlist); const foundPlaylist = await channelPlaylistModel.findOne({channel: this.channel._id, name: playlist});
//If we didn't find a real playlist //If we didn't find a real playlist
if(playlist == null){ if(foundPlaylist == null){
//Bitch, moan, complain... //Bitch, moan, complain...
loggerUtils.socketErrorHandler(socket, "Playlist not found!", "validation"); loggerUtils.socketErrorHandler(socket, "Playlist not found!", "validation");
//and ignore it! //and ignore it!
@ -1039,10 +1104,10 @@ class playlistHandler{
} }
//Keep valid default titles //Keep valid default titles
chanDB.media.playlists[playlist.listIndex].defaultTitles = this.changeDefaultTitlesValidator(data); foundPlaylist.defaultTitles = this.changeDefaultTitlesValidator(data);
//Save channel document //Save channel document
await chanDB.save(); await foundPlaylist.save();
//Return playlists from channel doc //Return playlists from channel doc
this.getChannelPlaylists(socket); this.getChannelPlaylists(socket);
@ -1060,29 +1125,34 @@ class playlistHandler{
*/ */
async changeDefaultTitlesUserPlaylist(socket, data, userDB){ async changeDefaultTitlesUserPlaylist(socket, data, userDB){
try{ try{
//Validate playlist name
const playlist = this.playlistTitleValidator(socket, data.playlist);
//syntatic suger XP
const userID = socket.request.session.user._id;
//if we wherent handed a user document //if we wherent handed a user document
if(userDB == null){ if(userDB == null){
//Find the user in the Database //Find the user in the Database
userDB = await userModel.findOne({user: socket.request.session.user.user}); userDB = await userModel.findOne({user: socket.request.session.user.user});
} }
//Find playlist //Check for existing playlists of the same name
let playlist = userDB.getPlaylistByName(data.playlist); const foundPlaylist = await userPlaylistModel.findOne({user: userID, name: playlist});
//If we didn't find a real playlist //If the channel doesn't exist
if(playlist == null){ if(foundPlaylist == null){
//Bitch, moan, complain... //Bitch, moan, complain...
loggerUtils.socketErrorHandler(socket, "Playlist not found!", "validation"); loggerUtils.socketErrorHandler(socket, `Playlist not found!`, "validation");
//and ignore it! //and ignore it!
return; return;
} }
//Keep valid de.mediafault titles //Keep valid de.mediafault titles
userDB.playlists[playlist.listIndex].defaultTitles = this.changeDefaultTitlesValidator(data); foundPlaylist.defaultTitles = this.changeDefaultTitlesValidator(data);
//Save user document //Save user document
await userDB.save(); await foundPlaylist.save();
//Return playlists from user doc //Return playlists from user doc
this.getUserPlaylists(socket); this.getUserPlaylists(socket);
@ -1100,6 +1170,14 @@ class playlistHandler{
*/ */
async deleteChannelPlaylistMedia(socket, data, chanDB){ async deleteChannelPlaylistMedia(socket, data, chanDB){
try{ try{
//Validate playlist name
const playlist = this.playlistTitleValidator(socket, data.playlist);
//If playlist title isnt valid
if(playlist == null){
return;
}
//Validate UUID //Validate UUID
const uuid = this.deletePlaylistMediaValidator(socket, data); const uuid = this.deletePlaylistMediaValidator(socket, data);
@ -1116,11 +1194,11 @@ class playlistHandler{
} }
if(await chanDB.permCheck(socket.user, 'editChannelPlaylists')){ if(await chanDB.permCheck(socket.user, 'editChannelPlaylists')){
//Find the playlist //Check for existing playlists of the same name
let playlist = chanDB.getPlaylistByName(data.playlist); const foundPlaylist = await channelPlaylistModel.findOne({channel: this.channel._id, name: playlist});
//If we didn't find a real playlist //If we didn't find a real playlist
if(playlist == null){ if(foundPlaylist == null){
//Bitch, moan, complain... //Bitch, moan, complain...
loggerUtils.socketErrorHandler(socket, "Playlist not found!", "validation"); loggerUtils.socketErrorHandler(socket, "Playlist not found!", "validation");
//and ignore it! //and ignore it!
@ -1128,10 +1206,10 @@ class playlistHandler{
} }
//delete media from playlist //delete media from playlist
chanDB.media.playlists[playlist.listIndex].deleteMedia(data.uuid); foundPlaylist.deleteMedia(data.uuid);
//save the channel document //save the channel document
await chanDB.save(); await foundPlaylist.save();
//Return playlists from channel doc //Return playlists from channel doc
this.getChannelPlaylists(socket); this.getChannelPlaylists(socket);
@ -1149,6 +1227,17 @@ class playlistHandler{
*/ */
async deleteUserPlaylistMedia(socket, data, userDB){ async deleteUserPlaylistMedia(socket, data, userDB){
try{ try{
//Validate playlist name
const playlist = this.playlistTitleValidator(socket, data.playlist);
//syntatic suger XP
const userID = socket.request.session.user._id;
//If playlist title isnt valid
if(playlist == null){
return;
}
//Validate UUID //Validate UUID
const uuid = this.deletePlaylistMediaValidator(socket, data); const uuid = this.deletePlaylistMediaValidator(socket, data);
@ -1164,22 +1253,22 @@ class playlistHandler{
userDB = await userModel.findOne({user: socket.request.session.user.user}); userDB = await userModel.findOne({user: socket.request.session.user.user});
} }
//Find the playlist //Check for existing playlists of the same name
let playlist = userDB.getPlaylistByName(data.playlist); const foundPlaylist = await userPlaylistModel.findOne({user: userID, name: playlist});
//If we didn't find a real playlist //If the channel doesn't exist
if(playlist == null){ if(foundPlaylist == null){
//Bitch, moan, complain... //Bitch, moan, complain...
loggerUtils.socketErrorHandler(socket, "Playlist not found!", "validation"); loggerUtils.socketErrorHandler(socket, `Playlist not found!`, "validation");
//and ignore it! //and ignore it!
return; return;
} }
//delete media from playlist //delete media from playlist
userDB.playlists[playlist.listIndex].deleteMedia(data.uuid); foundPlaylist.deleteMedia(data.uuid);
//save the user document //save the user document
await userDB.save(); await foundPlaylist.save();
//Return playlists from user doc //Return playlists from user doc
this.getUserPlaylists(socket); this.getUserPlaylists(socket);

View file

@ -580,6 +580,7 @@ class playlistManager{
event.target.parentNode.dataset['playlist'], event.target.parentNode.dataset['playlist'],
this.client, this.client,
this.queuePanel.ownerDoc, this.queuePanel.ownerDoc,
event.target.parentNode.dataset['location'],
handleOpenedMedia.bind(this) handleOpenedMedia.bind(this)
); );
@ -870,9 +871,10 @@ class renamePopup{
* @param {String} playlist - Playlist name * @param {String} playlist - Playlist name
* @param {channel} client - Parent Client Management Object * @param {channel} client - Parent Client Management Object
* @param {Document} doc - Current owner documnet of the panel, so we know where to drop our pop-up * @param {Document} doc - Current owner documnet of the panel, so we know where to drop our pop-up
* @param {String} location - Location of playlist, either Channel or User
* @param {Function} cb - Callback function, passed new name upon rename * @param {Function} cb - Callback function, passed new name upon rename
*/ */
constructor(event, playlist, client, doc, cb){ constructor(event, playlist, client, doc, location, cb){
/** /**
* Parent Client Management Object * Parent Client Management Object
*/ */
@ -888,6 +890,11 @@ class renamePopup{
*/ */
this.cb = cb; this.cb = cb;
/**
* Location of playlist, either Channel or User
*/
this.location = location;
//Create media popup and call async constructor when done //Create media popup and call async constructor when done
//unfortunately we cant call constructors asyncronously, and we cant call back to this from super, so we can't extend this as it stands :( //unfortunately we cant call constructors asyncronously, and we cant call back to this from super, so we can't extend this as it stands :(
/** /**
@ -924,7 +931,7 @@ class renamePopup{
if(event.key == null || event.key == "Enter"){ if(event.key == null || event.key == "Enter"){
//Tell the server to change the titles //Tell the server to change the titles
this.client.socket.emit('renameChannelPlaylist', { this.client.socket.emit(`rename${this.location}Playlist`, {
playlist: this.playlist, playlist: this.playlist,
name: this.renamePrompt.value name: this.renamePrompt.value
}); });