| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280 | import config from "config";import async from "async";// import crypto from "crypto";import CoreClass from "../core";// let APIModule;let AppModule;// let DBModule;let PlaylistsModule;let UtilsModule;let PunishmentsModule;let CacheModule;// let NotificationsModule;class _APIModule extends CoreClass {	// eslint-disable-next-line require-jsdoc	constructor() {		super("api");		// APIModule = this;	}	/**	 * Initialises the api module	 *	 * @returns {Promise} - returns promise (reject, resolve)	 */	initialize() {		return new Promise((resolve, reject) => {			AppModule = this.moduleManager.modules.app;			// DBModule = this.moduleManager.modules.db;			PlaylistsModule = this.moduleManager.modules.playlists;			UtilsModule = this.moduleManager.modules.utils;			PunishmentsModule = this.moduleManager.modules.punishments;			CacheModule = this.moduleManager.modules.cache;			// NotificationsModule = this.moduleManager.modules.notifications;			const SIDname = config.get("cookie.SIDname");			const isLoggedIn = (req, res, next) => {				let SID;				async.waterfall(					[						next => {							UtilsModule.runJob("PARSE_COOKIES", {								cookieString: req.headers.cookie							})								.then(res => {									SID = res[SIDname];									next(null);								})								.catch(next);						},						next => {							if (!SID) return next("No SID.");							return next();						},						next => {							CacheModule.runJob("HGET", { table: "sessions", key: SID }).then(session =>								next(null, session)							);						},						(session, next) => {							if (!session) return next("No session found.");							session.refreshDate = Date.now();							req.session = session;							return CacheModule.runJob("HSET", {								table: "sessions",								key: SID,								value: session							}).then(session => {								next(null, session);							});						},						(res, next) => {							// check if a session's user / IP is banned							PunishmentsModule.runJob("GET_PUNISHMENTS", {})								.then(punishments => {									const isLoggedIn = !!(req.session && req.session.refreshDate);									const userId = isLoggedIn ? req.session.userId : null;									const banishment = { banned: false, ban: 0 };									punishments.forEach(punishment => {										if (punishment.expiresAt > banishment.ban) banishment.ban = punishment;										if (											punishment.type === "banUserId" &&											isLoggedIn &&											punishment.value === userId										)											banishment.banned = true;										if (punishment.type === "banUserIp" && punishment.value === req.ip)											banishment.banned = true;									});									req.banishment = banishment;									next();								})								.catch(() => {									next();								});						}					],					err => {						if (err) return res.json({ status: "error", message: "You are not logged in" });						return next();					}				);			};			AppModule.runJob("GET_APP", {})				.then(response => {					response.app.get("/", (req, res) => {						res.json({							status: "success",							message: "Coming Soon"						});					});					response.app.get("/export/privatePlaylist/:playlistId", isLoggedIn, (req, res) => {						const { playlistId } = req.params;						PlaylistsModule.runJob("GET_PLAYLIST", { playlistId })							.then(playlist => {								if (playlist.createdBy === req.session.userId)									res.json({ status: "success", playlist });								else res.json({ status: "error", message: "You're not the owner." });							})							.catch(err => {								res.json({ status: "error", message: err.message });							});					});					// response.app.get("/debug_station", async (req, res) => {					// 	const responseObject = {};					// 	const stationModel = await DBModule.runJob("GET_MODEL", {					// 		modelName: "station"					// 	});					// 	async.waterfall(					// 		[					// 			next => {					// 				stationModel.find({}, next);					// 			},					// 			(stations, next) => {					// 				responseObject.mongo = {					// 					stations					// 				};					// 				next();					// 			},					// 			next => {					// 				CacheModule.runJob("HGETALL", { table: "stations" })					// 					.then(stations => {					// 						next(null, stations);					// 					})					// 					.catch(err => {					// 						console.log(err);					// 						next(err);					// 					});					// 			},					// 			(stations, next) => {					// 				responseObject.redis = {					// 					stations					// 				};					// 				next();					// 			},					// 			next => {					// 				responseObject.cryptoExamples = {};					// 				responseObject.mongo.stations.forEach(station => {					// 					const payloadName = `stations.nextSong?id=${station._id}`;					// 					responseObject.cryptoExamples[station._id] = crypto					// 						.createHash("md5")					// 						.update(`_notification:${payloadName}_`)					// 						.digest("hex");					// 				});					// 				next();					// 			},					// 			next => {					// 				NotificationsModule.pub.keys("*", next);					// 			},					// 			(redisKeys, next) => {					// 				responseObject.redis = {					// 					...redisKeys,					// 					ttl: {}					// 				};					// 				async.eachLimit(					// 					redisKeys,					// 					1,					// 					(redisKey, next) => {					// 						NotificationsModule.pub.ttl(redisKey, (err, ttl) => {					// 							responseObject.redis.ttl[redisKey] = ttl;					// 							next(err);					// 						});					// 					},					// 					next					// 				);					// 			},					// 			next => {					// 				responseObject.debugLogs = this.moduleManager.debugLogs.stationIssue;					// 				next();					// 			},					// 			next => {					// 				responseObject.debugJobs = this.moduleManager.debugJobs;					// 				next();					// 			}					// 		],					// 		(err, response) => {					// 			if (err) {					// 				console.log(err);					// 				return res.json({					// 					error: err,					// 					objectSoFar: responseObject					// 				});					// 			}					// 			const responseJson = JSON.stringify(responseObject, (key, value) => {					// 				// console.log(key, value);					// 				if (					// 					key === "module" ||					// 					key === "task" ||					// 					key === "onFinish" ||					// 					key === "server" ||					// 					key === "nsp" ||					// 					key === "socket" ||					// 					key === "res" ||					// 					key === "client" ||					// 					key === "_idleNext" ||					// 					key === "_idlePrev"					// 				) {					// 					return undefined;					// 				}					// 				if (key === "parentJob" && value) return value.toString();					// 				return value;					// 			});					// 			res.end(responseJson);					// 		}					// 	);					// });					// Object.keys(actions).forEach(namespace => {					// 	Object.keys(actions[namespace]).forEach(action => {					// 		const name = `/${namespace}/${action}`;					// 		response.app.get(name, (req, res) => {					// 			actions[namespace][action](null, result => {					// 				if (typeof cb === "function") return res.json(result);					// 			});					// 		});					// 	});					// });					resolve();				})				.catch(err => {					reject(err);				});		});	}}export default new _APIModule();
 |