diff options
author | 2024-09-18 18:35:35 +0200 | |
---|---|---|
committer | 2024-09-18 16:35:35 +0000 | |
commit | c378ad2bb3ae9ea2877baf167d6a1397675eff17 (patch) | |
tree | 0feda9ab0ce2c6798b73445fbfede7fde908956f /internal/processing | |
parent | [chore] make csv export ordering determinate (#3318) (diff) | |
download | gotosocial-c378ad2bb3ae9ea2877baf167d6a1397675eff17.tar.xz |
[feature] Allow users to submit `interaction_policy` on new statuses (#3314)
* [feature] Parse `interaction_policy` on status submission
* beep boop
* swagger? i barely know er
Diffstat (limited to 'internal/processing')
-rw-r--r-- | internal/processing/status/create.go | 44 |
1 files changed, 32 insertions, 12 deletions
diff --git a/internal/processing/status/create.go b/internal/processing/status/create.go index 5f2cb8212..1513018ae 100644 --- a/internal/processing/status/create.go +++ b/internal/processing/status/create.go @@ -117,14 +117,14 @@ func (p *Processor) Create( return nil, errWithCode } - if err := processVisibility(form, requester.Settings.Privacy, status); err != nil { + if err := p.processVisibility(ctx, form, requester.Settings.Privacy, status); err != nil { return nil, gtserror.NewErrorInternalError(err) } - // Process policy AFTER visibility as it - // relies on status.Visibility being set. - if err := processInteractionPolicy(form, requester.Settings, status); err != nil { - return nil, gtserror.NewErrorInternalError(err) + // Process policy AFTER visibility as it relies + // on status.Visibility and form.Visibility being set. + if errWithCode := processInteractionPolicy(form, requester.Settings, status); errWithCode != nil { + return nil, errWithCode } if err := processLanguage(form, requester.Settings.Language, status); err != nil { @@ -337,7 +337,8 @@ func (p *Processor) processMediaIDs(ctx context.Context, form *apimodel.StatusCr return nil } -func processVisibility( +func (p *Processor) processVisibility( + ctx context.Context, form *apimodel.StatusCreateRequest, accountDefaultVis gtsmodel.Visibility, status *gtsmodel.Status, @@ -347,13 +348,17 @@ func processVisibility( case form.Visibility != "": status.Visibility = typeutils.APIVisToVis(form.Visibility) - // Fall back to account default. + // Fall back to account default, set + // this back on the form for later use. case accountDefaultVis != "": status.Visibility = accountDefaultVis + form.Visibility = p.converter.VisToAPIVis(ctx, accountDefaultVis) - // What? Fall back to global default. + // What? Fall back to global default, set + // this back on the form for later use. default: status.Visibility = gtsmodel.VisibilityDefault + form.Visibility = p.converter.VisToAPIVis(ctx, gtsmodel.VisibilityDefault) } // Set federated according to "local_only" field, @@ -365,17 +370,32 @@ func processVisibility( } func processInteractionPolicy( - _ *apimodel.StatusCreateRequest, + form *apimodel.StatusCreateRequest, settings *gtsmodel.AccountSettings, status *gtsmodel.Status, -) error { - // TODO: parse policy for this - // status from form and prefer this. +) gtserror.WithCode { + // If policy is set on the + // form then prefer this. + // // TODO: prevent scope widening by // limiting interaction policy if // inReplyTo status has a stricter // interaction policy than this one. + if form.InteractionPolicy != nil { + p, err := typeutils.APIInteractionPolicyToInteractionPolicy( + form.InteractionPolicy, + form.Visibility, + ) + + if err != nil { + errWithCode := gtserror.NewErrorBadRequest(err, err.Error()) + return errWithCode + } + + status.InteractionPolicy = p + return nil + } switch status.Visibility { |