]>
Commit | Line | Data |
---|---|---|
1 | import * as Sequelize from 'sequelize' | |
2 | import { buildUUID } from '@shared/extra-utils' | |
3 | import { VideoPlaylistPrivacy, VideoPlaylistType } from '../../../shared/models/videos' | |
4 | import { WEBSERVER } from '../constants' | |
5 | ||
6 | async function up (utils: { | |
7 | transaction: Sequelize.Transaction | |
8 | queryInterface: Sequelize.QueryInterface | |
9 | sequelize: Sequelize.Sequelize | |
10 | }): Promise<void> { | |
11 | const transaction = utils.transaction | |
12 | ||
13 | { | |
14 | const query = ` | |
15 | CREATE TABLE IF NOT EXISTS "videoPlaylist" | |
16 | ( | |
17 | "id" SERIAL, | |
18 | "name" VARCHAR(255) NOT NULL, | |
19 | "description" VARCHAR(255), | |
20 | "privacy" INTEGER NOT NULL, | |
21 | "url" VARCHAR(2000) NOT NULL, | |
22 | "uuid" UUID 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, | |
28 | PRIMARY KEY ("id") | |
29 | );` | |
30 | await utils.sequelize.query(query, { transaction }) | |
31 | } | |
32 | ||
33 | { | |
34 | const query = ` | |
35 | CREATE TABLE IF NOT EXISTS "videoPlaylistElement" | |
36 | ( | |
37 | "id" SERIAL, | |
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, | |
46 | PRIMARY KEY ("id") | |
47 | );` | |
48 | ||
49 | await utils.sequelize.query(query, { transaction }) | |
50 | } | |
51 | ||
52 | { | |
53 | const userQuery = 'SELECT "username" FROM "user";' | |
54 | ||
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) | |
58 | ||
59 | for (const username of usernames) { | |
60 | const uuid = buildUUID() | |
61 | ||
62 | const baseUrl = WEBSERVER.URL + '/video-playlists/' + uuid | |
63 | const query = ` | |
64 | INSERT INTO "videoPlaylist" ("url", "uuid", "name", "privacy", "type", "ownerAccountId", "createdAt", "updatedAt") | |
65 | SELECT '${baseUrl}' AS "url", | |
66 | '${uuid}' AS "uuid", | |
67 | 'Watch later' AS "name", | |
68 | ${VideoPlaylistPrivacy.PRIVATE} AS "privacy", | |
69 | ${VideoPlaylistType.WATCH_LATER} AS "type", | |
70 | "account"."id" AS "ownerAccountId", | |
71 | NOW() as "createdAt", | |
72 | NOW() as "updatedAt" | |
73 | FROM "user" INNER JOIN "account" ON "user"."id" = "account"."userId" | |
74 | WHERE "user"."username" = '${username}'` | |
75 | ||
76 | await utils.sequelize.query(query, { transaction }) | |
77 | } | |
78 | } | |
79 | } | |
80 | ||
81 | function down (options) { | |
82 | throw new Error('Not implemented.') | |
83 | } | |
84 | ||
85 | export { | |
86 | up, | |
87 | down | |
88 | } |