summaryrefslogtreecommitdiff
path: root/internal/processing/workers/fromclientapi.go
diff options
context:
space:
mode:
authorLibravatar tobi <31960611+tsmethurst@users.noreply.github.com>2024-03-13 13:53:29 +0100
committerLibravatar GitHub <noreply@github.com>2024-03-13 13:53:29 +0100
commitab2d063fcb04f241a3147c843a021491f5fc0a55 (patch)
tree3d2eff864e8b19d4d9a24f4f1fe92feda8ee4dac /internal/processing/workers/fromclientapi.go
parent[bugfix]: Add missing Link headers in Swagger spec (#2751) (diff)
downloadgotosocial-ab2d063fcb04f241a3147c843a021491f5fc0a55.tar.xz
[feature] Process outgoing Move from clientAPI (#2750)
* prevent moved accounts from taking create-type actions * update move logic * federate move out * indicate on web profile when an account has moved * [docs] Add migration docs section * lock while checking + setting move state * use redirectFollowers func for clientAPI as well * comment typo * linter? i barely know 'er! * Update internal/uris/uri.go Co-authored-by: Daenney <daenney@users.noreply.github.com> * add a couple tests for move * fix little mistake exposed by tests (thanks tests) * ensure Move marked as successful * attach shared util funcs to struct * lock whole account when doing move * move moving check to after error check * replace repeated text with error func * linterrrrrr!!!! * catch self follow case --------- Co-authored-by: Daenney <daenney@users.noreply.github.com>
Diffstat (limited to 'internal/processing/workers/fromclientapi.go')
-rw-r--r--internal/processing/workers/fromclientapi.go53
1 files changed, 46 insertions, 7 deletions
diff --git a/internal/processing/workers/fromclientapi.go b/internal/processing/workers/fromclientapi.go
index 05b9acc1f..c7e78fee2 100644
--- a/internal/processing/workers/fromclientapi.go
+++ b/internal/processing/workers/fromclientapi.go
@@ -39,12 +39,12 @@ import (
// specifically for messages originating
// from the client/REST API.
type clientAPI struct {
- state *state.State
- converter *typeutils.Converter
- surface *surface
- federate *federate
- wipeStatus wipeStatus
- account *account.Processor
+ state *state.State
+ converter *typeutils.Converter
+ surface *surface
+ federate *federate
+ account *account.Processor
+ utilF *utilF
}
func (p *Processor) EnqueueClientAPI(cctx context.Context, msgs ...messages.FromClientAPI) {
@@ -194,6 +194,15 @@ func (p *Processor) ProcessFromClientAPI(ctx context.Context, cMsg messages.From
case ap.ObjectProfile:
return p.clientAPI.ReportAccount(ctx, cMsg)
}
+
+ // MOVE SOMETHING
+ case ap.ActivityMove:
+ switch cMsg.APObjectType { //nolint:gocritic
+
+ // MOVE PROFILE/ACCOUNT
+ case ap.ObjectProfile, ap.ActorPerson:
+ return p.clientAPI.MoveAccount(ctx, cMsg)
+ }
}
return gtserror.Newf("unhandled: %s %s", cMsg.APActivityType, cMsg.APObjectType)
@@ -576,7 +585,7 @@ func (p *clientAPI) DeleteStatus(ctx context.Context, cMsg messages.FromClientAP
return gtserror.Newf("db error populating status: %w", err)
}
- if err := p.wipeStatus(ctx, status, deleteAttachments); err != nil {
+ if err := p.utilF.wipeStatus(ctx, status, deleteAttachments); err != nil {
log.Errorf(ctx, "error wiping status: %v", err)
}
@@ -641,3 +650,33 @@ func (p *clientAPI) ReportAccount(ctx context.Context, cMsg messages.FromClientA
return nil
}
+
+func (p *clientAPI) MoveAccount(ctx context.Context, cMsg messages.FromClientAPI) error {
+ // Redirect each local follower of
+ // OriginAccount to follow move target.
+ p.utilF.redirectFollowers(ctx, cMsg.OriginAccount, cMsg.TargetAccount)
+
+ // At this point, we know OriginAccount has the
+ // Move set on it. Just make sure it's populated.
+ if err := p.state.DB.PopulateMove(ctx, cMsg.OriginAccount.Move); err != nil {
+ return gtserror.Newf("error populating Move: %w", err)
+ }
+
+ // Now send the Move message out to
+ // OriginAccount's (remote) followers.
+ if err := p.federate.MoveAccount(ctx, cMsg.OriginAccount); err != nil {
+ return gtserror.Newf("error federating account move: %w", err)
+ }
+
+ // Mark the move attempt as successful.
+ cMsg.OriginAccount.Move.SucceededAt = cMsg.OriginAccount.Move.AttemptedAt
+ if err := p.state.DB.UpdateMove(
+ ctx,
+ cMsg.OriginAccount.Move,
+ "succeeded_at",
+ ); err != nil {
+ return gtserror.Newf("error marking move as successful: %w", err)
+ }
+
+ return nil
+}