| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167 | 
							- 'use strict';
 
- const coreClass = require("../core");
 
- const async = require('async');
 
- module.exports = class extends coreClass {
 
- 	constructor(name, moduleManager) {
 
- 		super(name, moduleManager);
 
- 		this.dependsOn = ["cache", "db", "utils"];
 
- 	}
 
- 	initialize() {
 
- 		return new Promise((resolve, reject) => {
 
- 			this.setStage(1);
 
- 			this.cache = this.moduleManager.modules["cache"];
 
- 			this.db	= this.moduleManager.modules["db"];
 
- 			this.utils	= this.moduleManager.modules["utils"];
 
- 			async.waterfall([
 
- 				(next) => {
 
- 					this.setStage(2);
 
- 					this.cache.hgetall('playlists', next);
 
- 				},
 
- 	
 
- 				(playlists, next) => {
 
- 					this.setStage(3);
 
- 					if (!playlists) return next();
 
- 					let playlistIds = Object.keys(playlists);
 
- 					async.each(playlistIds, (playlistId, next) => {
 
- 						this.db.models.playlist.findOne({_id: playlistId}, (err, playlist) => {
 
- 							if (err) next(err);
 
- 							else if (!playlist) {
 
- 								this.cache.hdel('playlists', playlistId, next);
 
- 							}
 
- 							else next();
 
- 						});
 
- 					}, next);
 
- 				},
 
- 	
 
- 				(next) => {
 
- 					this.setStage(4);
 
- 					this.db.models.playlist.find({}, next);
 
- 				},
 
- 	
 
- 				(playlists, next) => {
 
- 					this.setStage(5);
 
- 					async.each(playlists, (playlist, next) => {
 
- 						this.cache.hset('playlists', playlist._id, this.cache.schemas.playlist(playlist), next);
 
- 					}, next);
 
- 				}
 
- 			], async (err) => {
 
- 				if (err) {
 
- 					err = await this.utils.getError(err);
 
- 					reject(err);
 
- 				} else {
 
- 					resolve();
 
- 				}
 
- 			});
 
- 		});
 
- 	}
 
- 	/**
 
- 	 * Gets a playlist by id from the cache or Mongo, and if it isn't in the cache yet, adds it the cache
 
- 	 *
 
- 	 * @param {String} playlistId - the id of the playlist we are trying to get
 
- 	 * @param {Function} cb - gets called once we're done initializing
 
- 	 */
 
- 	async getPlaylist(playlistId, cb) {
 
- 		try { await this._validateHook(); } catch { return; }
 
- 		async.waterfall([
 
- 			(next) => {
 
- 				this.cache.hgetall('playlists', next);
 
- 			},
 
- 			(playlists, next) => {
 
- 				if (!playlists) return next();
 
- 				let playlistIds = Object.keys(playlists);
 
- 				async.each(playlistIds, (playlistId, next) => {
 
- 					this.db.models.playlist.findOne({_id: playlistId}, (err, playlist) => {
 
- 						if (err) next(err);
 
- 						else if (!playlist) {
 
- 							this.cache.hdel('playlists', playlistId, next);
 
- 						}
 
- 						else next();
 
- 					});
 
- 				}, next);
 
- 			},
 
- 			(next) => {
 
- 				this.cache.hget('playlists', playlistId, next);
 
- 			},
 
- 			(playlist, next) => {
 
- 				if (playlist) return next(true, playlist);
 
- 				this.db.models.playlist.findOne({ _id: playlistId }, next);
 
- 			},
 
- 			(playlist, next) => {
 
- 				if (playlist) {
 
- 					this.cache.hset('playlists', playlistId, playlist, next);
 
- 				} else next('Playlist not found');
 
- 			},
 
- 		], (err, playlist) => {
 
- 			if (err && err !== true) return cb(err);
 
- 			else cb(null, playlist);
 
- 		});
 
- 	}
 
- 	/**
 
- 	 * Gets a playlist from id from Mongo and updates the cache with it
 
- 	 *
 
- 	 * @param {String} playlistId - the id of the playlist we are trying to update
 
- 	 * @param {Function} cb - gets called when an error occurred or when the operation was successful
 
- 	 */
 
- 	async updatePlaylist(playlistId, cb) {
 
- 		try { await this._validateHook(); } catch { return; }
 
- 		async.waterfall([
 
- 			(next) => {
 
- 				this.db.models.playlist.findOne({ _id: playlistId }, next);
 
- 			},
 
- 			(playlist, next) => {
 
- 				if (!playlist) {
 
- 					this.cache.hdel('playlists', playlistId);
 
- 					return next('Playlist not found');
 
- 				}
 
- 				this.cache.hset('playlists', playlistId, playlist, next);
 
- 			}
 
- 		], (err, playlist) => {
 
- 			if (err && err !== true) return cb(err);
 
- 			cb(null, playlist);
 
- 		});
 
- 	}
 
- 	/**
 
- 	 * Deletes playlist from id from Mongo and cache
 
- 	 *
 
- 	 * @param {String} playlistId - the id of the playlist we are trying to delete
 
- 	 * @param {Function} cb - gets called when an error occurred or when the operation was successful
 
- 	 */
 
- 	async deletePlaylist(playlistId, cb) {
 
- 		try { await this._validateHook(); } catch { return; }
 
- 		async.waterfall([
 
- 			(next) => {
 
- 				this.db.models.playlist.deleteOne({ _id: playlistId }, next);
 
- 			},
 
- 			(res, next) => {
 
- 				this.cache.hdel('playlists', playlistId, next);
 
- 			}
 
- 		], (err) => {
 
- 			if (err && err !== true) return cb(err);
 
- 			cb(null);
 
- 		});
 
- 	}
 
- }
 
 
  |