1 import * as Sequelize from 'sequelize'
2 import { VideoPlaylistPrivacy, VideoPlaylistType } from '../../../shared/models/videos'
3 import { v4 as uuidv4 } from 'uuid'
4 import { WEBSERVER } from '../constants'
6 async function up (utils: {
7 transaction: Sequelize.Transaction
8 queryInterface: Sequelize.QueryInterface
9 sequelize: Sequelize.Sequelize
11 const transaction = utils.transaction
15 CREATE TABLE IF NOT EXISTS "videoPlaylist"
18 "name" VARCHAR(255) NOT NULL,
19 "description" VARCHAR(255),
20 "privacy" INTEGER NOT NULL,
21 "url" VARCHAR(2000) NOT NULL,
23 "type" INTEGER NOT NULL DEFAULT 1,
24 "ownerAccountId" INTEGER NOT NULL REFERENCES "account" ("id") ON DELETE CASCADE ON UPDATE CASCADE,
25 "videoChannelId" INTEGER REFERENCES "videoChannel" ("id") ON DELETE CASCADE ON UPDATE CASCADE,
26 "createdAt" TIMESTAMP WITH TIME ZONE NOT NULL,
27 "updatedAt" TIMESTAMP WITH TIME ZONE NOT NULL,
30 await utils.sequelize.query(query, { transaction })
35 CREATE TABLE IF NOT EXISTS "videoPlaylistElement"
38 "url" VARCHAR(2000) NOT NULL,
39 "position" INTEGER NOT NULL DEFAULT 1,
40 "startTimestamp" INTEGER,
41 "stopTimestamp" INTEGER,
42 "videoPlaylistId" INTEGER NOT NULL REFERENCES "videoPlaylist" ("id") ON DELETE CASCADE ON UPDATE CASCADE,
43 "videoId" INTEGER NOT NULL REFERENCES "video" ("id") ON DELETE CASCADE ON UPDATE CASCADE,
44 "createdAt" TIMESTAMP WITH TIME ZONE NOT NULL,
45 "updatedAt" TIMESTAMP WITH TIME ZONE NOT NULL,
49 await utils.sequelize.query(query, { transaction })
53 const userQuery = 'SELECT "username" FROM "user";'
55 const options = { transaction, type: Sequelize.QueryTypes.SELECT as Sequelize.QueryTypes.SELECT }
56 const userResult = await utils.sequelize.query<{ username: string }>(userQuery, options)
57 const usernames = userResult.map(r => r.username)
59 for (const username of usernames) {
62 const baseUrl = WEBSERVER.URL + '/video-playlists/' + uuid
64 INSERT INTO "videoPlaylist" ("url", "uuid", "name", "privacy", "type", "ownerAccountId", "createdAt", "updatedAt")
65 SELECT '${baseUrl}' AS "url",
67 'Watch later' AS "name",
68 ${VideoPlaylistPrivacy.PRIVATE} AS "privacy",
69 ${VideoPlaylistType.WATCH_LATER} AS "type",
70 "account"."id" AS "ownerAccountId",
73 FROM "user" INNER JOIN "account" ON "user"."id" = "account"."userId"
74 WHERE "user"."username" = '${username}'`
76 await utils.sequelize.query(query, { transaction })
81 function down (options) {
82 throw new Error('Not implemented.')