|
@@ -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();
|
|
|
+ }
|
|
|
+ );
|
|
|
+ }
|
|
|
+ });
|
|
|
+ });
|
|
|
+}
|