abuse-message.ts 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. import { AllowNull, BelongsTo, Column, CreatedAt, DataType, ForeignKey, Is, Model, Table, UpdatedAt } from 'sequelize-typescript'
  2. import { isAbuseMessageValid } from '@server/helpers/custom-validators/abuses'
  3. import { MAbuseMessage, MAbuseMessageFormattable } from '@server/types/models'
  4. import { AbuseMessage } from '@shared/models'
  5. import { AccountModel, ScopeNames as AccountScopeNames } from '../account/account'
  6. import { getSort, throwIfNotValid } from '../utils'
  7. import { AbuseModel } from './abuse'
  8. @Table({
  9. tableName: 'abuseMessage',
  10. indexes: [
  11. {
  12. fields: [ 'abuseId' ]
  13. },
  14. {
  15. fields: [ 'accountId' ]
  16. }
  17. ]
  18. })
  19. export class AbuseMessageModel extends Model {
  20. @AllowNull(false)
  21. @Is('AbuseMessage', value => throwIfNotValid(value, isAbuseMessageValid, 'message'))
  22. @Column(DataType.TEXT)
  23. message: string
  24. @AllowNull(false)
  25. @Column
  26. byModerator: boolean
  27. @CreatedAt
  28. createdAt: Date
  29. @UpdatedAt
  30. updatedAt: Date
  31. @ForeignKey(() => AccountModel)
  32. @Column
  33. accountId: number
  34. @BelongsTo(() => AccountModel, {
  35. foreignKey: {
  36. name: 'accountId',
  37. allowNull: true
  38. },
  39. onDelete: 'set null'
  40. })
  41. Account: AccountModel
  42. @ForeignKey(() => AbuseModel)
  43. @Column
  44. abuseId: number
  45. @BelongsTo(() => AbuseModel, {
  46. foreignKey: {
  47. name: 'abuseId',
  48. allowNull: false
  49. },
  50. onDelete: 'cascade'
  51. })
  52. Abuse: AbuseModel
  53. static listForApi (abuseId: number) {
  54. const options = {
  55. where: { abuseId },
  56. order: getSort('createdAt'),
  57. include: [
  58. {
  59. model: AccountModel.scope(AccountScopeNames.SUMMARY),
  60. required: false
  61. }
  62. ]
  63. }
  64. return AbuseMessageModel.findAndCountAll(options)
  65. .then(({ rows, count }) => ({ data: rows, total: count }))
  66. }
  67. static loadByIdAndAbuseId (messageId: number, abuseId: number): Promise<MAbuseMessage> {
  68. return AbuseMessageModel.findOne({
  69. where: {
  70. id: messageId,
  71. abuseId
  72. }
  73. })
  74. }
  75. toFormattedJSON (this: MAbuseMessageFormattable): AbuseMessage {
  76. const account = this.Account
  77. ? this.Account.toFormattedSummaryJSON()
  78. : null
  79. return {
  80. id: this.id,
  81. createdAt: this.createdAt,
  82. byModerator: this.byModerator,
  83. message: this.message,
  84. account
  85. }
  86. }
  87. }