+import { FindOptions, ModelIndexesOptions, Op, WhereOptions } from 'sequelize'
import { AllowNull, BelongsTo, Column, CreatedAt, Default, ForeignKey, Is, Model, Scopes, Table, UpdatedAt } from 'sequelize-typescript'
+import { UserNotificationIncludes, UserNotificationModelForApi } from '@server/types/models/user'
import { UserNotification, UserNotificationType } from '../../../shared'
-import { getSort, throwIfNotValid } from '../utils'
import { isBooleanValid } from '../../helpers/custom-validators/misc'
import { isUserNotificationTypeValid } from '../../helpers/custom-validators/user-notifications'
-import { UserModel } from './user'
-import { VideoModel } from '../video/video'
-import { VideoCommentModel } from '../video/video-comment'
-import { FindOptions, ModelIndexesOptions, Op, WhereOptions } from 'sequelize'
-import { VideoChannelModel } from '../video/video-channel'
-import { AccountModel } from './account'
-import { VideoAbuseModel } from '../video/video-abuse'
-import { VideoBlacklistModel } from '../video/video-blacklist'
-import { VideoImportModel } from '../video/video-import'
+import { AbuseModel } from '../abuse/abuse'
+import { VideoAbuseModel } from '../abuse/video-abuse'
+import { VideoCommentAbuseModel } from '../abuse/video-comment-abuse'
import { ActorModel } from '../activitypub/actor'
import { ActorFollowModel } from '../activitypub/actor-follow'
import { AvatarModel } from '../avatar/avatar'
import { ServerModel } from '../server/server'
-import { UserNotificationIncludes, UserNotificationModelForApi } from '@server/typings/models/user'
+import { getSort, throwIfNotValid } from '../utils'
+import { VideoModel } from '../video/video'
+import { VideoBlacklistModel } from '../video/video-blacklist'
+import { VideoChannelModel } from '../video/video-channel'
+import { VideoCommentModel } from '../video/video-comment'
+import { VideoImportModel } from '../video/video-import'
+import { AccountModel } from './account'
+import { UserModel } from './user'
enum ScopeNames {
WITH_ALL = 'WITH_ALL'
},
{
- attributes: [ 'id' ],
- model: VideoAbuseModel.unscoped(),
+ attributes: [ 'id', 'state' ],
+ model: AbuseModel.unscoped(),
required: false,
- include: [ buildVideoInclude(true) ]
+ include: [
+ {
+ attributes: [ 'id' ],
+ model: VideoAbuseModel.unscoped(),
+ required: false,
+ include: [ buildVideoInclude(true) ]
+ },
+ {
+ attributes: [ 'id' ],
+ model: VideoCommentAbuseModel.unscoped(),
+ required: false,
+ include: [
+ {
+ attributes: [ 'id', 'originCommentId' ],
+ model: VideoCommentModel,
+ required: true,
+ include: [
+ {
+ attributes: [ 'id', 'name', 'uuid' ],
+ model: VideoModel.unscoped(),
+ required: true
+ }
+ ]
+ }
+ ]
+ },
+ {
+ model: AccountModel,
+ as: 'FlaggedAccount',
+ required: true,
+ include: [ buildActorWithAvatarInclude() ]
+ }
+ ]
},
{
}
},
{
- fields: [ 'videoAbuseId' ],
+ fields: [ 'abuseId' ],
where: {
- videoAbuseId: {
+ abuseId: {
[Op.ne]: null
}
}
})
Comment: VideoCommentModel
- @ForeignKey(() => VideoAbuseModel)
+ @ForeignKey(() => AbuseModel)
@Column
- videoAbuseId: number
+ abuseId: number
- @BelongsTo(() => VideoAbuseModel, {
+ @BelongsTo(() => AbuseModel, {
foreignKey: {
allowNull: true
},
onDelete: 'cascade'
})
- VideoAbuse: VideoAbuseModel
+ Abuse: AbuseModel
@ForeignKey(() => VideoBlacklistModel)
@Column
video: this.formatVideo(this.Comment.Video)
} : undefined
- const videoAbuse = this.VideoAbuse ? {
- id: this.VideoAbuse.id,
- video: this.formatVideo(this.VideoAbuse.Video)
- } : undefined
+ const abuse = this.Abuse ? this.formatAbuse(this.Abuse) : undefined
const videoBlacklist = this.VideoBlacklist ? {
id: this.VideoBlacklist.id,
video,
videoImport,
comment,
- videoAbuse,
+ abuse,
videoBlacklist,
account,
actorFollow,
}
}
+ formatAbuse (this: UserNotificationModelForApi, abuse: UserNotificationIncludes.AbuseInclude) {
+ const commentAbuse = abuse.VideoCommentAbuse?.VideoComment ? {
+ threadId: abuse.VideoCommentAbuse.VideoComment.getThreadId(),
+
+ video: {
+ id: abuse.VideoCommentAbuse.VideoComment.Video.id,
+ name: abuse.VideoCommentAbuse.VideoComment.Video.name,
+ uuid: abuse.VideoCommentAbuse.VideoComment.Video.uuid
+ }
+ } : undefined
+
+ const videoAbuse = abuse.VideoAbuse?.Video ? this.formatVideo(abuse.VideoAbuse.Video) : undefined
+
+ const accountAbuse = (!commentAbuse && !videoAbuse) ? this.formatActor(abuse.FlaggedAccount) : undefined
+
+ return {
+ id: abuse.id,
+ state: abuse.state,
+ video: videoAbuse,
+ comment: commentAbuse,
+ account: accountAbuse
+ }
+ }
+
formatActor (
this: UserNotificationModelForApi,
accountOrChannel: UserNotificationIncludes.AccountIncludeActor | UserNotificationIncludes.VideoChannelIncludeActor