summaryrefslogtreecommitdiff
path: root/internal/processing/workers/fromfediapi.go
diff options
context:
space:
mode:
Diffstat (limited to 'internal/processing/workers/fromfediapi.go')
-rw-r--r--internal/processing/workers/fromfediapi.go39
1 files changed, 39 insertions, 0 deletions
diff --git a/internal/processing/workers/fromfediapi.go b/internal/processing/workers/fromfediapi.go
index 096e285f6..cf93a5ec5 100644
--- a/internal/processing/workers/fromfediapi.go
+++ b/internal/processing/workers/fromfediapi.go
@@ -189,6 +189,14 @@ func (p *Processor) ProcessFromFediAPI(ctx context.Context, fMsg *messages.FromF
if fMsg.APObjectType == ap.ActorPerson {
return p.fediAPI.MoveAccount(ctx, fMsg)
}
+
+ // UNDO SOMETHING
+ case ap.ActivityUndo:
+
+ // UNDO ANNOUNCE
+ if fMsg.APObjectType == ap.ActivityAnnounce {
+ return p.fediAPI.UndoAnnounce(ctx, fMsg)
+ }
}
return gtserror.Newf("unhandled: %s %s", fMsg.APActivityType, fMsg.APObjectType)
@@ -1159,3 +1167,34 @@ func (p *fediAPI) RejectAnnounce(ctx context.Context, fMsg *messages.FromFediAPI
return nil
}
+
+func (p *fediAPI) UndoAnnounce(
+ ctx context.Context,
+ fMsg *messages.FromFediAPI,
+) error {
+ boost, ok := fMsg.GTSModel.(*gtsmodel.Status)
+ if !ok {
+ return gtserror.Newf("%T not parseable as *gtsmodel.Status", fMsg.GTSModel)
+ }
+
+ // Delete the boost wrapper itself.
+ if err := p.state.DB.DeleteStatusByID(ctx, boost.ID); err != nil {
+ return gtserror.Newf("db error deleting boost: %w", err)
+ }
+
+ // Update statuses count for the requesting account.
+ if err := p.utils.decrementStatusesCount(ctx, fMsg.Requesting, boost); err != nil {
+ log.Errorf(ctx, "error updating account stats: %v", err)
+ }
+
+ // Remove the boost wrapper from all timelines.
+ if err := p.surface.deleteStatusFromTimelines(ctx, boost.ID); err != nil {
+ log.Errorf(ctx, "error removing timelined boost: %v", err)
+ }
+
+ // Interaction counts changed on the boosted status;
+ // uncache the prepared version from all timelines.
+ p.surface.invalidateStatusFromTimelines(ctx, boost.BoostOfID)
+
+ return nil
+}