Browse Source

refactor: added migration for mediaSource

Kristian Vos 2 years ago
parent
commit
03f8ba70b9
2 changed files with 234 additions and 1 deletions
  1. 2 1
      backend/logic/migration/index.js
  2. 232 0
      backend/logic/migration/migrations/migration25.js

+ 2 - 1
backend/logic/migration/index.js

@@ -68,7 +68,8 @@ class _MigrationModule extends CoreClass {
 						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 })),
-						ratings: mongoose.model("ratings", new mongoose.Schema({}, { strict: false }))
+						ratings: mongoose.model("ratings", new mongoose.Schema({}, { strict: false })),
+						stationHistory: mongoose.model("stationHistory", new mongoose.Schema({}, { strict: false }))
 					};
 
 					const files = fs.readdirSync(path.join(__dirname, "migrations"));

+ 232 - 0
backend/logic/migration/migrations/migration25.js

@@ -0,0 +1,232 @@
+import async from "async";
+
+/**
+ * Migration 25
+ *
+ * Migration for changing youtubeId to mediaSource
+ *
+ * @param {object} MigrationModule - the MigrationModule
+ * @returns {Promise} - returns promise
+ */
+export default async function migrate(MigrationModule) {
+	const activityModel = await MigrationModule.runJob("GET_MODEL", { modelName: "activity" }, this);
+	const playlistModel = await MigrationModule.runJob("GET_MODEL", { modelName: "playlist" }, this);
+	const reportModel = await MigrationModule.runJob("GET_MODEL", { modelName: "report" }, this);
+	const songModel = await MigrationModule.runJob("GET_MODEL", { modelName: "song" }, this);
+	const stationModel = await MigrationModule.runJob("GET_MODEL", { modelName: "station" }, this);
+	const ratingsModel = await MigrationModule.runJob("GET_MODEL", { modelName: "ratings" }, this);
+	const stationHistoryModel = await MigrationModule.runJob("GET_MODEL", { modelName: "stationHistory" }, this);
+
+	await new Promise((resolve, reject) => {
+		this.log("INFO", `Migration 25. Updating activity with document version 2.`);
+
+		activityModel.find({ documentVersion: 2 }, (err, activities) => {
+			if (err) reject(err);
+			else {
+				async.eachLimit(
+					activities.map(activity => activity._doc),
+					1,
+					(activity, next) => {
+						const updateObject = { $set: { documentVersion: 3 } };
+
+						if (activity.payload.youtubeId) {
+							activity.payload.mediaSource = `youtube:${activity.payload.youtubeId}`;
+							delete activity.payload.youtubeId;
+							updateObject.$set.payload = activity.payload;
+						}
+
+						activityModel.updateOne({ _id: activity._id }, updateObject, next);
+					},
+					err => {
+						this.log("INFO", `Migration 25. Activities found: ${activities.length}.`);
+						if (err) reject(err);
+						else resolve();
+					}
+				);
+			}
+		});
+	});
+
+	await new Promise((resolve, reject) => {
+		this.log("INFO", `Migration 25. Updating playlist with document version 6.`);
+
+		playlistModel.find({ documentVersion: 6 }, (err, documents) => {
+			if (err) reject(err);
+			else {
+				async.eachLimit(
+					documents.map(document => document._doc),
+					1,
+					(document, next) => {
+						const updateObject = { $set: { documentVersion: 7 } };
+
+						const songs = document.songs.map(song => {
+							song.mediaSource = `youtube:${song.youtubeId}`;
+							delete song.youtubeId;
+							return song;
+						});
+
+						updateObject.$set.songs = songs;
+
+						playlistModel.updateOne({ _id: document._id }, updateObject, next);
+					},
+					err => {
+						this.log("INFO", `Migration 25. Playlists found: ${documents.length}.`);
+						if (err) reject(err);
+						else resolve();
+					}
+				);
+			}
+		});
+	});
+
+	await new Promise((resolve, reject) => {
+		this.log("INFO", `Migration 25. Updating playlist with document version 6.`);
+
+		reportModel.find({ documentVersion: 6 }, (err, documents) => {
+			if (err) reject(err);
+			else {
+				async.eachLimit(
+					documents.map(document => document._doc),
+					1,
+					(document, next) => {
+						const updateObject = { $set: { documentVersion: 7 } };
+
+						document.song.mediaSource = `youtube:${document.song.youtubeId}`;
+						delete document.song.youtubeId;
+
+						updateObject.$set.song = document.song;
+
+						reportModel.updateOne({ _id: document._id }, updateObject, next);
+					},
+					err => {
+						this.log("INFO", `Migration 25. Reports found: ${documents.length}.`);
+						if (err) reject(err);
+						else resolve();
+					}
+				);
+			}
+		});
+	});
+
+	await new Promise((resolve, reject) => {
+		this.log("INFO", `Migration 25. Updating song with document version 9.`);
+
+		songModel.find({ documentVersion: 9 }, (err, documents) => {
+			if (err) reject(err);
+			else {
+				async.eachLimit(
+					documents.map(document => document._doc),
+					1,
+					(document, next) => {
+						const updateObject = { $set: { documentVersion: 10 } };
+
+						updateObject.$set.mediaSource = `youtube:${document.youtubeId}`;
+						updateObject.$unset = { youtubeId: "" };
+
+						songModel.updateOne({ _id: document._id }, updateObject, next);
+					},
+					err => {
+						this.log("INFO", `Migration 25. Songs found: ${documents.length}.`);
+						if (err) reject(err);
+						else resolve();
+					}
+				);
+			}
+		});
+	});
+
+	await new Promise((resolve, reject) => {
+		this.log("INFO", `Migration 25. Updating station with document version 9.`);
+
+		stationModel.find({ documentVersion: 9 }, (err, documents) => {
+			if (err) reject(err);
+			else {
+				async.eachLimit(
+					documents.map(document => document._doc),
+					1,
+					(document, next) => {
+						const updateObject = { $set: { documentVersion: 10 } };
+
+						if (document.currentSong) {
+							document.currentSong.mediaSource = `youtube:${document.currentSong.youtubeId}`;
+							delete document.currentSong.youtubeId;
+							updateObject.$set.currentSong = document.currentSong;
+						}
+
+						const queue = document.queue.map(song => {
+							song.mediaSource = `youtube:${song.youtubeId}`;
+							delete song.youtubeId;
+							return song;
+						});
+						updateObject.$set.queue = queue;
+
+						stationModel.updateOne({ _id: document._id }, updateObject, next);
+					},
+					err => {
+						this.log("INFO", `Migration 25. Stations found: ${documents.length}.`);
+						if (err) reject(err);
+						else resolve();
+					}
+				);
+			}
+		});
+	});
+
+	await new Promise((resolve, reject) => {
+		this.log("INFO", `Migration 25. Updating ratings with document version 1.`);
+
+		ratingsModel.find({ documentVersion: 1 }, (err, documents) => {
+			if (err) reject(err);
+			else {
+				async.eachLimit(
+					documents.map(document => document._doc),
+					1,
+					(document, next) => {
+						const updateObject = { $set: { documentVersion: 2 } };
+
+						if (document.youtubeId) {
+							updateObject.$set.mediaSource = `youtube:${document.youtubeId}`;
+							updateObject.$unset = { youtubeId: "" };
+						}
+
+						ratingsModel.updateOne({ _id: document._id }, updateObject, next);
+					},
+					err => {
+						this.log("INFO", `Migration 25. Ratings found: ${documents.length}.`);
+						if (err) reject(err);
+						else resolve();
+					}
+				);
+			}
+		});
+	});
+
+	await new Promise((resolve, reject) => {
+		this.log("INFO", `Migration 25. Updating station history with document version 1.`);
+
+		stationHistoryModel.find({ documentVersion: 1 }, (err, documents) => {
+			if (err) reject(err);
+			else {
+				async.eachLimit(
+					documents.map(document => document._doc),
+					1,
+					(document, next) => {
+						const updateObject = { $set: { documentVersion: 2 } };
+
+						document.payload.song.mediaSource = `youtube:${document.payload.song.youtubeId}`;
+						delete document.payload.song.youtubeId;
+
+						updateObject.$set.payload = document.payload;
+
+						stationHistoryModel.updateOne({ _id: document._id }, updateObject, next);
+					},
+					err => {
+						this.log("INFO", `Migration 25. Station history found: ${documents.length}.`);
+						if (err) reject(err);
+						else resolve();
+					}
+				);
+			}
+		});
+	});
+}