diff options
Diffstat (limited to 'internal/processing')
| -rw-r--r-- | internal/processing/status/create.go | 24 | ||||
| -rw-r--r-- | internal/processing/status/create_test.go | 44 | 
2 files changed, 61 insertions, 7 deletions
diff --git a/internal/processing/status/create.go b/internal/processing/status/create.go index b450e4bdd..737755852 100644 --- a/internal/processing/status/create.go +++ b/internal/processing/status/create.go @@ -190,18 +190,28 @@ func (p *Processor) processReplyToID(ctx context.Context, form *apimodel.Advance  }  func (p *Processor) processThreadID(ctx context.Context, status *gtsmodel.Status) gtserror.WithCode { -	// Status takes the thread ID -	// of whatever it replies to. -	if status.InReplyTo != nil { +	// Status takes the thread ID of +	// whatever it replies to, if set. +	// +	// Might not be set if status is local +	// and replies to a remote status that +	// doesn't have a thread ID yet. +	// +	// If so, we can just thread from this +	// status onwards instead, since this +	// is where the relevant part of the +	// thread starts, from the perspective +	// of our instance at least. +	if status.InReplyTo != nil && +		status.InReplyTo.ThreadID != "" { +		// Just inherit threadID from parent.  		status.ThreadID = status.InReplyTo.ThreadID  		return nil  	} -	// Status doesn't reply to anything, -	// so it's a new local top-level status -	// and therefore needs a thread ID. +	// Mark new thread (or threaded +	// subsection) starting from here.  	threadID := id.NewULID() -  	if err := p.state.DB.PutThread(  		ctx,  		>smodel.Thread{ diff --git a/internal/processing/status/create_test.go b/internal/processing/status/create_test.go index 8d4267585..e32d8bc52 100644 --- a/internal/processing/status/create_test.go +++ b/internal/processing/status/create_test.go @@ -242,6 +242,50 @@ func (suite *StatusCreateTestSuite) TestProcessLanguageWithScriptPart() {  	suite.Equal("zh-Hans", *apiStatus.Language)  } +func (suite *StatusCreateTestSuite) TestProcessReplyToUnthreadedRemoteStatus() { +	ctx := context.Background() + +	creatingAccount := suite.testAccounts["local_account_1"] +	creatingApplication := suite.testApplications["application_1"] +	inReplyTo := suite.testStatuses["remote_account_1_status_1"] + +	// Reply to a remote status that +	// doesn't have a threadID set on it. +	statusCreateForm := &apimodel.AdvancedStatusCreateForm{ +		StatusCreateRequest: apimodel.StatusCreateRequest{ +			Status:      "boobies", +			MediaIDs:    []string{}, +			Poll:        nil, +			InReplyToID: inReplyTo.ID, +			Sensitive:   false, +			SpoilerText: "this is a reply", +			Visibility:  apimodel.VisibilityPublic, +			ScheduledAt: "", +			Language:    "en", +			ContentType: apimodel.StatusContentTypePlain, +		}, +		AdvancedVisibilityFlagsForm: apimodel.AdvancedVisibilityFlagsForm{ +			Federated: nil, +			Boostable: nil, +			Replyable: nil, +			Likeable:  nil, +		}, +	} + +	apiStatus, err := suite.status.Create(ctx, creatingAccount, creatingApplication, statusCreateForm) +	suite.NoError(err) +	suite.NotNil(apiStatus) + +	// ThreadID should be set on the status, +	// even though the replied-to status does +	// not have a threadID. +	dbStatus, dbErr := suite.state.DB.GetStatusByID(ctx, apiStatus.ID) +	if dbErr != nil { +		suite.FailNow(err.Error()) +	} +	suite.NotEmpty(dbStatus.ThreadID) +} +  func TestStatusCreateTestSuite(t *testing.T) {  	suite.Run(t, new(StatusCreateTestSuite))  }  | 
