mirror of
				https://github.com/superseriousbusiness/gotosocial.git
				synced 2025-10-31 06:52:26 -05:00 
			
		
		
		
	[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>
This commit is contained in:
		
					parent
					
						
							
								13b9fd5f92
							
						
					
				
			
			
				commit
				
					
						ab2d063fcb
					
				
			
		
					 60 changed files with 1124 additions and 309 deletions
				
			
		|  | @ -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 | ||||
| } | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue