Add migration script for channels
authorChocobozzz <florian.bigard@gmail.com>
Thu, 26 Oct 2017 06:51:11 +0000 (08:51 +0200)
committerChocobozzz <florian.bigard@gmail.com>
Thu, 26 Oct 2017 07:11:38 +0000 (09:11 +0200)
package.json
server/controllers/api/users.ts
server/initializers/constants.ts
server/initializers/migrations/0080-video-channels.ts [new file with mode: 0644]

index ce8b77dbfb718aa604389ac813143d3bf8ce4854..3a617e5e09761eab8f07430b0734ee51fb24fbfb 100644 (file)
@@ -80,6 +80,7 @@
     "sequelize": "^4.7.5",
     "ts-node": "^3.3.0",
     "typescript": "^2.5.2",
+    "uuid": "^3.1.0",
     "validator": "^9.0.0",
     "winston": "^2.1.1",
     "ws": "^3.1.0"
index b49d37d4e7250a696ab28e3ffee53d3c229f0fa6..18a094f03bdd01fd5a1fef55b4f7c399f583ed16 100644 (file)
@@ -158,16 +158,14 @@ async function getUserVideoRating (req: express.Request, res: express.Response,
   const videoId = +req.params.videoId
   const userId = +res.locals.oauth.token.User.id
 
-  db.UserVideoRate.load(userId, videoId, null)
-    .then(ratingObj => {
-      const rating = ratingObj ? ratingObj.type : 'none'
-      const json: FormattedUserVideoRate = {
-        videoId,
-        rating
-      }
-      res.json(json)
-    })
-    .catch(err => next(err))
+  const ratingObj = await db.UserVideoRate.load(userId, videoId, null)
+  const rating = ratingObj ? ratingObj.type : 'none'
+
+  const json: FormattedUserVideoRate = {
+    videoId,
+    rating
+  }
+  res.json(json)
 }
 
 async function listUsers (req: express.Request, res: express.Response, next: express.NextFunction) {
index 54dce980f8e8ce52d553df5b978ef18290202d0e..71012f3a3d932ad9e407d323d4fbaee4b6ca6e96 100644 (file)
@@ -16,7 +16,7 @@ import {
 
 // ---------------------------------------------------------------------------
 
-const LAST_MIGRATION_VERSION = 75
+const LAST_MIGRATION_VERSION = 80
 
 // ---------------------------------------------------------------------------
 
diff --git a/server/initializers/migrations/0080-video-channels.ts b/server/initializers/migrations/0080-video-channels.ts
new file mode 100644 (file)
index 0000000..fc55ef3
--- /dev/null
@@ -0,0 +1,111 @@
+import * as Sequelize from 'sequelize'
+import * as uuidv4 from 'uuid/v4'
+
+async function up (utils: {
+  transaction: Sequelize.Transaction,
+  queryInterface: Sequelize.QueryInterface,
+  sequelize: Sequelize.Sequelize,
+  db: any
+}): Promise<void> {
+  const q = utils.queryInterface
+
+  // Assert not friends
+
+  // Create uuid column for author
+  const dataAuthorUUID = {
+    type: Sequelize.UUID,
+    defaultValue: Sequelize.UUIDV4,
+    allowNull: true
+  }
+  await q.addColumn('Authors', 'uuid', dataAuthorUUID)
+
+  // Set UUID to previous authors
+  {
+    const authors = await utils.db.Author.findAll()
+    for (const author of authors) {
+      author.uuid = uuidv4()
+      await author.save()
+    }
+  }
+
+  dataAuthorUUID.allowNull = false
+  await q.changeColumn('Authors', 'uuid', dataAuthorUUID)
+
+  // Create one author per user that does not already exist
+  const users = await utils.db.User.findAll()
+  for (const user of users) {
+    const author = await utils.db.Author.find({ where: { userId: user.id }})
+    if (!author) {
+      await utils.db.Author.create({
+        name: user.username,
+        podId: null, // It is our pod
+        userId: user.id
+      })
+    }
+  }
+
+  // Create video channels table
+  await utils.db.VideoChannel.sync()
+
+  // For each author, create its default video channel
+  const authors = await utils.db.Author.findAll()
+  for (const author of authors) {
+    await utils.db.VideoChannel.create({
+      name: `Default ${author.name} channel`,
+      remote: false,
+      authorId: author.id
+    })
+  }
+
+  // Create channelId column for videos
+  const dataChannelId = {
+    type: Sequelize.INTEGER,
+    defaultValue: null,
+    allowNull: true
+  }
+  await q.addColumn('Videos', 'channelId', dataChannelId)
+
+  const query = 'SELECT "id", "authorId" FROM "Videos"'
+  const options = {
+    type: Sequelize.QueryTypes.SELECT
+  }
+  const rawVideos = await utils.sequelize.query(query, options)
+
+  for (const rawVideo of rawVideos) {
+    const videoChannel = await utils.db.VideoChannel.findOne({ where: { authorId: rawVideo.authorId }})
+
+    const video = await utils.db.Video.findById(rawVideo.id)
+    video.channelId = videoChannel.id
+    await video.save()
+  }
+
+  dataChannelId.allowNull = false
+  await q.changeColumn('Videos', 'channelId', dataChannelId)
+
+  const constraintName = 'Videos_channelId_fkey'
+  const queryForeignKey = 'ALTER TABLE "Videos" ' +
+    ' ADD CONSTRAINT "' + constraintName + '"' +
+    ' FOREIGN KEY ("channelId") REFERENCES "VideoChannels" ON UPDATE CASCADE ON DELETE CASCADE'
+
+  await utils.sequelize.query(queryForeignKey)
+
+  await q.removeColumn('Videos', 'authorId')
+}
+
+function down (options) {
+  // update "Applications" SET "migrationVersion" = 75;
+  // delete from "Authors";
+  // alter table "Authors" drop column "uuid";
+  // ALTER SEQUENCE "Authors_id_seq" RESTART WITH 1
+  // INSERT INTO "Authors" ("name", "createdAt", "updatedAt", "userId") VALUES ('root', NOW(), NOW(), 1);
+  // alter table "Videos" drop column "channelId";
+  // drop table "VideoChannels";
+  // alter table "Videos" add column "authorId" INTEGER DEFAULT 1;
+  // alter table "Videos" ADD CONSTRAINT "coucou" FOREIGN KEY ("authorId") REFERENCES "Authors"
+  throw new Error('Not implemented.')
+}
+
+export {
+  up,
+  down
+}