You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
114 lines
2.6 KiB
TypeScript
114 lines
2.6 KiB
TypeScript
import { FindOptions } from 'sequelize'
|
|||
import { AllowNull, BelongsTo, Column, CreatedAt, DataType, ForeignKey, Is, Table, UpdatedAt } from 'sequelize-typescript'
|
|||
import { isAbuseMessageValid } from '@server/helpers/custom-validators/abuses.js'
|
|||
import { MAbuseMessage, MAbuseMessageFormattable } from '@server/types/models/index.js'
|
|||
import { AbuseMessage } from '@peertube/peertube-models'
|
|||
import { AccountModel, ScopeNames as AccountScopeNames } from '../account/account.js'
|
|||
import { SequelizeModel, getSort, throwIfNotValid } from '../shared/index.js'
|
|||
import { AbuseModel } from './abuse.js'
|
|||
|
|||
@Table({
|
|||
tableName: 'abuseMessage',
|
|||
indexes: [
|
|||
{
|
|||
fields: [ 'abuseId' ]
|
|||
},
|
|||
{
|
|||
fields: [ 'accountId' ]
|
|||
}
|
|||
]
|
|||
})
|
|||
export class AbuseMessageModel extends SequelizeModel<AbuseMessageModel> {
|
|||
|
|||
@AllowNull(false)
|
|||
@Is('AbuseMessage', value => throwIfNotValid(value, isAbuseMessageValid, 'message'))
|
|||
@Column(DataType.TEXT)
|
|||
message: string
|
|||
|
|||
@AllowNull(false)
|
|||
@Column
|
|||
byModerator: boolean
|
|||
|
|||
@CreatedAt
|
|||
createdAt: Date
|
|||
|
|||
@UpdatedAt
|
|||
updatedAt: Date
|
|||
|
|||
@ForeignKey(() => AccountModel)
|
|||
@Column
|
|||
accountId: number
|
|||
|
|||
@BelongsTo(() => AccountModel, {
|
|||
foreignKey: {
|
|||
name: 'accountId',
|
|||
allowNull: true
|
|||
},
|
|||
onDelete: 'set null'
|
|||
})
|
|||
Account: Awaited<AccountModel>
|
|||
|
|||
@ForeignKey(() => AbuseModel)
|
|||
@Column
|
|||
abuseId: number
|
|||
|
|||
@BelongsTo(() => AbuseModel, {
|
|||
foreignKey: {
|
|||
name: 'abuseId',
|
|||
allowNull: false
|
|||
},
|
|||
onDelete: 'cascade'
|
|||
})
|
|||
Abuse: Awaited<AbuseModel>
|
|||
|
|||
static listForApi (abuseId: number) {
|
|||
const getQuery = (forCount: boolean) => {
|
|||
const query: FindOptions = {
|
|||
where: { abuseId },
|
|||
order: getSort('createdAt')
|
|||
}
|
|||
|
|||
if (forCount !== true) {
|
|||
query.include = [
|
|||
{
|
|||
model: AccountModel.scope(AccountScopeNames.SUMMARY),
|
|||
required: false
|
|||
}
|
|||
]
|
|||
}
|
|||
|
|||
return query
|
|||
}
|
|||
|
|||
return Promise.all([
|
|||
AbuseMessageModel.count(getQuery(true)),
|
|||
AbuseMessageModel.findAll(getQuery(false))
|
|||
]).then(([ total, data ]) => ({ total, data }))
|
|||
}
|
|||
|
|||
static loadByIdAndAbuseId (messageId: number, abuseId: number): Promise<MAbuseMessage> {
|
|||
return AbuseMessageModel.findOne({
|
|||
where: {
|
|||
id: messageId,
|
|||
abuseId
|
|||
}
|
|||
})
|
|||
}
|
|||
|
|||
toFormattedJSON (this: MAbuseMessageFormattable): AbuseMessage {
|
|||
const account = this.Account
|
|||
? this.Account.toFormattedSummaryJSON()
|
|||
: null
|
|||
|
|||
return {
|
|||
id: this.id,
|
|||
createdAt: this.createdAt,
|
|||
|
|||
byModerator: this.byModerator,
|
|||
message: this.message,
|
|||
|
|||
account
|
|||
}
|
|||
}
|
|||
}
|