123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157 |
- import {
- AfterCreate,
- AllowNull,
- BelongsTo,
- Column,
- CreatedAt,
- DataType,
- Default,
- ForeignKey,
- Is,
- Model,
- Table,
- UpdatedAt
- } from 'sequelize-typescript'
- import { VideoAbuseObject } from '../../../shared/models/activitypub/objects'
- import { VideoAbuse } from '../../../shared/models/videos'
- import {
- isVideoAbuseModerationCommentValid,
- isVideoAbuseReasonValid,
- isVideoAbuseStateValid
- } from '../../helpers/custom-validators/video-abuses'
- import { Emailer } from '../../lib/emailer'
- import { AccountModel } from '../account/account'
- import { getSort, throwIfNotValid } from '../utils'
- import { VideoModel } from './video'
- import { VideoAbuseState } from '../../../shared'
- import { CONSTRAINTS_FIELDS, VIDEO_ABUSE_STATES } from '../../initializers'
- @Table({
- tableName: 'videoAbuse',
- indexes: [
- {
- fields: [ 'videoId' ]
- },
- {
- fields: [ 'reporterAccountId' ]
- }
- ]
- })
- export class VideoAbuseModel extends Model<VideoAbuseModel> {
- @AllowNull(false)
- @Is('VideoAbuseReason', value => throwIfNotValid(value, isVideoAbuseReasonValid, 'reason'))
- @Column
- reason: string
- @AllowNull(false)
- @Default(null)
- @Is('VideoAbuseState', value => throwIfNotValid(value, isVideoAbuseStateValid, 'state'))
- @Column
- state: VideoAbuseState
- @AllowNull(true)
- @Default(null)
- @Is('VideoAbuseModerationComment', value => throwIfNotValid(value, isVideoAbuseModerationCommentValid, 'moderationComment'))
- @Column(DataType.STRING(CONSTRAINTS_FIELDS.VIDEO_ABUSES.MODERATION_COMMENT.max))
- moderationComment: string
- @CreatedAt
- createdAt: Date
- @UpdatedAt
- updatedAt: Date
- @ForeignKey(() => AccountModel)
- @Column
- reporterAccountId: number
- @BelongsTo(() => AccountModel, {
- foreignKey: {
- allowNull: false
- },
- onDelete: 'cascade'
- })
- Account: AccountModel
- @ForeignKey(() => VideoModel)
- @Column
- videoId: number
- @BelongsTo(() => VideoModel, {
- foreignKey: {
- allowNull: false
- },
- onDelete: 'cascade'
- })
- Video: VideoModel
- @AfterCreate
- static sendEmailNotification (instance: VideoAbuseModel) {
- return Emailer.Instance.addVideoAbuseReportJob(instance.videoId)
- }
- static loadByIdAndVideoId (id: number, videoId: number) {
- const query = {
- where: {
- id,
- videoId
- }
- }
- return VideoAbuseModel.findOne(query)
- }
- static listForApi (start: number, count: number, sort: string) {
- const query = {
- offset: start,
- limit: count,
- order: getSort(sort),
- include: [
- {
- model: AccountModel,
- required: true
- },
- {
- model: VideoModel,
- required: true
- }
- ]
- }
- return VideoAbuseModel.findAndCountAll(query)
- .then(({ rows, count }) => {
- return { total: count, data: rows }
- })
- }
- toFormattedJSON (): VideoAbuse {
- return {
- id: this.id,
- reason: this.reason,
- reporterAccount: this.Account.toFormattedJSON(),
- state: {
- id: this.state,
- label: VideoAbuseModel.getStateLabel(this.state)
- },
- moderationComment: this.moderationComment,
- video: {
- id: this.Video.id,
- uuid: this.Video.uuid,
- name: this.Video.name
- },
- createdAt: this.createdAt
- }
- }
- toActivityPubObject (): VideoAbuseObject {
- return {
- type: 'Flag' as 'Flag',
- content: this.reason,
- object: this.Video.url
- }
- }
- private static getStateLabel (id: number) {
- return VIDEO_ABUSE_STATES[id] || 'Unknown'
- }
- }
|