diff options
Diffstat (limited to 'server')
-rw-r--r-- | server/helpers/middlewares/video-abuses.ts | 2 | ||||
-rw-r--r-- | server/initializers/migrations/0490-abuse-video.ts | 4 | ||||
-rw-r--r-- | server/models/account/account-blocklist.ts | 4 | ||||
-rw-r--r-- | server/models/server/server-blocklist.ts | 2 | ||||
-rw-r--r-- | server/models/utils.ts | 8 | ||||
-rw-r--r-- | server/models/video/video-abuse.ts | 43 | ||||
-rw-r--r-- | server/models/video/video-blacklist.ts | 2 | ||||
-rw-r--r-- | server/models/video/video.ts | 6 |
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 | ||
210 | function searchAttribute (sourceField, targetField) { | 210 | function 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' | |||
15 | import { CONSTRAINTS_FIELDS, VIDEO_ABUSE_STATES } from '../../initializers/constants' | 15 | import { CONSTRAINTS_FIELDS, VIDEO_ABUSE_STATES } from '../../initializers/constants' |
16 | import { MUserAccountId, MVideoAbuse, MVideoAbuseFormattable, MVideoAbuseVideo } from '../../typings/models' | 16 | import { MUserAccountId, MVideoAbuse, MVideoAbuseFormattable, MVideoAbuseVideo } from '../../typings/models' |
17 | import * as Bluebird from 'bluebird' | 17 | import * as Bluebird from 'bluebird' |
18 | import { literal, Op } from 'sequelize' | 18 | import { literal, Op, Sequelize } from 'sequelize' |
19 | import { ThumbnailModel } from './thumbnail' | 19 | import { ThumbnailModel } from './thumbnail' |
20 | import { VideoBlacklistModel } from './video-blacklist' | 20 | import { VideoBlacklistModel } from './video-blacklist' |
21 | import { ScopeNames as VideoChannelScopeNames, SummaryOptions, VideoChannelModel } from './video-channel' | 21 | import { 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) |