aboutsummaryrefslogtreecommitdiffhomepage
path: root/server/initializers
diff options
context:
space:
mode:
authorWicklow <123956049+wickloww@users.noreply.github.com>2023-03-31 07:12:21 +0000
committerGitHub <noreply@github.com>2023-03-31 09:12:21 +0200
commit05a60d85997c108d39bcfb14f1ffd4c74f8b1e93 (patch)
tree5041a95ef945620a17f25ba934064b41f6bb00b7 /server/initializers
parentebd61437c1ec92bea9772924c7051cb00d71f778 (diff)
downloadPeerTube-05a60d85997c108d39bcfb14f1ffd4c74f8b1e93.tar.gz
PeerTube-05a60d85997c108d39bcfb14f1ffd4c74f8b1e93.tar.zst
PeerTube-05a60d85997c108d39bcfb14f1ffd4c74f8b1e93.zip
Feature/Add replay privacy (#5692)
* Add replay settings feature * Fix replay settings behaviour * Fix tests * Fix tests * Fix tests * Update openapi doc and fix tests * Add tests and fix code * Models correction * Add migration and update controller and middleware * Add check params tests * Fix video live middleware * Updated code based on review comments
Diffstat (limited to 'server/initializers')
-rw-r--r--server/initializers/constants.ts2
-rw-r--r--server/initializers/database.ts2
-rw-r--r--server/initializers/migrations/0760-video-live-replay-setting.ts125
3 files changed, 128 insertions, 1 deletions
diff --git a/server/initializers/constants.ts b/server/initializers/constants.ts
index 4703e20f2..6cad4eb23 100644
--- a/server/initializers/constants.ts
+++ b/server/initializers/constants.ts
@@ -26,7 +26,7 @@ import { CONFIG, registerConfigChangedHandler } from './config'
26 26
27// --------------------------------------------------------------------------- 27// ---------------------------------------------------------------------------
28 28
29const LAST_MIGRATION_VERSION = 755 29const LAST_MIGRATION_VERSION = 760
30 30
31// --------------------------------------------------------------------------- 31// ---------------------------------------------------------------------------
32 32
diff --git a/server/initializers/database.ts b/server/initializers/database.ts
index 96145f489..3f31099ed 100644
--- a/server/initializers/database.ts
+++ b/server/initializers/database.ts
@@ -52,6 +52,7 @@ import { VideoStreamingPlaylistModel } from '../models/video/video-streaming-pla
52import { VideoTagModel } from '../models/video/video-tag' 52import { VideoTagModel } from '../models/video/video-tag'
53import { VideoViewModel } from '../models/view/video-view' 53import { VideoViewModel } from '../models/view/video-view'
54import { CONFIG } from './config' 54import { CONFIG } from './config'
55import { VideoLiveReplaySettingModel } from '@server/models/video/video-live-replay-setting'
55 56
56require('pg').defaults.parseInt8 = true // Avoid BIGINT to be converted to string 57require('pg').defaults.parseInt8 = true // Avoid BIGINT to be converted to string
57 58
@@ -141,6 +142,7 @@ async function initDatabaseModels (silent: boolean) {
141 UserVideoHistoryModel, 142 UserVideoHistoryModel,
142 VideoLiveModel, 143 VideoLiveModel,
143 VideoLiveSessionModel, 144 VideoLiveSessionModel,
145 VideoLiveReplaySettingModel,
144 AccountBlocklistModel, 146 AccountBlocklistModel,
145 ServerBlocklistModel, 147 ServerBlocklistModel,
146 UserNotificationModel, 148 UserNotificationModel,
diff --git a/server/initializers/migrations/0760-video-live-replay-setting.ts b/server/initializers/migrations/0760-video-live-replay-setting.ts
new file mode 100644
index 000000000..7878df3f7
--- /dev/null
+++ b/server/initializers/migrations/0760-video-live-replay-setting.ts
@@ -0,0 +1,125 @@
1import * as Sequelize from 'sequelize'
2
3async function up (utils: {
4 transaction: Sequelize.Transaction
5 queryInterface: Sequelize.QueryInterface
6 sequelize: Sequelize.Sequelize
7}): Promise<void> {
8 {
9 const query = `
10 CREATE TABLE IF NOT EXISTS "videoLiveReplaySetting" (
11 "id" SERIAL ,
12 "privacy" INTEGER NOT NULL,
13 "createdAt" TIMESTAMP WITH TIME ZONE NOT NULL,
14 "updatedAt" TIMESTAMP WITH TIME ZONE NOT NULL,
15 PRIMARY KEY ("id")
16 );
17 `
18
19 await utils.sequelize.query(query, { transaction : utils.transaction })
20 }
21
22 {
23 await utils.queryInterface.addColumn('videoLive', 'replaySettingId', {
24 type: Sequelize.INTEGER,
25 defaultValue: null,
26 allowNull: true,
27 references: {
28 model: 'videoLiveReplaySetting',
29 key: 'id'
30 },
31 onDelete: 'SET NULL'
32 }, { transaction: utils.transaction })
33 }
34
35 {
36 await utils.queryInterface.addColumn('videoLiveSession', 'replaySettingId', {
37 type: Sequelize.INTEGER,
38 defaultValue: null,
39 allowNull: true,
40 references: {
41 model: 'videoLiveReplaySetting',
42 key: 'id'
43 },
44 onDelete: 'SET NULL'
45 }, { transaction: utils.transaction })
46 }
47
48 {
49 const query = `
50 SELECT live."id", v."privacy"
51 FROM "videoLive" live
52 INNER JOIN "video" v ON live."videoId" = v."id"
53 WHERE live."saveReplay" = true
54 `
55
56 const videoLives = await utils.sequelize.query<{ id: number, privacy: number }>(
57 query,
58 { type: Sequelize.QueryTypes.SELECT, transaction: utils.transaction }
59 )
60
61 for (const videoLive of videoLives) {
62 const query = `
63 WITH new_replay_setting AS (
64 INSERT INTO "videoLiveReplaySetting" ("privacy", "createdAt", "updatedAt")
65 VALUES (:privacy, NOW(), NOW())
66 RETURNING id
67 )
68 UPDATE "videoLive" SET "replaySettingId" = (SELECT id FROM new_replay_setting)
69 WHERE "id" = :id
70 `
71
72 const options = {
73 replacements: { privacy: videoLive.privacy, id: videoLive.id },
74 type: Sequelize.QueryTypes.UPDATE,
75 transaction: utils.transaction
76 }
77
78 await utils.sequelize.query(query, options)
79 }
80 }
81
82 {
83 const query = `
84 SELECT session."id", v."privacy"
85 FROM "videoLiveSession" session
86 INNER JOIN "video" v ON session."liveVideoId" = v."id"
87 WHERE session."saveReplay" = true
88 AND session."liveVideoId" IS NOT NULL;
89 `
90
91 const videoLiveSessions = await utils.sequelize.query<{ id: number, privacy: number }>(
92 query,
93 { type: Sequelize.QueryTypes.SELECT, transaction: utils.transaction }
94 )
95
96 for (const videoLive of videoLiveSessions) {
97 const query = `
98 WITH new_replay_setting AS (
99 INSERT INTO "videoLiveReplaySetting" ("privacy", "createdAt", "updatedAt")
100 VALUES (:privacy, NOW(), NOW())
101 RETURNING id
102 )
103 UPDATE "videoLiveSession" SET "replaySettingId" = (SELECT id FROM new_replay_setting)
104 WHERE "id" = :id
105 `
106
107 const options = {
108 replacements: { privacy: videoLive.privacy, id: videoLive.id },
109 type: Sequelize.QueryTypes.UPDATE,
110 transaction: utils.transaction
111 }
112
113 await utils.sequelize.query(query, options)
114 }
115 }
116}
117
118function down (options) {
119 throw new Error('Not implemented.')
120}
121
122export {
123 up,
124 down
125}