diff options
author | 2021-07-09 18:32:48 +0200 | |
---|---|---|
committer | 2021-07-09 18:32:48 +0200 | |
commit | c7da64922f8b41daaee1cb8fc2961f7fa1336737 (patch) | |
tree | b1f9c946bd223267f87f2a77a7455974d8d5e5e9 /internal/visibility | |
parent | Docs (#94) (diff) | |
download | gotosocial-c7da64922f8b41daaee1cb8fc2961f7fa1336737.tar.xz |
favourites GET implementation (#95)
Diffstat (limited to 'internal/visibility')
-rw-r--r-- | internal/visibility/filter.go | 5 | ||||
-rw-r--r-- | internal/visibility/statuspublictimelineable.go | 37 |
2 files changed, 42 insertions, 0 deletions
diff --git a/internal/visibility/filter.go b/internal/visibility/filter.go index d12ad0ff6..181eb8ee7 100644 --- a/internal/visibility/filter.go +++ b/internal/visibility/filter.go @@ -17,6 +17,11 @@ type Filter interface { // // This function will call StatusVisible internally, so it's not necessary to call it beforehand. StatusHometimelineable(targetStatus *gtsmodel.Status, requestingAccount *gtsmodel.Account) (bool, error) + + // StatusPublictimelineable returns true if targetStatus should be in the public timeline of the requesting account. + // + // This function will call StatusVisible internally, so it's not necessary to call it beforehand. + StatusPublictimelineable(targetStatus *gtsmodel.Status, timelineOwnerAccount *gtsmodel.Account) (bool, error) } type filter struct { diff --git a/internal/visibility/statuspublictimelineable.go b/internal/visibility/statuspublictimelineable.go new file mode 100644 index 000000000..d7f68faee --- /dev/null +++ b/internal/visibility/statuspublictimelineable.go @@ -0,0 +1,37 @@ +package visibility + +import ( + "fmt" + + "github.com/sirupsen/logrus" + "github.com/superseriousbusiness/gotosocial/internal/gtsmodel" +) + +func (f *filter) StatusPublictimelineable(targetStatus *gtsmodel.Status, timelineOwnerAccount *gtsmodel.Account) (bool, error) { + l := f.log.WithFields(logrus.Fields{ + "func": "StatusPublictimelineable", + "statusID": targetStatus.ID, + }) + + // Don't timeline a reply + if targetStatus.InReplyToURI != "" || targetStatus.InReplyToID != "" || targetStatus.InReplyToAccountID != "" { + return false, nil + } + + // status owner should always be able to see their own status in their timeline so we can return early if this is the case + if timelineOwnerAccount != nil && targetStatus.AccountID == timelineOwnerAccount.ID { + return true, nil + } + + v, err := f.StatusVisible(targetStatus, timelineOwnerAccount) + if err != nil { + return false, fmt.Errorf("StatusPublictimelineable: error checking visibility of status with id %s: %s", targetStatus.ID, err) + } + + if !v { + l.Debug("status is not publicTimelineable because it's not visible to the requester") + return false, nil + } + + return true, nil +} |