1 import { FindOptions } from 'sequelize'
2 import { AllowNull, BelongsTo, Column, CreatedAt, DataType, ForeignKey, Is, Model, Table, UpdatedAt } from 'sequelize-typescript'
3 import { isAbuseMessageValid } from '@server/helpers/custom-validators/abuses'
4 import { MAbuseMessage, MAbuseMessageFormattable } from '@server/types/models'
5 import { AbuseMessage } from '@shared/models'
6 import { AttributesOnly } from '@shared/typescript-utils'
7 import { AccountModel, ScopeNames as AccountScopeNames } from '../account/account'
8 import { getSort, throwIfNotValid } from '../shared'
9 import { AbuseModel } from './abuse'
12 tableName: 'abuseMessage',
18 fields: [ 'accountId' ]
22 export class AbuseMessageModel extends Model<Partial<AttributesOnly<AbuseMessageModel>>> {
25 @Is('AbuseMessage', value => throwIfNotValid(value, isAbuseMessageValid, 'message'))
26 @Column(DataType.TEXT)
39 @ForeignKey(() => AccountModel)
43 @BelongsTo(() => AccountModel, {
52 @ForeignKey(() => AbuseModel)
56 @BelongsTo(() => AbuseModel, {
65 static listForApi (abuseId: number) {
66 const getQuery = (forCount: boolean) => {
67 const query: FindOptions = {
69 order: getSort('createdAt')
72 if (forCount !== true) {
75 model: AccountModel.scope(AccountScopeNames.SUMMARY),
85 AbuseMessageModel.count(getQuery(true)),
86 AbuseMessageModel.findAll(getQuery(false))
87 ]).then(([ total, data ]) => ({ total, data }))
90 static loadByIdAndAbuseId (messageId: number, abuseId: number): Promise<MAbuseMessage> {
91 return AbuseMessageModel.findOne({
99 toFormattedJSON (this: MAbuseMessageFormattable): AbuseMessage {
100 const account = this.Account
101 ? this.Account.toFormattedSummaryJSON()
106 createdAt: this.createdAt,
108 byModerator: this.byModerator,
109 message: this.message,