From b2810fedf201dc9ae80ea8ec6d48e5cf7e21e6ea Mon Sep 17 00:00:00 2001 From: tobi <31960611+tsmethurst@users.noreply.github.com> Date: Wed, 18 May 2022 23:13:03 +0200 Subject: [bugfix] Clean up boosts of status when the status itself is deleted (#579) * move status wiping logic to fromcommon.go * delete reblogs of status when a status is deleted * add admin boost of zork to test model * update tests to make them more determinate * Merge branch 'main' into status_reblog_cleanup * move status wiping logic to fromcommon.go * delete reblogs of status when a status is deleted * add admin boost of zork to test model * update tests to make them more determinate * Merge branch 'main' into status_reblog_cleanup * test status delete via client api * go fmt --- internal/processing/fromcommon.go | 44 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) (limited to 'internal/processing/fromcommon.go') diff --git a/internal/processing/fromcommon.go b/internal/processing/fromcommon.go index 1b470918d..e9a2e4994 100644 --- a/internal/processing/fromcommon.go +++ b/internal/processing/fromcommon.go @@ -441,3 +441,47 @@ func (p *processor) deleteStatusFromTimelines(ctx context.Context, status *gtsmo return p.streamingProcessor.StreamDelete(status.ID) } + +// wipeStatus contains common logic used to totally delete a status +// + all its attachments, notifications, boosts, and timeline entries. +func (p *processor) wipeStatus(ctx context.Context, statusToDelete *gtsmodel.Status) error { + // delete all attachments for this status + for _, a := range statusToDelete.AttachmentIDs { + if err := p.mediaProcessor.Delete(ctx, a); err != nil { + return err + } + } + + // delete all mentions for this status + for _, m := range statusToDelete.MentionIDs { + if err := p.db.DeleteByID(ctx, m, >smodel.Mention{}); err != nil { + return err + } + } + + // delete all notifications for this status + if err := p.db.DeleteWhere(ctx, []db.Where{{Key: "status_id", Value: statusToDelete.ID}}, &[]*gtsmodel.Notification{}); err != nil { + return err + } + + // delete all boosts for this status + remove them from timelines + boosts, err := p.db.GetStatusReblogs(ctx, statusToDelete) + if err != nil { + return err + } + for _, b := range boosts { + if err := p.deleteStatusFromTimelines(ctx, b); err != nil { + return err + } + if err := p.db.DeleteByID(ctx, b.ID, b); err != nil { + return err + } + } + + // delete this status from any and all timelines + if err := p.deleteStatusFromTimelines(ctx, statusToDelete); err != nil { + return err + } + + return nil +} -- cgit v1.2.3