mirror of
				https://github.com/superseriousbusiness/gotosocial
				synced 2025-06-05 21:59:39 +02:00 
			
		
		
		
	[feature] Advertise rich text formats, support content_type field (#1370)
* Advertise rich text formats, support content_type field * Update JSON in instance patch tests * Replace format with content_type everywhere * update migration to work with both pg and sqlite * regenerate swagger docs * update instance serialization + tests * fix up * learn to code tobi please, i'm begging you --------- Co-authored-by: tsmethurst <tobi.smethurst@protonmail.com>
This commit is contained in:
		@@ -79,7 +79,7 @@ func (p *Processor) Update(ctx context.Context, account *gtsmodel.Account, form
 | 
			
		||||
 | 
			
		||||
		// Process note to generate a valid HTML representation
 | 
			
		||||
		var f text.FormatFunc
 | 
			
		||||
		if account.StatusFormat == "markdown" {
 | 
			
		||||
		if account.StatusContentType == "text/markdown" {
 | 
			
		||||
			f = p.formatter.FromMarkdown
 | 
			
		||||
		} else {
 | 
			
		||||
			f = p.formatter.FromPlain
 | 
			
		||||
@@ -144,12 +144,12 @@ func (p *Processor) Update(ctx context.Context, account *gtsmodel.Account, form
 | 
			
		||||
			account.Privacy = privacy
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		if form.Source.StatusFormat != nil {
 | 
			
		||||
			if err := validate.StatusFormat(*form.Source.StatusFormat); err != nil {
 | 
			
		||||
		if form.Source.StatusContentType != nil {
 | 
			
		||||
			if err := validate.StatusContentType(*form.Source.StatusContentType); err != nil {
 | 
			
		||||
				return nil, gtserror.NewErrorBadRequest(err, err.Error())
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			account.StatusFormat = *form.Source.StatusFormat
 | 
			
		||||
			account.StatusContentType = *form.Source.StatusContentType
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -122,13 +122,13 @@ func (suite *AccountUpdateTestSuite) TestAccountUpdateWithMarkdownNote() {
 | 
			
		||||
		Note: ¬e,
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// set default post language of account 1 to markdown
 | 
			
		||||
	testAccount.StatusFormat = "markdown"
 | 
			
		||||
	// set default post content type of account 1 to markdown
 | 
			
		||||
	testAccount.StatusContentType = "text/markdown"
 | 
			
		||||
 | 
			
		||||
	// should get no error from the update function, and an api model account returned
 | 
			
		||||
	apiAccount, errWithCode := suite.accountProcessor.Update(context.Background(), testAccount, form)
 | 
			
		||||
	// reset test account to avoid breaking other tests
 | 
			
		||||
	testAccount.StatusFormat = "plain"
 | 
			
		||||
	testAccount.StatusContentType = "text/plain"
 | 
			
		||||
	suite.NoError(errWithCode)
 | 
			
		||||
	suite.NotNil(apiAccount)
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -290,32 +290,32 @@ func processContent(ctx context.Context, dbService db.DB, formatter text.Formatt
 | 
			
		||||
		return nil
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// if format wasn't specified we should try to figure out what format this user prefers
 | 
			
		||||
	if form.Format == "" {
 | 
			
		||||
	// if content type wasn't specified we should try to figure out what content type this user prefers
 | 
			
		||||
	if form.ContentType == "" {
 | 
			
		||||
		acct, err := dbService.GetAccountByID(ctx, accountID)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return fmt.Errorf("error processing new content: couldn't retrieve account from db to check post format: %s", err)
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		switch acct.StatusFormat {
 | 
			
		||||
		case "plain":
 | 
			
		||||
			form.Format = apimodel.StatusFormatPlain
 | 
			
		||||
		case "markdown":
 | 
			
		||||
			form.Format = apimodel.StatusFormatMarkdown
 | 
			
		||||
		switch acct.StatusContentType {
 | 
			
		||||
		case "text/plain":
 | 
			
		||||
			form.ContentType = apimodel.StatusContentTypePlain
 | 
			
		||||
		case "text/markdown":
 | 
			
		||||
			form.ContentType = apimodel.StatusContentTypeMarkdown
 | 
			
		||||
		default:
 | 
			
		||||
			form.Format = apimodel.StatusFormatDefault
 | 
			
		||||
			form.ContentType = apimodel.StatusContentTypeDefault
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// parse content out of the status depending on what format has been submitted
 | 
			
		||||
	// parse content out of the status depending on what content type has been submitted
 | 
			
		||||
	var f text.FormatFunc
 | 
			
		||||
	switch form.Format {
 | 
			
		||||
	case apimodel.StatusFormatPlain:
 | 
			
		||||
	switch form.ContentType {
 | 
			
		||||
	case apimodel.StatusContentTypePlain:
 | 
			
		||||
		f = formatter.FromPlain
 | 
			
		||||
	case apimodel.StatusFormatMarkdown:
 | 
			
		||||
	case apimodel.StatusContentTypeMarkdown:
 | 
			
		||||
		f = formatter.FromMarkdown
 | 
			
		||||
	default:
 | 
			
		||||
		return fmt.Errorf("format %s not recognised as a valid status format", form.Format)
 | 
			
		||||
		return fmt.Errorf("format %s not recognised as a valid status format", form.ContentType)
 | 
			
		||||
	}
 | 
			
		||||
	formatted := f(ctx, parseMention, accountID, status.ID, form.Status)
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -50,7 +50,7 @@ func (suite *StatusCreateTestSuite) TestProcessContentWarningWithQuotationMarks(
 | 
			
		||||
			Visibility:  apimodel.VisibilityPublic,
 | 
			
		||||
			ScheduledAt: "",
 | 
			
		||||
			Language:    "en",
 | 
			
		||||
			Format:      apimodel.StatusFormatPlain,
 | 
			
		||||
			ContentType: apimodel.StatusContentTypePlain,
 | 
			
		||||
		},
 | 
			
		||||
		AdvancedVisibilityFlagsForm: apimodel.AdvancedVisibilityFlagsForm{
 | 
			
		||||
			Federated: nil,
 | 
			
		||||
@@ -84,7 +84,7 @@ func (suite *StatusCreateTestSuite) TestProcessContentWarningWithHTMLEscapedQuot
 | 
			
		||||
			Visibility:  apimodel.VisibilityPublic,
 | 
			
		||||
			ScheduledAt: "",
 | 
			
		||||
			Language:    "en",
 | 
			
		||||
			Format:      apimodel.StatusFormatPlain,
 | 
			
		||||
			ContentType: apimodel.StatusContentTypePlain,
 | 
			
		||||
		},
 | 
			
		||||
		AdvancedVisibilityFlagsForm: apimodel.AdvancedVisibilityFlagsForm{
 | 
			
		||||
			Federated: nil,
 | 
			
		||||
@@ -122,7 +122,7 @@ func (suite *StatusCreateTestSuite) TestProcessStatusMarkdownWithUnderscoreEmoji
 | 
			
		||||
			Visibility:  apimodel.VisibilityPublic,
 | 
			
		||||
			ScheduledAt: "",
 | 
			
		||||
			Language:    "en",
 | 
			
		||||
			Format:      apimodel.StatusFormatMarkdown,
 | 
			
		||||
			ContentType: apimodel.StatusContentTypeMarkdown,
 | 
			
		||||
		},
 | 
			
		||||
		AdvancedVisibilityFlagsForm: apimodel.AdvancedVisibilityFlagsForm{
 | 
			
		||||
			Federated: nil,
 | 
			
		||||
@@ -156,7 +156,7 @@ func (suite *StatusCreateTestSuite) TestProcessStatusMarkdownWithSpoilerTextEmoj
 | 
			
		||||
			Visibility:  apimodel.VisibilityPublic,
 | 
			
		||||
			ScheduledAt: "",
 | 
			
		||||
			Language:    "en",
 | 
			
		||||
			Format:      apimodel.StatusFormatMarkdown,
 | 
			
		||||
			ContentType: apimodel.StatusContentTypeMarkdown,
 | 
			
		||||
		},
 | 
			
		||||
		AdvancedVisibilityFlagsForm: apimodel.AdvancedVisibilityFlagsForm{
 | 
			
		||||
			Federated: nil,
 | 
			
		||||
@@ -194,7 +194,7 @@ func (suite *StatusCreateTestSuite) TestProcessMediaDescriptionTooShort() {
 | 
			
		||||
			Visibility:  apimodel.VisibilityPublic,
 | 
			
		||||
			ScheduledAt: "",
 | 
			
		||||
			Language:    "en",
 | 
			
		||||
			Format:      apimodel.StatusFormatPlain,
 | 
			
		||||
			ContentType: apimodel.StatusContentTypePlain,
 | 
			
		||||
		},
 | 
			
		||||
		AdvancedVisibilityFlagsForm: apimodel.AdvancedVisibilityFlagsForm{
 | 
			
		||||
			Federated: nil,
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user