diff options
Diffstat (limited to 'internal/processing/workers/util.go')
-rw-r--r-- | internal/processing/workers/util.go | 99 |
1 files changed, 62 insertions, 37 deletions
diff --git a/internal/processing/workers/util.go b/internal/processing/workers/util.go index bb7faffbf..042f4827c 100644 --- a/internal/processing/workers/util.go +++ b/internal/processing/workers/util.go @@ -37,69 +37,90 @@ import ( // util provides util functions used by both // the fromClientAPI and fromFediAPI functions. type utils struct { - state *state.State - media *media.Processor - account *account.Processor - surface *Surface + state *state.State + media *media.Processor + account *account.Processor + surface *Surface + converter *typeutils.Converter } -// wipeStatus encapsulates common logic -// used to totally delete a status + all -// its attachments, notifications, boosts, -// and timeline entries. +// wipeStatus encapsulates common logic used to +// totally delete a status + all its attachments, +// notifications, boosts, and timeline entries. +// +// If deleteAttachments is true, then any status +// attachments will also be deleted, else they +// will just be detached. +// +// If copyToSinBin is true, then a version of the +// status will be put in the `sin_bin_statuses` +// table prior to deletion. func (u *utils) wipeStatus( ctx context.Context, - statusToDelete *gtsmodel.Status, + status *gtsmodel.Status, deleteAttachments bool, + copyToSinBin bool, ) error { var errs gtserror.MultiError + if copyToSinBin { + // Copy this status to the sin bin before we delete it. + sbStatus, err := u.converter.StatusToSinBinStatus(ctx, status) + if err != nil { + errs.Appendf("error converting status to sinBinStatus: %w", err) + } else { + if err := u.state.DB.PutSinBinStatus(ctx, sbStatus); err != nil { + errs.Appendf("db error storing sinBinStatus: %w", err) + } + } + } + // Either delete all attachments for this status, - // or simply unattach + clean them separately later. + // or simply detach + clean them separately later. // - // Reason to unattach rather than delete is that - // the poster might want to reattach them to another - // status immediately (in case of delete + redraft) + // Reason to detach rather than delete is that + // the author might want to reattach them to another + // status immediately (in case of delete + redraft). if deleteAttachments { // todo:u.state.DB.DeleteAttachmentsForStatus - for _, id := range statusToDelete.AttachmentIDs { + for _, id := range status.AttachmentIDs { if err := u.media.Delete(ctx, id); err != nil { errs.Appendf("error deleting media: %w", err) } } } else { // todo:u.state.DB.UnattachAttachmentsForStatus - for _, id := range statusToDelete.AttachmentIDs { - if _, err := u.media.Unattach(ctx, statusToDelete.Account, id); err != nil { + for _, id := range status.AttachmentIDs { + if _, err := u.media.Unattach(ctx, status.Account, id); err != nil { errs.Appendf("error unattaching media: %w", err) } } } - // delete all mention entries generated by this status + // Delete all mentions generated by this status. // todo:u.state.DB.DeleteMentionsForStatus - for _, id := range statusToDelete.MentionIDs { + for _, id := range status.MentionIDs { if err := u.state.DB.DeleteMentionByID(ctx, id); err != nil { errs.Appendf("error deleting status mention: %w", err) } } - // delete all notification entries generated by this status - if err := u.state.DB.DeleteNotificationsForStatus(ctx, statusToDelete.ID); err != nil { + // Delete all notifications generated by this status. + if err := u.state.DB.DeleteNotificationsForStatus(ctx, status.ID); err != nil { errs.Appendf("error deleting status notifications: %w", err) } - // delete all bookmarks that point to this status - if err := u.state.DB.DeleteStatusBookmarksForStatus(ctx, statusToDelete.ID); err != nil { + // Delete all bookmarks of this status. + if err := u.state.DB.DeleteStatusBookmarksForStatus(ctx, status.ID); err != nil { errs.Appendf("error deleting status bookmarks: %w", err) } - // delete all faves of this status - if err := u.state.DB.DeleteStatusFavesForStatus(ctx, statusToDelete.ID); err != nil { + // Delete all faves of this status. + if err := u.state.DB.DeleteStatusFavesForStatus(ctx, status.ID); err != nil { errs.Appendf("error deleting status faves: %w", err) } - if pollID := statusToDelete.PollID; pollID != "" { + if pollID := status.PollID; pollID != "" { // Delete this poll by ID from the database. if err := u.state.DB.DeletePollByID(ctx, pollID); err != nil { errs.Appendf("error deleting status poll: %w", err) @@ -114,38 +135,42 @@ func (u *utils) wipeStatus( _ = u.state.Workers.Scheduler.Cancel(pollID) } - // delete all boosts for this status + remove them from timelines + // Get all boost of this status so that we can + // delete those boosts + remove them from timelines. boosts, err := u.state.DB.GetStatusBoosts( - // we MUST set a barebones context here, + // We MUST set a barebones context here, // as depending on where it came from the // original BoostOf may already be gone. gtscontext.SetBarebones(ctx), - statusToDelete.ID) + status.ID) if err != nil { errs.Appendf("error fetching status boosts: %w", err) } for _, boost := range boosts { - if err := u.surface.deleteStatusFromTimelines(ctx, boost.ID); err != nil { - errs.Appendf("error deleting boost from timelines: %w", err) - } + // Delete the boost itself. if err := u.state.DB.DeleteStatusByID(ctx, boost.ID); err != nil { errs.Appendf("error deleting boost: %w", err) } + + // Remove the boost from any and all timelines. + if err := u.surface.deleteStatusFromTimelines(ctx, boost.ID); err != nil { + errs.Appendf("error deleting boost from timelines: %w", err) + } } - // delete this status from any and all timelines - if err := u.surface.deleteStatusFromTimelines(ctx, statusToDelete.ID); err != nil { + // Delete the status itself from any and all timelines. + if err := u.surface.deleteStatusFromTimelines(ctx, status.ID); err != nil { errs.Appendf("error deleting status from timelines: %w", err) } - // delete this status from any conversations that it's part of - if err := u.state.DB.DeleteStatusFromConversations(ctx, statusToDelete.ID); err != nil { + // Delete this status from any conversations it's part of. + if err := u.state.DB.DeleteStatusFromConversations(ctx, status.ID); err != nil { errs.Appendf("error deleting status from conversations: %w", err) } - // finally, delete the status itself - if err := u.state.DB.DeleteStatusByID(ctx, statusToDelete.ID); err != nil { + // Finally delete the status itself. + if err := u.state.DB.DeleteStatusByID(ctx, status.ID); err != nil { errs.Appendf("error deleting status: %w", err) } |