[chore] Deprecate with_approval, always (client API), approvalRequired, always (fedi API) (#4173)

This pull request deprecates `with_approval` and `always` on the client API side, and `approvalRequired` and `always` on the fedi API side, replacing them with `automatic_approval` and `manual_approval` and `automaticApproval` and `manualApproval`, respectively.

Back-compat is kept with these deprecated fields, and they're still serialized to the client API and fedi APIs respectively, in addition to the new non-deprecated properties.

This will stay the case until v0.21.0 when they'll be removed.

For the sake of not doing a massive database migration, the fields are still named `Always` and `WithApproval` in storage. I think this is probably fine!

Part of https://codeberg.org/superseriousbusiness/gotosocial/issues/4026
Reviewed-on: https://codeberg.org/superseriousbusiness/gotosocial/pulls/4173
Co-authored-by: tobi <tobi.smethurst@protonmail.com>
Co-committed-by: tobi <tobi.smethurst@protonmail.com>
This commit is contained in:
tobi 2025-05-13 14:48:11 +00:00 committed by kim
commit ca12742a7a
28 changed files with 1214 additions and 248 deletions

View file

@ -123,10 +123,10 @@ const (
// Interaction is conditionally permitted
// for this PolicyValue + interaction combo,
// pending approval by the item owner.
PolicyPermissionWithApproval
PolicyPermissionManualApproval
// Interaction is permitted for this
// PolicyValue + interaction combination.
PolicyPermissionPermitted
PolicyPermissionAutomaticApproval
)
// PolicyCheckResult encapsulates the results
@ -138,39 +138,39 @@ type PolicyCheckResult struct {
Permission PolicyPermission
// Value that this check matched on.
// Only set if Permission = permitted.
PermittedMatchedOn *PolicyValue
// Only set if Permission = automatic.
PermissionMatchedOn *PolicyValue
}
// MatchedOnCollection returns true if this policy check
// result turned up Permitted, and matched based on the
// result turned up AutomaticApproval, and matched based on the
// requester's presence in a followers or following collection.
func (pcr *PolicyCheckResult) MatchedOnCollection() bool {
if !pcr.Permitted() {
if !pcr.AutomaticApproval() {
// Not permitted at all
// so definitely didn't
// match on collection.
return false
}
if pcr.PermittedMatchedOn == nil {
if pcr.PermissionMatchedOn == nil {
return false
}
return *pcr.PermittedMatchedOn == PolicyValueFollowers ||
*pcr.PermittedMatchedOn == PolicyValueFollowing
return *pcr.PermissionMatchedOn == PolicyValueFollowers ||
*pcr.PermissionMatchedOn == PolicyValueFollowing
}
// AutomaticApproval returns true if this policy
// check resulted in Permission = automatic approval.
func (pcr *PolicyCheckResult) AutomaticApproval() bool {
return pcr.Permission == PolicyPermissionAutomaticApproval
}
// Permitted returns true if this policy
// check resulted in Permission = permitted.
func (pcr *PolicyCheckResult) Permitted() bool {
return pcr.Permission == PolicyPermissionPermitted
}
// Permitted returns true if this policy
// check resulted in Permission = with approval.
func (pcr *PolicyCheckResult) WithApproval() bool {
return pcr.Permission == PolicyPermissionWithApproval
// check resulted in Permission = manual approval.
func (pcr *PolicyCheckResult) ManualApproval() bool {
return pcr.Permission == PolicyPermissionManualApproval
}
// Permitted returns true if this policy
@ -201,14 +201,22 @@ type InteractionPolicy struct {
// to which a certain interaction is permitted
// to various Actor and Actor Collection URIs.
type PolicyRules struct {
// Always is for PolicyValues who are
// permitted to do an interaction
// without requiring approval.
Always PolicyValues
// WithApproval is for PolicyValues who
// are conditionally permitted to do
// an interaction, pending approval.
WithApproval PolicyValues
// AutomaticApproval is for PolicyValue entries
// that are pre-approved to do an interaction
// and will receive automatic approval.
//
// Note: This is stored in the db as JSON.
// JSON tags set for back compat with previous
// (now deprecated) name for this PolicyValues.
AutomaticApproval PolicyValues `json:"Always,omitempty"`
// ManualApproval is for PolicyValues entries
// that are conditionally permitted to do
// an interaction, pending manual approval.
//
// Note: This is stored in the db as JSON.
// JSON tags set for back compat with previous
// (now deprecated) name for this PolicyValues.
ManualApproval PolicyValues `json:"WithApproval,omitempty"`
}
// Returns the default interaction policy
@ -231,24 +239,24 @@ func DefaultInteractionPolicyFor(v Visibility) *InteractionPolicy {
var defaultPolicyPublic = &InteractionPolicy{
CanLike: PolicyRules{
// Anyone can like.
Always: PolicyValues{
AutomaticApproval: PolicyValues{
PolicyValuePublic,
},
WithApproval: make(PolicyValues, 0),
ManualApproval: make(PolicyValues, 0),
},
CanReply: PolicyRules{
// Anyone can reply.
Always: PolicyValues{
AutomaticApproval: PolicyValues{
PolicyValuePublic,
},
WithApproval: make(PolicyValues, 0),
ManualApproval: make(PolicyValues, 0),
},
CanAnnounce: PolicyRules{
// Anyone can announce.
Always: PolicyValues{
AutomaticApproval: PolicyValues{
PolicyValuePublic,
},
WithApproval: make(PolicyValues, 0),
ManualApproval: make(PolicyValues, 0),
},
}
@ -269,29 +277,29 @@ var defaultPolicyFollowersOnly = &InteractionPolicy{
CanLike: PolicyRules{
// Self, followers and
// mentioned can like.
Always: PolicyValues{
AutomaticApproval: PolicyValues{
PolicyValueAuthor,
PolicyValueFollowers,
PolicyValueMentioned,
},
WithApproval: make(PolicyValues, 0),
ManualApproval: make(PolicyValues, 0),
},
CanReply: PolicyRules{
// Self, followers and
// mentioned can reply.
Always: PolicyValues{
AutomaticApproval: PolicyValues{
PolicyValueAuthor,
PolicyValueFollowers,
PolicyValueMentioned,
},
WithApproval: make(PolicyValues, 0),
ManualApproval: make(PolicyValues, 0),
},
CanAnnounce: PolicyRules{
// Only self can announce.
Always: PolicyValues{
AutomaticApproval: PolicyValues{
PolicyValueAuthor,
},
WithApproval: make(PolicyValues, 0),
ManualApproval: make(PolicyValues, 0),
},
}
@ -305,27 +313,27 @@ var defaultPolicyDirect = &InteractionPolicy{
CanLike: PolicyRules{
// Mentioned and self
// can always like.
Always: PolicyValues{
AutomaticApproval: PolicyValues{
PolicyValueAuthor,
PolicyValueMentioned,
},
WithApproval: make(PolicyValues, 0),
ManualApproval: make(PolicyValues, 0),
},
CanReply: PolicyRules{
// Mentioned and self
// can always reply.
Always: PolicyValues{
AutomaticApproval: PolicyValues{
PolicyValueAuthor,
PolicyValueMentioned,
},
WithApproval: make(PolicyValues, 0),
ManualApproval: make(PolicyValues, 0),
},
CanAnnounce: PolicyRules{
// Only self can announce.
Always: PolicyValues{
AutomaticApproval: PolicyValues{
PolicyValueAuthor,
},
WithApproval: make(PolicyValues, 0),
ManualApproval: make(PolicyValues, 0),
},
}