[feature] Status thread mute/unmute functionality (#2278)

* add db models + functions for keeping track of threads

* give em the old linty testy

* create, remove, check mutes

* swagger

* testerino

* test mute/unmute via api

* add info log about new index creation

* thread + allow muting of any remote statuses that mention a local account

* IsStatusThreadMutedBy -> IsThreadMutedByAccount

* use common processing functions in status processor

* set = NULL

* favee!

* get rekt darlings, darlings get rekt

* testrig please, have mercy muy liege
This commit is contained in:
tobi
2023-10-25 16:04:53 +02:00
committed by GitHub
parent 27f4659139
commit c7b6cd7770
48 changed files with 1750 additions and 198 deletions

View File

@ -75,6 +75,7 @@ func (suite *FromClientAPITestSuite) newStatus(
newStatus.InReplyToAccountID = replyToStatus.AccountID
newStatus.InReplyToID = replyToStatus.ID
newStatus.InReplyToURI = replyToStatus.URI
newStatus.ThreadID = replyToStatus.ThreadID
// Mention the replied-to account.
mention := &gtsmodel.Mention{
@ -324,6 +325,114 @@ func (suite *FromClientAPITestSuite) TestProcessCreateStatusReply() {
)
}
func (suite *FromClientAPITestSuite) TestProcessCreateStatusReplyMuted() {
var (
ctx = context.Background()
postingAccount = suite.testAccounts["admin_account"]
receivingAccount = suite.testAccounts["local_account_1"]
// Admin account posts a reply to zork.
// Normally zork would get a notification
// for this, but zork mutes this thread.
status = suite.newStatus(
ctx,
postingAccount,
gtsmodel.VisibilityPublic,
suite.testStatuses["local_account_1_status_1"],
nil,
)
threadMute = &gtsmodel.ThreadMute{
ID: "01HD3KRMBB1M85QRWHD912QWRE",
ThreadID: suite.testStatuses["local_account_1_status_1"].ThreadID,
AccountID: receivingAccount.ID,
}
)
// Store the thread mute before processing new status.
if err := suite.db.PutThreadMute(ctx, threadMute); err != nil {
suite.FailNow(err.Error())
}
// Process the new status.
if err := suite.processor.Workers().ProcessFromClientAPI(
ctx,
messages.FromClientAPI{
APObjectType: ap.ObjectNote,
APActivityType: ap.ActivityCreate,
GTSModel: status,
OriginAccount: postingAccount,
},
); err != nil {
suite.FailNow(err.Error())
}
// Ensure no notification received.
notif, err := suite.db.GetNotification(
ctx,
gtsmodel.NotificationMention,
receivingAccount.ID,
postingAccount.ID,
status.ID,
)
suite.ErrorIs(err, db.ErrNoEntries)
suite.Nil(notif)
}
func (suite *FromClientAPITestSuite) TestProcessCreateStatusBoostMuted() {
var (
ctx = context.Background()
postingAccount = suite.testAccounts["admin_account"]
receivingAccount = suite.testAccounts["local_account_1"]
// Admin account boosts a status by zork.
// Normally zork would get a notification
// for this, but zork mutes this thread.
status = suite.newStatus(
ctx,
postingAccount,
gtsmodel.VisibilityPublic,
nil,
suite.testStatuses["local_account_1_status_1"],
)
threadMute = &gtsmodel.ThreadMute{
ID: "01HD3KRMBB1M85QRWHD912QWRE",
ThreadID: suite.testStatuses["local_account_1_status_1"].ThreadID,
AccountID: receivingAccount.ID,
}
)
// Store the thread mute before processing new status.
if err := suite.db.PutThreadMute(ctx, threadMute); err != nil {
suite.FailNow(err.Error())
}
// Process the new status.
if err := suite.processor.Workers().ProcessFromClientAPI(
ctx,
messages.FromClientAPI{
APObjectType: ap.ActivityAnnounce,
APActivityType: ap.ActivityCreate,
GTSModel: status,
OriginAccount: postingAccount,
},
); err != nil {
suite.FailNow(err.Error())
}
// Ensure no notification received.
notif, err := suite.db.GetNotification(
ctx,
gtsmodel.NotificationReblog,
receivingAccount.ID,
postingAccount.ID,
status.ID,
)
suite.ErrorIs(err, db.ErrNoEntries)
suite.Nil(notif)
}
func (suite *FromClientAPITestSuite) TestProcessCreateStatusListRepliesPolicyListOnlyOK() {
// We're modifying the test list so take a copy.
testList := new(gtsmodel.List)