diff options
author | Julien Maulny <julien.maulny@protonmail.com> | 2019-11-15 19:05:08 +0100 |
---|---|---|
committer | Chocobozzz <chocobozzz@cpy.re> | 2019-12-04 09:36:45 +0100 |
commit | 69222afac8f8c41d90295b33f0695bbff352851e (patch) | |
tree | 63fe1faea94dd3bfc54e633631eecb275c969e54 /server/models | |
parent | 69c7f7525ddf13b7ced787d8b72ac74b43665517 (diff) | |
download | PeerTube-69222afac8f8c41d90295b33f0695bbff352851e.tar.gz PeerTube-69222afac8f8c41d90295b33f0695bbff352851e.tar.zst PeerTube-69222afac8f8c41d90295b33f0695bbff352851e.zip |
Soft delete video comments instead of detroy
Diffstat (limited to 'server/models')
-rw-r--r-- | server/models/account/account.ts | 2 | ||||
-rw-r--r-- | server/models/video/video-comment.ts | 33 |
2 files changed, 30 insertions, 5 deletions
diff --git a/server/models/account/account.ts b/server/models/account/account.ts index ba1094536..a818a5a4d 100644 --- a/server/models/account/account.ts +++ b/server/models/account/account.ts | |||
@@ -201,7 +201,7 @@ export class AccountModel extends Model<AccountModel> { | |||
201 | 201 | ||
202 | @HasMany(() => VideoCommentModel, { | 202 | @HasMany(() => VideoCommentModel, { |
203 | foreignKey: { | 203 | foreignKey: { |
204 | allowNull: false | 204 | allowNull: true |
205 | }, | 205 | }, |
206 | onDelete: 'cascade', | 206 | onDelete: 'cascade', |
207 | hooks: true | 207 | hooks: true |
diff --git a/server/models/video/video-comment.ts b/server/models/video/video-comment.ts index 2e4220434..b44d65138 100644 --- a/server/models/video/video-comment.ts +++ b/server/models/video/video-comment.ts | |||
@@ -1,5 +1,5 @@ | |||
1 | import { AllowNull, BelongsTo, Column, CreatedAt, DataType, ForeignKey, Is, Model, Scopes, Table, UpdatedAt } from 'sequelize-typescript' | 1 | import { AllowNull, BelongsTo, Column, CreatedAt, DataType, ForeignKey, Is, Model, Scopes, Table, UpdatedAt } from 'sequelize-typescript' |
2 | import { ActivityTagObject } from '../../../shared/models/activitypub/objects/common-objects' | 2 | import { ActivityTagObject, ActivityTombstoneObject } from '../../../shared/models/activitypub/objects/common-objects' |
3 | import { VideoCommentObject } from '../../../shared/models/activitypub/objects/video-comment-object' | 3 | import { VideoCommentObject } from '../../../shared/models/activitypub/objects/video-comment-object' |
4 | import { VideoComment } from '../../../shared/models/videos/video-comment.model' | 4 | import { VideoComment } from '../../../shared/models/videos/video-comment.model' |
5 | import { isActivityPubUrlValid } from '../../helpers/custom-validators/activitypub/misc' | 5 | import { isActivityPubUrlValid } from '../../helpers/custom-validators/activitypub/misc' |
@@ -122,6 +122,10 @@ export class VideoCommentModel extends Model<VideoCommentModel> { | |||
122 | @UpdatedAt | 122 | @UpdatedAt |
123 | updatedAt: Date | 123 | updatedAt: Date |
124 | 124 | ||
125 | @AllowNull(true) | ||
126 | @Column(DataType.DATE) | ||
127 | deletedAt: Date | ||
128 | |||
125 | @AllowNull(false) | 129 | @AllowNull(false) |
126 | @Is('VideoCommentUrl', value => throwIfNotValid(value, isActivityPubUrlValid, 'url')) | 130 | @Is('VideoCommentUrl', value => throwIfNotValid(value, isActivityPubUrlValid, 'url')) |
127 | @Column(DataType.STRING(CONSTRAINTS_FIELDS.VIDEOS.URL.max)) | 131 | @Column(DataType.STRING(CONSTRAINTS_FIELDS.VIDEOS.URL.max)) |
@@ -177,7 +181,7 @@ export class VideoCommentModel extends Model<VideoCommentModel> { | |||
177 | 181 | ||
178 | @BelongsTo(() => AccountModel, { | 182 | @BelongsTo(() => AccountModel, { |
179 | foreignKey: { | 183 | foreignKey: { |
180 | allowNull: false | 184 | allowNull: true |
181 | }, | 185 | }, |
182 | onDelete: 'CASCADE' | 186 | onDelete: 'CASCADE' |
183 | }) | 187 | }) |
@@ -436,9 +440,17 @@ export class VideoCommentModel extends Model<VideoCommentModel> { | |||
436 | } | 440 | } |
437 | 441 | ||
438 | isOwned () { | 442 | isOwned () { |
443 | if (!this.Account) { | ||
444 | return false | ||
445 | } | ||
446 | |||
439 | return this.Account.isOwned() | 447 | return this.Account.isOwned() |
440 | } | 448 | } |
441 | 449 | ||
450 | isDeleted () { | ||
451 | return null !== this.deletedAt | ||
452 | } | ||
453 | |||
442 | extractMentions () { | 454 | extractMentions () { |
443 | let result: string[] = [] | 455 | let result: string[] = [] |
444 | 456 | ||
@@ -487,12 +499,25 @@ export class VideoCommentModel extends Model<VideoCommentModel> { | |||
487 | videoId: this.videoId, | 499 | videoId: this.videoId, |
488 | createdAt: this.createdAt, | 500 | createdAt: this.createdAt, |
489 | updatedAt: this.updatedAt, | 501 | updatedAt: this.updatedAt, |
502 | deletedAt: this.deletedAt, | ||
503 | isDeleted: this.isDeleted(), | ||
490 | totalReplies: this.get('totalReplies') || 0, | 504 | totalReplies: this.get('totalReplies') || 0, |
491 | account: this.Account.toFormattedJSON() | 505 | account: this.Account ? this.Account.toFormattedJSON() : null |
492 | } as VideoComment | 506 | } as VideoComment |
493 | } | 507 | } |
494 | 508 | ||
495 | toActivityPubObject (this: MCommentAP, threadParentComments: MCommentOwner[]): VideoCommentObject { | 509 | toActivityPubObject (this: MCommentAP, threadParentComments: MCommentOwner[]): VideoCommentObject | ActivityTombstoneObject { |
510 | if (this.isDeleted()) { | ||
511 | return { | ||
512 | id: this.url, | ||
513 | type: 'Tombstone', | ||
514 | formerType: 'Note', | ||
515 | published: this.createdAt.toISOString(), | ||
516 | updated: this.updatedAt.toISOString(), | ||
517 | deleted: this.deletedAt.toISOString() | ||
518 | } | ||
519 | } | ||
520 | |||
496 | let inReplyTo: string | 521 | let inReplyTo: string |
497 | // New thread, so in AS we reply to the video | 522 | // New thread, so in AS we reply to the video |
498 | if (this.inReplyToCommentId === null) { | 523 | if (this.inReplyToCommentId === null) { |