mirror of
https://github.com/superseriousbusiness/gotosocial
synced 2025-06-05 21:59:39 +02:00
[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
This commit is contained in:
@ -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 {
|
||||
|
||||
|
Reference in New Issue
Block a user