| 
					
				 | 
			
			
				@@ -324,6 +324,16 @@ CacheModule.runJob("SUB", { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+CacheModule.runJob("SUB", { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	channel: "station.repositionSongInQueue", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	cb: res => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		WSModule.runJob("EMIT_TO_ROOM", { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			room: `station.${res.stationId}`, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			args: ["event:queue.repositionSong", res.song] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		}); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+}); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 CacheModule.runJob("SUB", { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	channel: "station.voteSkipSong", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	cb: stationId => { 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -3075,64 +3085,81 @@ export default { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	/** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	 * Reposition station queue 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	 * Reposition a song in station queue 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	 * 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	 * @param session 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	 * @param stationId - the station id 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	 * @param queue - queue data 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	 * @param cb 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	 * @param {object} session - user session 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	 * @param {object} song - contains details about the song that is to be repositioned 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	 * @param {string} song.songId - the id of the song 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	 * @param {number} song.newIndex - the new position for the song in the queue 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	 * @param {number} song.oldIndex - the old position of the song in the queue 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	 * @param {string} stationId - the station id 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	 * @param {Function} cb - callback 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	 */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	repositionQueue: isOwnerRequired(async function repositionQueue(session, stationId, queue, cb) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	repositionSongInQueue: isOwnerRequired(async function repositionQueue(session, song, stationId, cb) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		const stationModel = await DBModule.runJob("GET_MODEL", { modelName: "station" }, this); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		async.waterfall( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			[ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 				next => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					if (!queue) return next("Invalid queue data."); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					return StationsModule.runJob("GET_STATION", { stationId }, this) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-						.then(station => next(null, station)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-						.catch(next); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					if (!song || !song.songId) return next("You must provide a song to reposition."); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					return next(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 				}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				(station, next) => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					if (!station) return next("Station not found."); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					return stationModel 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-						.updateOne({ _id: stationId }, { $set: { queue } }, this) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-						.then(station => next(null, station)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-						.catch(next); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				// remove song from queue 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				next => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					stationModel.updateOne({ _id: stationId }, { $pull: { queue: { songId: song.songId } } }, next); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 				}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				// add song back to queue (in new position) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 				(res, next) => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					stationModel.updateOne( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						{ _id: stationId }, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						{ $push: { queue: { $each: [song], $position: song.newIndex } } }, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						err => next(err) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				// update the cache representation of the station 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				next => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 					StationsModule.runJob("UPDATE_STATION", { stationId }, this) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 						.then(station => next(null, station)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 						.catch(next); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 				} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			], 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			async err => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				console.log(err); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 				if (err) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 					err = await UtilsModule.runJob("GET_ERROR", { error: err }, this); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 					this.log( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 						"ERROR", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-						"STATIONS_REPOSITION_QUEUE", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-						`Repositioning station "${stationId}" queue failed. "${err}"` 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						"STATIONS_REPOSITION_SONG_IN_QUEUE", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						`Repositioning song ${song.songId} in queue of station "${stationId}" failed. "${err}"` 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 					); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 					return cb({ status: "failure", message: err }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 				} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 				this.log( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 					"SUCCESS", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					"STATIONS_REPOSITION_QUEUE", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					`Repositioned station "${stationId}" queue successfully.` 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					"STATIONS_REPOSITION_SONG_IN_QUEUE", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					`Repositioned song ${song.songId} in queue of station "${stationId}" successfully.` 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 				); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 				CacheModule.runJob("PUB", { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					channel: "station.queueUpdate", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					value: stationId 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					channel: "station.repositionSongInQueue", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					value: { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						song: { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+							songId: song.songId, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+							oldIndex: song.oldIndex, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+							newIndex: song.newIndex 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						stationId 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 				}); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 				return cb({ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 					status: "success", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					message: "Successfully repositioned queue." 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					message: "Successfully repositioned song in queue." 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 				}); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		); 
			 |