diff options
Diffstat (limited to 'internal/visibility')
-rw-r--r-- | internal/visibility/filter.go | 4 | ||||
-rw-r--r-- | internal/visibility/statusvisible.go | 14 |
2 files changed, 18 insertions, 0 deletions
diff --git a/internal/visibility/filter.go b/internal/visibility/filter.go index e3435842e..9f4bb4aad 100644 --- a/internal/visibility/filter.go +++ b/internal/visibility/filter.go @@ -32,6 +32,10 @@ type Filter interface { // or account domains, and other relevant accounts mentioned in or replied to by the status. StatusVisible(ctx context.Context, targetStatus *gtsmodel.Status, requestingAccount *gtsmodel.Account) (bool, error) + // StatusesVisible calls StatusVisible for each status in the statuses slice, and returns a slice of only + // statuses which are visible to the requestingAccount. + StatusesVisible(ctx context.Context, statuses []*gtsmodel.Status, requestingAccount *gtsmodel.Account) ([]*gtsmodel.Status, error) + // StatusHometimelineable returns true if targetStatus should be in the home timeline of the requesting account. // // This function will call StatusVisible internally, so it's not necessary to call it beforehand. diff --git a/internal/visibility/statusvisible.go b/internal/visibility/statusvisible.go index 1e48abcda..a99494836 100644 --- a/internal/visibility/statusvisible.go +++ b/internal/visibility/statusvisible.go @@ -239,3 +239,17 @@ func (f *filter) StatusVisible(ctx context.Context, targetStatus *gtsmodel.Statu // If we reached here, all is okay return true, nil } + +func (f *filter) StatusesVisible(ctx context.Context, statuses []*gtsmodel.Status, requestingAccount *gtsmodel.Account) ([]*gtsmodel.Status, error) { + filtered := []*gtsmodel.Status{} + for _, s := range statuses { + visible, err := f.StatusVisible(ctx, s, requestingAccount) + if err != nil { + return nil, err + } + if visible { + filtered = append(filtered, s) + } + } + return filtered, nil +} |