aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--client/src/app/+admin/moderation/instance-blocklist/instance-server-blocklist.component.html7
-rw-r--r--client/src/app/+admin/moderation/instance-blocklist/instance-server-blocklist.component.scss14
-rw-r--r--client/src/app/+admin/moderation/moderation.component.scss5
-rw-r--r--client/src/app/+admin/moderation/video-abuse-list/video-abuse-list.component.html23
-rw-r--r--client/src/app/+admin/moderation/video-abuse-list/video-abuse-list.component.scss57
-rw-r--r--client/src/app/+admin/moderation/video-abuse-list/video-abuse-list.component.ts49
-rw-r--r--client/src/app/+admin/users/user-edit/user-update.component.ts2
-rw-r--r--server/lib/emailer.ts2
-rw-r--r--server/models/video/video-abuse.ts54
-rw-r--r--server/models/video/video.ts2
-rw-r--r--server/typings/models/video/video-abuse.ts9
-rw-r--r--shared/models/videos/abuse/video-abuse.model.ts4
12 files changed, 193 insertions, 35 deletions
diff --git a/client/src/app/+admin/moderation/instance-blocklist/instance-server-blocklist.component.html b/client/src/app/+admin/moderation/instance-blocklist/instance-server-blocklist.component.html
index 075be8498..19b33a0f5 100644
--- a/client/src/app/+admin/moderation/instance-blocklist/instance-server-blocklist.component.html
+++ b/client/src/app/+admin/moderation/instance-blocklist/instance-server-blocklist.component.html
@@ -23,7 +23,12 @@
23 23
24 <ng-template pTemplate="body" let-serverBlock> 24 <ng-template pTemplate="body" let-serverBlock>
25 <tr> 25 <tr>
26 <td>{{ serverBlock.blockedServer.host }}</td> 26 <td>
27 <a [href]="'https://' + serverBlock.blockedServer.host" i18n-title title="Open instance in a new tab" target="_blank" rel="noopener noreferrer">
28 {{ serverBlock.blockedServer.host }}
29 <span class="glyphicon glyphicon-new-window"></span>
30 </a>
31 </td>
27 <td>{{ serverBlock.createdAt }}</td> 32 <td>{{ serverBlock.createdAt }}</td>
28 <td class="action-cell"> 33 <td class="action-cell">
29 <button class="unblock-button" (click)="unblockServer(serverBlock)" i18n>Unmute</button> 34 <button class="unblock-button" (click)="unblockServer(serverBlock)" i18n>Unmute</button>
diff --git a/client/src/app/+admin/moderation/instance-blocklist/instance-server-blocklist.component.scss b/client/src/app/+admin/moderation/instance-blocklist/instance-server-blocklist.component.scss
index 9d3bedd80..c6c71587f 100644
--- a/client/src/app/+admin/moderation/instance-blocklist/instance-server-blocklist.component.scss
+++ b/client/src/app/+admin/moderation/instance-blocklist/instance-server-blocklist.component.scss
@@ -1,6 +1,20 @@
1@import '_variables'; 1@import '_variables';
2@import '_mixins'; 2@import '_mixins';
3 3
4a {
5 @include disable-default-a-behaviour;
6 display: inline-block;
7
8 &, &:hover {
9 color: var(--mainForegroundColor);
10 }
11
12 span {
13 font-size: 80%;
14 color: var(--inputPlaceholderColor);
15 }
16}
17
4.unblock-button { 18.unblock-button {
5 @include peertube-button; 19 @include peertube-button;
6 @include grey-button; 20 @include grey-button;
diff --git a/client/src/app/+admin/moderation/moderation.component.scss b/client/src/app/+admin/moderation/moderation.component.scss
index a015b6d85..9ceff1161 100644
--- a/client/src/app/+admin/moderation/moderation.component.scss
+++ b/client/src/app/+admin/moderation/moderation.component.scss
@@ -29,10 +29,6 @@
29 } 29 }
30} 30}
31 31
32.glyphicon-trash {
33 font-size: 80%;
34}
35
36.screenratio { 32.screenratio {
37 position: relative; 33 position: relative;
38 width: 100%; 34 width: 100%;
@@ -47,6 +43,7 @@
47 display: inline-flex; 43 display: inline-flex;
48 justify-content: center; 44 justify-content: center;
49 align-items: center; 45 align-items: center;
46 color: var(--inputPlaceholderColor);
50 } 47 }
51 48
52 ::ng-deep iframe { 49 ::ng-deep iframe {
diff --git a/client/src/app/+admin/moderation/video-abuse-list/video-abuse-list.component.html b/client/src/app/+admin/moderation/video-abuse-list/video-abuse-list.component.html
index 204cb209e..2204bb371 100644
--- a/client/src/app/+admin/moderation/video-abuse-list/video-abuse-list.component.html
+++ b/client/src/app/+admin/moderation/video-abuse-list/video-abuse-list.component.html
@@ -41,9 +41,22 @@
41 </td> 41 </td>
42 42
43 <td> 43 <td>
44 <span *ngIf="videoAbuse.video.deleted" i18n-title title="Video was deleted" class="glyphicon glyphicon-trash"></span> 44 <a [href]="getVideoUrl(videoAbuse)" class="video-abuse-video-link" i18n-title title="Open video in a new tab" target="_blank" rel="noopener noreferrer">
45 <a [href]="getVideoUrl(videoAbuse)" i18n-title title="Open video in a new tab" target="_blank" rel="noopener noreferrer"> 45 <div class="video-abuse-video">
46 {{ videoAbuse.video.name }} 46 <div class="video-abuse-video-image">
47 <img *ngIf="!videoAbuse.video.deleted" [src]="videoAbuse.video.thumbnailPath">
48 <span *ngIf="videoAbuse.video.deleted" i18n>Deleted</span>
49 </div>
50 <div class="video-abuse-video-text">
51 <div>
52 {{ videoAbuse.video.name }}
53 <span *ngIf="!videoAbuse.video.deleted && !videoAbuse.video.blacklisted" class="glyphicon glyphicon-new-window"></span>
54 <span *ngIf="videoAbuse.video.deleted" i18n-title title="Video was deleted" class="glyphicon glyphicon-trash"></span>
55 <span *ngIf="videoAbuse.video.blacklisted" i18n-title title="Video was blacklisted" class="glyphicon glyphicon-ban-circle"></span>
56 </div>
57 <div class="text-muted">by {{ videoAbuse.video.channel?.displayName }} on {{ videoAbuse.video.channel?.host }} </div>
58 </div>
59 </div>
47 </a> 60 </a>
48 </td> 61 </td>
49 62
@@ -78,10 +91,10 @@
78 91
79 <div class="col-4"> 92 <div class="col-4">
80 <div class="screenratio"> 93 <div class="screenratio">
81 <div *ngIf="videoAbuse.video.deleted"> 94 <div *ngIf="videoAbuse.video.deleted || videoAbuse.video.blacklisted">
82 <span i18n>The video was {{ videoAbuse.video.deleted ? 'deleted' : 'blacklisted' }}</span> 95 <span i18n>The video was {{ videoAbuse.video.deleted ? 'deleted' : 'blacklisted' }}</span>
83 </div> 96 </div>
84 <div *ngIf="!videoAbuse.video.deleted" [innerHTML]="videoAbuse.embedHtml"></div> 97 <div *ngIf="!videoAbuse.video.deleted && !videoAbuse.video.blacklisted" [innerHTML]="videoAbuse.embedHtml"></div>
85 </div> 98 </div>
86 </div> 99 </div>
87 </div> 100 </div>
diff --git a/client/src/app/+admin/moderation/video-abuse-list/video-abuse-list.component.scss b/client/src/app/+admin/moderation/video-abuse-list/video-abuse-list.component.scss
new file mode 100644
index 000000000..09402fda7
--- /dev/null
+++ b/client/src/app/+admin/moderation/video-abuse-list/video-abuse-list.component.scss
@@ -0,0 +1,57 @@
1@import 'mixins';
2@import 'miniature';
3
4.video-abuse-video-link {
5 @include disable-outline;
6 position: relative;
7 top: 3px;
8}
9
10.video-abuse-video {
11 display: inline-flex;
12
13 .video-abuse-video-image {
14 @include miniature-thumbnail;
15
16 $image-height: 45px;
17
18 height: $image-height;
19 width: #{(16/9) * $image-height};
20 margin-right: 0.5rem;
21 border-radius: 2px;
22 border: none;
23 background: transparent;
24 display: inline-flex;
25 justify-content: center;
26 align-items: center;
27
28 img {
29 height: 100%;
30 width: 100%;
31 border-radius: 2px;
32 }
33
34 span {
35 color: var(--inputPlaceholderColor);
36 }
37 }
38
39 .video-abuse-video-text {
40 display: inline-flex;
41 flex-direction: column;
42 justify-content: center;
43 font-size: 90%;
44 color: var(--mainForegroundColor);
45 line-height: 1rem;
46
47 div .glyphicon {
48 font-size: 80%;
49 color: gray;
50 margin-left: 0.1rem;
51 }
52
53 div + div {
54 font-size: 80%;
55 }
56 }
57}
diff --git a/client/src/app/+admin/moderation/video-abuse-list/video-abuse-list.component.ts b/client/src/app/+admin/moderation/video-abuse-list/video-abuse-list.component.ts
index 9858cbce2..cc5014ae8 100644
--- a/client/src/app/+admin/moderation/video-abuse-list/video-abuse-list.component.ts
+++ b/client/src/app/+admin/moderation/video-abuse-list/video-abuse-list.component.ts
@@ -20,14 +20,14 @@ import { VideoService } from '@app/shared/video/video.service'
20@Component({ 20@Component({
21 selector: 'my-video-abuse-list', 21 selector: 'my-video-abuse-list',
22 templateUrl: './video-abuse-list.component.html', 22 templateUrl: './video-abuse-list.component.html',
23 styleUrls: [ '../moderation.component.scss'] 23 styleUrls: [ '../moderation.component.scss', './video-abuse-list.component.scss' ]
24}) 24})
25export class VideoAbuseListComponent extends RestTable implements OnInit { 25export class VideoAbuseListComponent extends RestTable implements OnInit {
26 @ViewChild('moderationCommentModal', { static: true }) moderationCommentModal: ModerationCommentModalComponent 26 @ViewChild('moderationCommentModal', { static: true }) moderationCommentModal: ModerationCommentModalComponent
27 27
28 videoAbuses: (VideoAbuse & { moderationCommentHtml?: string, reasonHtml?: string })[] = [] 28 videoAbuses: (VideoAbuse & { moderationCommentHtml?: string, reasonHtml?: string })[] = []
29 totalRecords = 0 29 totalRecords = 0
30 rowsPerPageOptions = [ 20, 50, 100 ] 30 rowsPerPageOptions = [ 20, 50, 100 ]
31 rowsPerPage = this.rowsPerPageOptions[0] 31 rowsPerPage = this.rowsPerPageOptions[0]
32 sort: SortMeta = { field: 'createdAt', order: 1 } 32 sort: SortMeta = { field: 'createdAt', order: 1 }
33 pagination: RestPagination = { count: this.rowsPerPage, start: 0 } 33 pagination: RestPagination = { count: this.rowsPerPage, start: 0 }
@@ -86,7 +86,7 @@ export class VideoAbuseListComponent extends RestTable implements OnInit {
86 }, 86 },
87 { 87 {
88 label: this.i18n('Blacklist video'), 88 label: this.i18n('Blacklist video'),
89 isDisplayed: videoAbuse => !videoAbuse.video.deleted, 89 isDisplayed: videoAbuse => !videoAbuse.video.deleted && !videoAbuse.video.blacklisted,
90 handler: videoAbuse => { 90 handler: videoAbuse => {
91 this.videoBlacklistService.blacklistVideo(videoAbuse.video.id, undefined, true) 91 this.videoBlacklistService.blacklistVideo(videoAbuse.video.id, undefined, true)
92 .subscribe( 92 .subscribe(
@@ -101,10 +101,29 @@ export class VideoAbuseListComponent extends RestTable implements OnInit {
101 } 101 }
102 }, 102 },
103 { 103 {
104 label: this.i18n('Unblacklist video'),
105 isDisplayed: videoAbuse => !videoAbuse.video.deleted && videoAbuse.video.blacklisted,
106 handler: videoAbuse => {
107 this.videoBlacklistService.removeVideoFromBlacklist(videoAbuse.video.id)
108 .subscribe(
109 () => {
110 this.notifier.success(this.i18n('Video unblacklisted.'))
111
112 this.updateVideoAbuseState(videoAbuse, VideoAbuseState.ACCEPTED)
113 },
114
115 err => this.notifier.error(err.message)
116 )
117 }
118 },
119 {
104 label: this.i18n('Delete video'), 120 label: this.i18n('Delete video'),
105 isDisplayed: videoAbuse => !videoAbuse.video.deleted, 121 isDisplayed: videoAbuse => !videoAbuse.video.deleted,
106 handler: async videoAbuse => { 122 handler: async videoAbuse => {
107 const res = await this.confirmService.confirm(this.i18n('Do you really want to delete this video?'), this.i18n('Delete')) 123 const res = await this.confirmService.confirm(
124 this.i18n('Do you really want to delete this video?'),
125 this.i18n('Delete')
126 )
108 if (res === false) return 127 if (res === false) return
109 128
110 this.videoService.removeVideo(videoAbuse.video.id) 129 this.videoService.removeVideo(videoAbuse.video.id)
@@ -126,14 +145,16 @@ export class VideoAbuseListComponent extends RestTable implements OnInit {
126 isHeader: true 145 isHeader: true
127 }, 146 },
128 { 147 {
129 label: this.i18n('Mute reporter'), 148 label: this.i18n('Mute reporter'),
130 handler: async videoAbuse => { 149 handler: async videoAbuse => {
131 const account = videoAbuse.reporterAccount as Account 150 const account = videoAbuse.reporterAccount as Account
132 151
133 this.blocklistService.blockAccountByInstance(account) 152 this.blocklistService.blockAccountByInstance(account)
134 .subscribe( 153 .subscribe(
135 () => { 154 () => {
136 this.notifier.success(this.i18n('Account {{nameWithHost}} muted by the instance.', { nameWithHost: account.nameWithHost })) 155 this.notifier.success(
156 this.i18n('Account {{nameWithHost}} muted by the instance.', { nameWithHost: account.nameWithHost })
157 )
137 158
138 account.mutedByInstance = true 159 account.mutedByInstance = true
139 }, 160 },
@@ -141,6 +162,22 @@ export class VideoAbuseListComponent extends RestTable implements OnInit {
141 err => this.notifier.error(err.message) 162 err => this.notifier.error(err.message)
142 ) 163 )
143 } 164 }
165 },
166 {
167 label: this.i18n('Mute server'),
168 isDisplayed: videoAbuse => !videoAbuse.reporterAccount.userId,
169 handler: async videoAbuse => {
170 this.blocklistService.blockServerByInstance(videoAbuse.reporterAccount.host)
171 .subscribe(
172 () => {
173 this.notifier.success(
174 this.i18n('Server {{host}} muted by the instance.', { host: videoAbuse.reporterAccount.host })
175 )
176 },
177
178 err => this.notifier.error(err.message)
179 )
180 }
144 } 181 }
145 ] 182 ]
146 ] 183 ]
diff --git a/client/src/app/+admin/users/user-edit/user-update.component.ts b/client/src/app/+admin/users/user-edit/user-update.component.ts
index fbe3d6950..e0e1fbddf 100644
--- a/client/src/app/+admin/users/user-edit/user-update.component.ts
+++ b/client/src/app/+admin/users/user-edit/user-update.component.ts
@@ -85,7 +85,7 @@ export class UserUpdateComponent extends UserEdit implements OnInit, OnDestroy {
85 85
86 this.userService.updateUser(this.user.id, userUpdate).subscribe( 86 this.userService.updateUser(this.user.id, userUpdate).subscribe(
87 () => { 87 () => {
88 this.notifier.success(this.i18n('User {{user.username}} updated.', { username: this.user.username })) 88 this.notifier.success(this.i18n('User {{username}} updated.', { username: this.user.username }))
89 this.router.navigate([ '/admin/users/list' ]) 89 this.router.navigate([ '/admin/users/list' ])
90 }, 90 },
91 91
diff --git a/server/lib/emailer.ts b/server/lib/emailer.ts
index 2c0641f3a..5a99edc7f 100644
--- a/server/lib/emailer.ts
+++ b/server/lib/emailer.ts
@@ -292,7 +292,7 @@ class Emailer {
292 const videoUrl = WEBSERVER.URL + videoAbuse.Video.getWatchStaticPath() 292 const videoUrl = WEBSERVER.URL + videoAbuse.Video.getWatchStaticPath()
293 293
294 const text = 'Hi,\n\n' + 294 const text = 'Hi,\n\n' +
295 `${WEBSERVER.HOST} received an abuse for the following video ${videoUrl}\n\n` + 295 `${WEBSERVER.HOST} received an abuse for the following video: ${videoUrl}\n\n` +
296 'Cheers,\n' + 296 'Cheers,\n' +
297 `${CONFIG.EMAIL.BODY.SIGNATURE}` 297 `${CONFIG.EMAIL.BODY.SIGNATURE}`
298 298
diff --git a/server/models/video/video-abuse.ts b/server/models/video/video-abuse.ts
index ea9856213..ea943ffdf 100644
--- a/server/models/video/video-abuse.ts
+++ b/server/models/video/video-abuse.ts
@@ -1,4 +1,6 @@
1import { AllowNull, BelongsTo, Column, CreatedAt, DataType, Default, ForeignKey, Is, Model, Table, UpdatedAt } from 'sequelize-typescript' 1import {
2 AllowNull, BelongsTo, Column, CreatedAt, DataType, Default, ForeignKey, Is, Model, Table, UpdatedAt, DefaultScope
3} from 'sequelize-typescript'
2import { VideoAbuseObject } from '../../../shared/models/activitypub/objects' 4import { VideoAbuseObject } from '../../../shared/models/activitypub/objects'
3import { VideoAbuse } from '../../../shared/models/videos' 5import { VideoAbuse } from '../../../shared/models/videos'
4import { 6import {
@@ -14,7 +16,40 @@ import { CONSTRAINTS_FIELDS, VIDEO_ABUSE_STATES } from '../../initializers/const
14import { MUserAccountId, MVideoAbuse, MVideoAbuseFormattable, MVideoAbuseVideo } from '../../typings/models' 16import { MUserAccountId, MVideoAbuse, MVideoAbuseFormattable, MVideoAbuseVideo } from '../../typings/models'
15import * as Bluebird from 'bluebird' 17import * as Bluebird from 'bluebird'
16import { literal, Op } from 'sequelize' 18import { literal, Op } from 'sequelize'
19import { ThumbnailModel } from './thumbnail'
20import { VideoChannelModel } from './video-channel'
21import { ActorModel } from '../activitypub/actor'
22import { VideoBlacklistModel } from './video-blacklist'
17 23
24@DefaultScope(() => ({
25 include: [
26 {
27 model: AccountModel,
28 required: true
29 },
30 {
31 model: VideoModel,
32 required: false,
33 include: [
34 {
35 model: ThumbnailModel
36 },
37 {
38 model: VideoChannelModel.unscoped(),
39 include: [
40 {
41 model: ActorModel
42 }
43 ]
44 },
45 {
46 attributes: [ 'id', 'reason', 'unfederated' ],
47 model: VideoBlacklistModel
48 }
49 ]
50 }
51 ]
52}))
18@Table({ 53@Table({
19 tableName: 'videoAbuse', 54 tableName: 'videoAbuse',
20 indexes: [ 55 indexes: [
@@ -114,16 +149,8 @@ export class VideoAbuseModel extends Model<VideoAbuseModel> {
114 [Op.notIn]: literal('(' + buildBlockedAccountSQL(serverAccountId, userAccountId) + ')') 149 [Op.notIn]: literal('(' + buildBlockedAccountSQL(serverAccountId, userAccountId) + ')')
115 } 150 }
116 }, 151 },
117 include: [ 152 col: 'VideoAbuseModel.id',
118 { 153 distinct: true
119 model: AccountModel,
120 required: true
121 },
122 {
123 model: VideoModel,
124 required: false
125 }
126 ]
127 } 154 }
128 155
129 return VideoAbuseModel.findAndCountAll(query) 156 return VideoAbuseModel.findAndCountAll(query)
@@ -151,7 +178,10 @@ export class VideoAbuseModel extends Model<VideoAbuseModel> {
151 uuid: video.uuid, 178 uuid: video.uuid,
152 name: video.name, 179 name: video.name,
153 nsfw: video.nsfw, 180 nsfw: video.nsfw,
154 deleted: !this.Video 181 deleted: !this.Video,
182 blacklisted: this.Video && this.Video.isBlacklisted(),
183 thumbnailPath: this.Video?.getMiniatureStaticPath(),
184 channel: this.Video?.VideoChannel.toFormattedSummaryJSON() || this.deletedVideo?.channel
155 }, 185 },
156 createdAt: this.createdAt 186 createdAt: this.createdAt
157 } 187 }
diff --git a/server/models/video/video.ts b/server/models/video/video.ts
index 2636ebd8e..f32216e90 100644
--- a/server/models/video/video.ts
+++ b/server/models/video/video.ts
@@ -810,7 +810,7 @@ export class VideoModel extends Model<VideoModel> {
810 if (instance.VideoAbuses.length === 0) return undefined 810 if (instance.VideoAbuses.length === 0) return undefined
811 } 811 }
812 812
813 const details = instance.toFormattedJSON() 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 tasks.push((_ => {
diff --git a/server/typings/models/video/video-abuse.ts b/server/typings/models/video/video-abuse.ts
index 49bd1ff2e..54acccdf5 100644
--- a/server/typings/models/video/video-abuse.ts
+++ b/server/typings/models/video/video-abuse.ts
@@ -1,6 +1,6 @@
1import { VideoAbuseModel } from '../../../models/video/video-abuse' 1import { VideoAbuseModel } from '../../../models/video/video-abuse'
2import { PickWith } from '../../utils' 2import { PickWith } from '../../utils'
3import { MVideo } from './video' 3import { MVideoAccountLightBlacklistAllFiles } from './video'
4import { MAccountDefault, MAccountFormattable } from '../account' 4import { MAccountDefault, MAccountFormattable } from '../account'
5 5
6type Use<K extends keyof VideoAbuseModel, M> = PickWith<VideoAbuseModel, K, M> 6type Use<K extends keyof VideoAbuseModel, M> = PickWith<VideoAbuseModel, K, M>
@@ -16,12 +16,12 @@ export type MVideoAbuseId = Pick<VideoAbuseModel, 'id'>
16export type MVideoAbuseVideo = 16export type MVideoAbuseVideo =
17 MVideoAbuse & 17 MVideoAbuse &
18 Pick<VideoAbuseModel, 'toActivityPubObject'> & 18 Pick<VideoAbuseModel, 'toActivityPubObject'> &
19 Use<'Video', MVideo> 19 Use<'Video', MVideoAccountLightBlacklistAllFiles>
20 20
21export type MVideoAbuseAccountVideo = 21export type MVideoAbuseAccountVideo =
22 MVideoAbuse & 22 MVideoAbuse &
23 Pick<VideoAbuseModel, 'toActivityPubObject'> & 23 Pick<VideoAbuseModel, 'toActivityPubObject'> &
24 Use<'Video', MVideo> & 24 Use<'Video', MVideoAccountLightBlacklistAllFiles> &
25 Use<'Account', MAccountDefault> 25 Use<'Account', MAccountDefault>
26 26
27// ############################################################################ 27// ############################################################################
@@ -31,4 +31,5 @@ export type MVideoAbuseAccountVideo =
31export type MVideoAbuseFormattable = 31export type MVideoAbuseFormattable =
32 MVideoAbuse & 32 MVideoAbuse &
33 Use<'Account', MAccountFormattable> & 33 Use<'Account', MAccountFormattable> &
34 Use<'Video', Pick<MVideo, 'id' | 'uuid' | 'name' | 'nsfw'>> 34 Use<'Video', Pick<MVideoAccountLightBlacklistAllFiles,
35 'id' | 'uuid' | 'name' | 'nsfw' | 'getMiniatureStaticPath' | 'isBlacklisted' | 'VideoChannel'>>
diff --git a/shared/models/videos/abuse/video-abuse.model.ts b/shared/models/videos/abuse/video-abuse.model.ts
index b47ee05a0..953193e5e 100644
--- a/shared/models/videos/abuse/video-abuse.model.ts
+++ b/shared/models/videos/abuse/video-abuse.model.ts
@@ -1,6 +1,7 @@
1import { Account } from '../../actors/index' 1import { Account } from '../../actors/index'
2import { VideoConstant } from '../video-constant.model' 2import { VideoConstant } from '../video-constant.model'
3import { VideoAbuseState } from './video-abuse-state.model' 3import { VideoAbuseState } from './video-abuse-state.model'
4import { VideoChannelSummary } from '../channel/video-channel.model'
4 5
5export interface VideoAbuse { 6export interface VideoAbuse {
6 id: number 7 id: number
@@ -16,6 +17,9 @@ export interface VideoAbuse {
16 uuid: string 17 uuid: string
17 nsfw: boolean 18 nsfw: boolean
18 deleted: boolean 19 deleted: boolean
20 blacklisted: boolean
21 thumbnailPath?: string
22 channel?: VideoChannelSummary
19 } 23 }
20 24
21 createdAt: Date 25 createdAt: Date