| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145 | import async from "async";import config from "config";import mongoose from "mongoose";import bluebird from "bluebird";import fs from "fs";import { fileURLToPath } from "url";import path from "path";import CoreClass from "../../core";const __filename = fileURLToPath(import.meta.url);const __dirname = path.dirname(__filename);let MigrationModule;mongoose.Promise = bluebird;class _MigrationModule extends CoreClass {	// eslint-disable-next-line require-jsdoc	constructor() {		super("migration");		MigrationModule = this;	}	/**	 * Initialises the migration module	 *	 * @returns {Promise} - returns promise (reject, resolve)	 */	initialize() {		return new Promise((resolve, reject) => {			this.models = {};			const mongoUrl = config.get("mongo").url;			mongoose				.connect(mongoUrl, {					useNewUrlParser: true,					useUnifiedTopology: true,					useCreateIndex: true				})				.then(async () => {					mongoose.connection.on("error", err => {						this.log("ERROR", err);					});					mongoose.connection.on("disconnected", () => {						this.log("ERROR", "Disconnected, going to try to reconnect...");						this.setStatus("RECONNECTING");					});					mongoose.connection.on("reconnected", () => {						this.log("INFO", "Reconnected.");						this.setStatus("READY");					});					mongoose.connection.on("reconnectFailed", () => {						this.log("INFO", "Reconnect failed, stopping reconnecting.");						// this.failed = true;						// this._lockdown();						this.setStatus("FAILED");					});					this.models = {						song: mongoose.model("song", new mongoose.Schema({}, { strict: false })),						queueSong: mongoose.model("queueSong", new mongoose.Schema({}, { strict: false })),						station: mongoose.model("station", new mongoose.Schema({}, { strict: false })),						user: mongoose.model("user", new mongoose.Schema({}, { strict: false })),						activity: mongoose.model("activity", new mongoose.Schema({}, { strict: false })),						playlist: mongoose.model("playlist", new mongoose.Schema({}, { strict: false })),						news: mongoose.model("news", new mongoose.Schema({}, { strict: false })),						report: mongoose.model("report", new mongoose.Schema({}, { strict: false })),						punishment: mongoose.model("punishment", new mongoose.Schema({}, { strict: false }))					};					const files = fs.readdirSync(path.join(__dirname, "migrations"));					const migrations = files.length;					async.timesLimit(						migrations,						1,						(index, next) => {							MigrationModule.runJob("RUN_MIGRATION", { index: index + 1 }, null, -1)								.then(() => {									next();								})								.catch(err => {									next(err);								});						},						err => {							if (err) console.log("Migration error", err);							else console.log("Migration completed");						}					);					resolve();				})				.catch(err => {					this.log("ERROR", err);					reject(err);				});		});	}	/**	 * Returns a database model	 *	 * @param {object} payload - object containing the payload	 * @param {object} payload.modelName - name of the model to get	 * @returns {Promise} - returns promise (reject, resolve)	 */	GET_MODEL(payload) {		return new Promise(resolve => {			resolve(MigrationModule.models[payload.modelName]);		});	}	/**	 * Runs migrations	 *	 * @param {object} payload - object containing the payload	 * @param {object} payload.index - migration index	 * @returns {Promise} - returns promise (reject, resolve)	 */	RUN_MIGRATION(payload) {		return new Promise((resolve, reject) => {			import(`./migrations/migration${payload.index}`).then(module => {				this.log("INFO", `Running migration ${payload.index}`);				module.default					.apply(this, [MigrationModule])					.then(response => {						resolve(response);					})					.catch(err => {						reject(err);					});			});		});	}}export default new _MigrationModule();
 |