diff options
Diffstat (limited to 'internal/typeutils')
-rw-r--r-- | internal/typeutils/converter.go | 7 | ||||
-rw-r--r-- | internal/typeutils/internaltofrontend.go | 75 | ||||
-rw-r--r-- | internal/typeutils/internaltofrontend_test.go | 63 |
3 files changed, 119 insertions, 26 deletions
diff --git a/internal/typeutils/converter.go b/internal/typeutils/converter.go index dfa72fdcd..311839dc0 100644 --- a/internal/typeutils/converter.go +++ b/internal/typeutils/converter.go @@ -20,6 +20,7 @@ package typeutils import ( "sync" + "github.com/superseriousbusiness/gotosocial/internal/filter/interaction" "github.com/superseriousbusiness/gotosocial/internal/filter/visibility" "github.com/superseriousbusiness/gotosocial/internal/state" ) @@ -28,13 +29,15 @@ type Converter struct { state *state.State defaultAvatars []string randAvatars sync.Map - filter *visibility.Filter + visFilter *visibility.Filter + intFilter *interaction.Filter } func NewConverter(state *state.State) *Converter { return &Converter{ state: state, defaultAvatars: populateDefaultAvatars(), - filter: visibility.NewFilter(state), + visFilter: visibility.NewFilter(state), + intFilter: interaction.NewFilter(state), } } diff --git a/internal/typeutils/internaltofrontend.go b/internal/typeutils/internaltofrontend.go index 29d972e48..cbe746d2f 100644 --- a/internal/typeutils/internaltofrontend.go +++ b/internal/typeutils/internaltofrontend.go @@ -861,7 +861,7 @@ func (c *Converter) statusToAPIFilterResults( for _, account := range otherAccounts { // Is this account visible? - visible, err := c.filter.AccountVisible(ctx, requestingAccount, account) + visible, err := c.visFilter.AccountVisible(ctx, requestingAccount, account) if err != nil { return nil, err } @@ -2382,8 +2382,8 @@ func (c *Converter) ThemesToAPIThemes(themes []*gtsmodel.Theme) []apimodel.Theme func (c *Converter) InteractionPolicyToAPIInteractionPolicy( ctx context.Context, policy *gtsmodel.InteractionPolicy, - _ *gtsmodel.Status, // Used in upcoming PR. - _ *gtsmodel.Account, // Used in upcoming PR. + status *gtsmodel.Status, + requester *gtsmodel.Account, ) (*apimodel.InteractionPolicy, error) { apiPolicy := &apimodel.InteractionPolicy{ CanFavourite: apimodel.PolicyRules{ @@ -2400,6 +2400,75 @@ func (c *Converter) InteractionPolicyToAPIInteractionPolicy( }, } + if status == nil || requester == nil { + // We're done here! + return apiPolicy, nil + } + + // Status and requester are both defined, + // so we can add the "me" Value to the policy + // for each interaction type, if applicable. + + likeable, err := c.intFilter.StatusLikeable(ctx, requester, status) + if err != nil { + err := gtserror.Newf("error checking status likeable by requester: %w", err) + return nil, err + } + + if likeable.Permission == gtsmodel.PolicyPermissionPermitted { + // We can do this! + apiPolicy.CanFavourite.Always = append( + apiPolicy.CanFavourite.Always, + apimodel.PolicyValueMe, + ) + } else if likeable.Permission == gtsmodel.PolicyPermissionWithApproval { + // We can do this with approval. + apiPolicy.CanFavourite.WithApproval = append( + apiPolicy.CanFavourite.WithApproval, + apimodel.PolicyValueMe, + ) + } + + replyable, err := c.intFilter.StatusReplyable(ctx, requester, status) + if err != nil { + err := gtserror.Newf("error checking status replyable by requester: %w", err) + return nil, err + } + + if replyable.Permission == gtsmodel.PolicyPermissionPermitted { + // We can do this! + apiPolicy.CanReply.Always = append( + apiPolicy.CanReply.Always, + apimodel.PolicyValueMe, + ) + } else if replyable.Permission == gtsmodel.PolicyPermissionWithApproval { + // We can do this with approval. + apiPolicy.CanReply.WithApproval = append( + apiPolicy.CanReply.WithApproval, + apimodel.PolicyValueMe, + ) + } + + boostable, err := c.intFilter.StatusBoostable(ctx, requester, status) + if err != nil { + err := gtserror.Newf("error checking status boostable by requester: %w", err) + return nil, err + } + + if boostable.Permission == gtsmodel.PolicyPermissionPermitted { + // We can do this! + apiPolicy.CanReblog.Always = append( + apiPolicy.CanReblog.Always, + apimodel.PolicyValueMe, + ) + } else if boostable.Permission == gtsmodel.PolicyPermissionWithApproval { + // We can do this with approval. + apiPolicy.CanReblog.WithApproval = append( + apiPolicy.CanReblog.WithApproval, + apimodel.PolicyValueMe, + ) + } + return apiPolicy, nil } diff --git a/internal/typeutils/internaltofrontend_test.go b/internal/typeutils/internaltofrontend_test.go index 579b7a067..46f6c2455 100644 --- a/internal/typeutils/internaltofrontend_test.go +++ b/internal/typeutils/internaltofrontend_test.go @@ -551,19 +551,22 @@ func (suite *InternalToFrontendTestSuite) TestStatusToFrontend() { "interaction_policy": { "can_favourite": { "always": [ - "public" + "public", + "me" ], "with_approval": [] }, "can_reply": { "always": [ - "public" + "public", + "me" ], "with_approval": [] }, "can_reblog": { "always": [ - "public" + "public", + "me" ], "with_approval": [] } @@ -747,19 +750,22 @@ func (suite *InternalToFrontendTestSuite) TestWarnFilteredStatusToFrontend() { "interaction_policy": { "can_favourite": { "always": [ - "public" + "public", + "me" ], "with_approval": [] }, "can_reply": { "always": [ - "public" + "public", + "me" ], "with_approval": [] }, "can_reblog": { "always": [ - "public" + "public", + "me" ], "with_approval": [] } @@ -927,19 +933,22 @@ func (suite *InternalToFrontendTestSuite) TestWarnFilteredBoostToFrontend() { "interaction_policy": { "can_favourite": { "always": [ - "public" + "public", + "me" ], "with_approval": [] }, "can_reply": { "always": [ - "public" + "public", + "me" ], "with_approval": [] }, "can_reblog": { "always": [ - "public" + "public", + "me" ], "with_approval": [] } @@ -1010,19 +1019,22 @@ func (suite *InternalToFrontendTestSuite) TestWarnFilteredBoostToFrontend() { "interaction_policy": { "can_favourite": { "always": [ - "public" + "public", + "me" ], "with_approval": [] }, "can_reply": { "always": [ - "public" + "public", + "me" ], "with_approval": [] }, "can_reblog": { "always": [ - "public" + "public", + "me" ], "with_approval": [] } @@ -1257,19 +1269,22 @@ func (suite *InternalToFrontendTestSuite) TestStatusToFrontendUnknownAttachments "interaction_policy": { "can_favourite": { "always": [ - "public" + "public", + "me" ], "with_approval": [] }, "can_reply": { "always": [ - "public" + "public", + "me" ], "with_approval": [] }, "can_reblog": { "always": [ - "public" + "public", + "me" ], "with_approval": [] } @@ -1560,19 +1575,22 @@ func (suite *InternalToFrontendTestSuite) TestStatusToFrontendUnknownLanguage() "interaction_policy": { "can_favourite": { "always": [ - "public" + "public", + "me" ], "with_approval": [] }, "can_reply": { "always": [ - "public" + "public", + "me" ], "with_approval": [] }, "can_reblog": { "always": [ - "public" + "public", + "me" ], "with_approval": [] } @@ -2561,19 +2579,22 @@ func (suite *InternalToFrontendTestSuite) TestAdminReportToFrontend2() { "interaction_policy": { "can_favourite": { "always": [ - "public" + "public", + "me" ], "with_approval": [] }, "can_reply": { "always": [ - "public" + "public", + "me" ], "with_approval": [] }, "can_reblog": { "always": [ - "public" + "public", + "me" ], "with_approval": [] } |