aboutsummaryrefslogtreecommitdiffhomepage
path: root/server
diff options
context:
space:
mode:
authorRigel Kent <sendmemail@rigelk.eu>2020-04-20 11:20:12 +0200
committerRigel Kent <par@rigelk.eu>2020-05-01 16:41:02 +0200
commit0251197e249cc03b65805ed6805da72bf4573529 (patch)
tree3aae202fd1ea24bac5cd7f2c380ffe50aae189a0 /server
parentb8cf27c0f86d205a279d03b83e0e6728f46da67f (diff)
downloadPeerTube-0251197e249cc03b65805ed6805da72bf4573529.tar.gz
PeerTube-0251197e249cc03b65805ed6805da72bf4573529.tar.zst
PeerTube-0251197e249cc03b65805ed6805da72bf4573529.zip
Factorize rest-table and fix/simplify SQL
Diffstat (limited to 'server')
-rw-r--r--server/helpers/middlewares/video-abuses.ts2
-rw-r--r--server/initializers/migrations/0490-abuse-video.ts4
-rw-r--r--server/models/account/account-blocklist.ts4
-rw-r--r--server/models/server/server-blocklist.ts2
-rw-r--r--server/models/utils.ts8
-rw-r--r--server/models/video/video-abuse.ts43
-rw-r--r--server/models/video/video-blacklist.ts2
-rw-r--r--server/models/video/video.ts6
8 files changed, 27 insertions, 44 deletions
diff --git a/server/helpers/middlewares/video-abuses.ts b/server/helpers/middlewares/video-abuses.ts
index 7553a5eb3..97a5724b6 100644
--- a/server/helpers/middlewares/video-abuses.ts
+++ b/server/helpers/middlewares/video-abuses.ts
@@ -7,7 +7,7 @@ async function doesVideoAbuseExist (abuseIdArg: number | string, videoUUID: stri
7 let videoAbuse = await VideoAbuseModel.loadByIdAndVideoId(abuseId, null, videoUUID) 7 let videoAbuse = await VideoAbuseModel.loadByIdAndVideoId(abuseId, null, videoUUID)
8 8
9 if (!videoAbuse) { 9 if (!videoAbuse) {
10 const userId = res.locals.oauth ? res.locals.oauth.token.User.id : undefined 10 const userId = res.locals.oauth?.token.User.id
11 const video = await fetchVideo(videoUUID, 'all', userId) 11 const video = await fetchVideo(videoUUID, 'all', userId)
12 12
13 if (video) videoAbuse = await VideoAbuseModel.loadByIdAndVideoId(abuseId, video.id) 13 if (video) videoAbuse = await VideoAbuseModel.loadByIdAndVideoId(abuseId, video.id)
diff --git a/server/initializers/migrations/0490-abuse-video.ts b/server/initializers/migrations/0490-abuse-video.ts
index 26333feb5..610307aa4 100644
--- a/server/initializers/migrations/0490-abuse-video.ts
+++ b/server/initializers/migrations/0490-abuse-video.ts
@@ -11,10 +11,8 @@ async function up (utils: {
11 allowNull: true 11 allowNull: true
12 } 12 }
13 await utils.queryInterface.addColumn('videoAbuse', 'deletedVideo', deletedVideo) 13 await utils.queryInterface.addColumn('videoAbuse', 'deletedVideo', deletedVideo)
14 await utils.sequelize.query(`ALTER TABLE "videoAbsue" ALTER COLUMN "videoId" DROP NOT NULL;`) 14 await utils.sequelize.query(`ALTER TABLE "videoAbuse" ALTER COLUMN "videoId" DROP NOT NULL;`)
15 await utils.sequelize.query(`ALTER TABLE "videoAbuse" DROP CONSTRAINT IF EXISTS "videoAbuse_videoId_fkey";`) 15 await utils.sequelize.query(`ALTER TABLE "videoAbuse" DROP CONSTRAINT IF EXISTS "videoAbuse_videoId_fkey";`)
16 await utils.sequelize.query(`ALTER TABLE "videoAbuse" ADD CONSTRAINT "videoAbuse_videoId_fkey"
17 FOREIGN KEY ("videoId") REFERENCES video(id) ON UPDATE CASCADE ON DELETE SET NULL;`)
18 16
19} 17}
20 18
diff --git a/server/models/account/account-blocklist.ts b/server/models/account/account-blocklist.ts
index fe2d5d010..d8a7ce4b4 100644
--- a/server/models/account/account-blocklist.ts
+++ b/server/models/account/account-blocklist.ts
@@ -133,8 +133,8 @@ export class AccountBlocklistModel extends Model<AccountBlocklistModel> {
133 if (search) { 133 if (search) {
134 Object.assign(where, { 134 Object.assign(where, {
135 [Op.or]: [ 135 [Op.or]: [
136 { ...searchAttribute(search, '$BlockedAccount.name$') }, 136 searchAttribute(search, '$BlockedAccount.name$'),
137 { ...searchAttribute(search, '$BlockedAccount.Actor.url$') } 137 searchAttribute(search, '$BlockedAccount.Actor.url$')
138 ] 138 ]
139 }) 139 })
140 } 140 }
diff --git a/server/models/server/server-blocklist.ts b/server/models/server/server-blocklist.ts
index 764203d2c..892024c04 100644
--- a/server/models/server/server-blocklist.ts
+++ b/server/models/server/server-blocklist.ts
@@ -139,8 +139,6 @@ export class ServerBlocklistModel extends Model<ServerBlocklistModel> {
139 } 139 }
140 } 140 }
141 141
142 console.log(search)
143
144 return ServerBlocklistModel 142 return ServerBlocklistModel
145 .scope([ ScopeNames.WITH_ACCOUNT, ScopeNames.WITH_SERVER ]) 143 .scope([ ScopeNames.WITH_ACCOUNT, ScopeNames.WITH_SERVER ])
146 .findAndCountAll<MServerBlocklistAccountServer>(query) 144 .findAndCountAll<MServerBlocklistAccountServer>(query)
diff --git a/server/models/utils.ts b/server/models/utils.ts
index 7137419a2..bdf2291f0 100644
--- a/server/models/utils.ts
+++ b/server/models/utils.ts
@@ -208,13 +208,15 @@ function buildDirectionAndField (value: string) {
208} 208}
209 209
210function searchAttribute (sourceField, targetField) { 210function searchAttribute (sourceField, targetField) {
211 return sourceField 211 if (sourceField) {
212 ? { 212 return {
213 [targetField]: { 213 [targetField]: {
214 [Op.iLike]: `%${sourceField}%` 214 [Op.iLike]: `%${sourceField}%`
215 } 215 }
216 } 216 }
217 : {} 217 } else {
218 return {}
219 }
218} 220}
219 221
220// --------------------------------------------------------------------------- 222// ---------------------------------------------------------------------------
diff --git a/server/models/video/video-abuse.ts b/server/models/video/video-abuse.ts
index e8c3bd823..71b519cd9 100644
--- a/server/models/video/video-abuse.ts
+++ b/server/models/video/video-abuse.ts
@@ -15,7 +15,7 @@ import { VideoAbuseState, VideoDetails } from '../../../shared'
15import { CONSTRAINTS_FIELDS, VIDEO_ABUSE_STATES } from '../../initializers/constants' 15import { CONSTRAINTS_FIELDS, VIDEO_ABUSE_STATES } from '../../initializers/constants'
16import { MUserAccountId, MVideoAbuse, MVideoAbuseFormattable, MVideoAbuseVideo } from '../../typings/models' 16import { MUserAccountId, MVideoAbuse, MVideoAbuseFormattable, MVideoAbuseVideo } from '../../typings/models'
17import * as Bluebird from 'bluebird' 17import * as Bluebird from 'bluebird'
18import { literal, Op } from 'sequelize' 18import { literal, Op, Sequelize } from 'sequelize'
19import { ThumbnailModel } from './thumbnail' 19import { ThumbnailModel } from './thumbnail'
20import { VideoBlacklistModel } from './video-blacklist' 20import { VideoBlacklistModel } from './video-blacklist'
21import { ScopeNames as VideoChannelScopeNames, SummaryOptions, VideoChannelModel } from './video-channel' 21import { ScopeNames as VideoChannelScopeNames, SummaryOptions, VideoChannelModel } from './video-channel'
@@ -31,7 +31,7 @@ export enum ScopeNames {
31 searchVideo?: string 31 searchVideo?: string
32 searchVideoChannel?: string 32 searchVideoChannel?: string
33 serverAccountId: number 33 serverAccountId: number
34 userAccountId: any 34 userAccountId: number
35 }) => { 35 }) => {
36 let where = { 36 let where = {
37 reporterAccountId: { 37 reporterAccountId: {
@@ -45,28 +45,28 @@ export enum ScopeNames {
45 { 45 {
46 [Op.and]: [ 46 [Op.and]: [
47 { videoId: { [Op.not]: null } }, 47 { videoId: { [Op.not]: null } },
48 { '$Video.name$': { [Op.iLike]: `%${options.search}%` } } 48 searchAttribute(options.search, '$Video.name$')
49 ] 49 ]
50 }, 50 },
51 { 51 {
52 [Op.and]: [ 52 [Op.and]: [
53 { videoId: { [Op.not]: null } }, 53 { videoId: { [Op.not]: null } },
54 { '$Video.VideoChannel.name$': { [Op.iLike]: `%${options.search}%` } } 54 searchAttribute(options.search, '$Video.VideoChannel.name$')
55 ] 55 ]
56 }, 56 },
57 { 57 {
58 [Op.and]: [ 58 [Op.and]: [
59 { deletedVideo: { [Op.not]: null } }, 59 { deletedVideo: { [Op.not]: null } },
60 { deletedVideo: { name: { [Op.iLike]: `%${options.search}%` } } } 60 { deletedVideo: searchAttribute(options.search, 'name') }
61 ] 61 ]
62 }, 62 },
63 { 63 {
64 [Op.and]: [ 64 [Op.and]: [
65 { deletedVideo: { [Op.not]: null } }, 65 { deletedVideo: { [Op.not]: null } },
66 { deletedVideo: { channel: { displayName: { [Op.iLike]: `%${options.search}%` } } } } 66 { deletedVideo: { channel: searchAttribute(options.search, 'displayName') } }
67 ] 67 ]
68 }, 68 },
69 { '$Account.name$': { [Op.iLike]: `%${options.search}%` } } 69 searchAttribute(options.search, '$Account.name$')
70 ] 70 ]
71 }) 71 })
72 } 72 }
@@ -77,13 +77,9 @@ export enum ScopeNames {
77 [ 77 [
78 literal( 78 literal(
79 '(' + 79 '(' +
80 'SELECT t.count ' + 80 'SELECT count(*) ' +
81 'FROM ( ' + 81 'FROM "videoAbuse" ' +
82 'SELECT id, ' + 82 'WHERE "videoId" = "VideoAbuseModel"."videoId" ' +
83 'count(id) OVER (PARTITION BY "videoId") ' +
84 'FROM "videoAbuse" ' +
85 ') t ' +
86 'WHERE t.id = "VideoAbuseModel".id ' +
87 ')' 83 ')'
88 ), 84 ),
89 'countReportsForVideo' 85 'countReportsForVideo'
@@ -118,20 +114,11 @@ export enum ScopeNames {
118 [ 114 [
119 literal( 115 literal(
120 '(' + 116 '(' +
121 'WITH ' + 117 'SELECT count(DISTINCT "videoAbuse"."id") ' +
122 'ids AS ( ' +
123 'SELECT "account"."id" ' +
124 'FROM "account" ' +
125 'INNER JOIN "videoChannel" ON "videoChannel"."accountId" = "account"."id" ' +
126 'INNER JOIN "video" ON "video"."channelId" = "videoChannel"."id" ' +
127 'WHERE "video"."id" = "VideoAbuseModel"."videoId" ' +
128 ') ' +
129 'SELECT count("videoAbuse"."id") ' +
130 'FROM "videoAbuse" ' + 118 'FROM "videoAbuse" ' +
131 'INNER JOIN "video" ON "video"."id" = "videoAbuse"."videoId" ' + 119 'INNER JOIN "video" ON "video"."id" = "videoAbuse"."videoId" ' +
132 'INNER JOIN "videoChannel" ON "videoChannel"."id" = "video"."channelId" ' + 120 'INNER JOIN "videoChannel" ON "videoChannel"."id" = "video"."channelId" ' +
133 'INNER JOIN "account" ON "videoChannel"."accountId" = "account"."id" ' + 121 'INNER JOIN "account" ON "videoChannel"."accountId" = "Video->VideoChannel"."accountId" ' +
134 'INNER JOIN ids ON "account"."id" = ids.id ' +
135 ')' 122 ')'
136 ), 123 ),
137 'countReportsForReportee' 124 'countReportsForReportee'
@@ -142,19 +129,19 @@ export enum ScopeNames {
142 { 129 {
143 model: AccountModel, 130 model: AccountModel,
144 required: true, 131 required: true,
145 where: { ...searchAttribute(options.searchReporter, 'name') } 132 where: searchAttribute(options.searchReporter, 'name')
146 }, 133 },
147 { 134 {
148 model: VideoModel, 135 model: VideoModel,
149 required: false, 136 required: false,
150 where: { ...searchAttribute(options.searchVideo, 'name') }, 137 where: searchAttribute(options.searchVideo, 'name'),
151 include: [ 138 include: [
152 { 139 {
153 model: ThumbnailModel 140 model: ThumbnailModel
154 }, 141 },
155 { 142 {
156 model: VideoChannelModel.scope({ method: [ VideoChannelScopeNames.SUMMARY, { withAccount: true } as SummaryOptions ] }), 143 model: VideoChannelModel.scope({ method: [ VideoChannelScopeNames.SUMMARY, { withAccount: true } as SummaryOptions ] }),
157 where: { ...searchAttribute(options.searchVideoChannel, 'name') } 144 where: searchAttribute(options.searchVideoChannel, 'name')
158 }, 145 },
159 { 146 {
160 attributes: [ 'id', 'reason', 'unfederated' ], 147 attributes: [ 'id', 'reason', 'unfederated' ],
diff --git a/server/models/video/video-blacklist.ts b/server/models/video/video-blacklist.ts
index 680eba471..8cbfe362e 100644
--- a/server/models/video/video-blacklist.ts
+++ b/server/models/video/video-blacklist.ts
@@ -78,7 +78,7 @@ export class VideoBlacklistModel extends Model<VideoBlacklistModel> {
78 { 78 {
79 model: VideoModel, 79 model: VideoModel,
80 required: true, 80 required: true,
81 where: { ...searchAttribute(search, 'name') }, 81 where: searchAttribute(search, 'name'),
82 include: [ 82 include: [
83 { 83 {
84 model: VideoChannelModel.scope({ method: [ VideoChannelScopeNames.SUMMARY, { withAccount: true } as SummaryOptions ] }), 84 model: VideoChannelModel.scope({ method: [ VideoChannelScopeNames.SUMMARY, { withAccount: true } as SummaryOptions ] }),
diff --git a/server/models/video/video.ts b/server/models/video/video.ts
index f32216e90..ccb9d64ca 100644
--- a/server/models/video/video.ts
+++ b/server/models/video/video.ts
@@ -813,10 +813,8 @@ export class VideoModel extends Model<VideoModel> {
813 const details = instance.toFormattedDetailsJSON() 813 const details = instance.toFormattedDetailsJSON()
814 814
815 for (const abuse of instance.VideoAbuses) { 815 for (const abuse of instance.VideoAbuses) {
816 tasks.push((_ => { 816 abuse.deletedVideo = details
817 abuse.deletedVideo = details 817 tasks.push(abuse.save({ transaction: options.transaction }))
818 return abuse.save({ transaction: options.transaction })
819 })())
820 } 818 }
821 819
822 Promise.all(tasks) 820 Promise.all(tasks)