[bugfix] Fix no notification if mention edited into status (#4102)

This pull request adds mention notifications if a mention was edited into a status after its initial publication.

Closes https://codeberg.org/superseriousbusiness/gotosocial/issues/3869

Reviewed-on: https://codeberg.org/superseriousbusiness/gotosocial/pulls/4102
Co-authored-by: tobi <tobi.smethurst@protonmail.com>
Co-committed-by: tobi <tobi.smethurst@protonmail.com>
This commit is contained in:
tobi
2025-05-04 09:45:10 +00:00
committed by kim
parent 056c67f396
commit f3f1854359
13 changed files with 196 additions and 48 deletions

View File

@@ -99,56 +99,77 @@ func (s *Surface) notifyMentions(
for _, mention := range status.Mentions {
// Set status on the mention (stops
// the below function populating it).
// notifyMention having to populate it).
mention.Status = status
// Beforehand, ensure the passed mention is fully populated.
if err := s.State.DB.PopulateMention(ctx, mention); err != nil {
errs.Appendf("error populating mention %s: %w", mention.ID, err)
continue
}
if mention.TargetAccount.IsRemote() {
// no need to notify
// remote accounts.
continue
}
// Ensure thread not muted
// by mentioned account.
muted, err := s.State.DB.IsThreadMutedByAccount(
ctx,
status.ThreadID,
mention.TargetAccountID,
)
if err != nil {
errs.Appendf("error checking status thread mute %s: %w", status.ThreadID, err)
continue
}
if muted {
// This mentioned account
// has muted the thread.
// Don't pester them.
continue
}
// notify mentioned
// by status author.
if err := s.Notify(ctx,
gtsmodel.NotificationMention,
mention.TargetAccount,
mention.OriginAccount,
mention.StatusID,
); err != nil {
errs.Appendf("error notifying mention target %s: %w", mention.TargetAccountID, err)
continue
// Do the thing.
if err := s.notifyMention(ctx, mention); err != nil {
errs = append(errs, err)
}
}
return errs.Combine()
}
// notifyMention notifies the target
// of the given mention that they've
// been mentioned in a status.
func (s *Surface) notifyMention(
ctx context.Context,
mention *gtsmodel.Mention,
) error {
// Beforehand, ensure the passed mention is fully populated.
if err := s.State.DB.PopulateMention(ctx, mention); err != nil {
return gtserror.Newf(
"error populating mention %s: %w",
mention.ID, err,
)
}
if mention.TargetAccount.IsRemote() {
// no need to notify
// remote accounts.
return nil
}
// Ensure thread not muted
// by mentioned account.
muted, err := s.State.DB.IsThreadMutedByAccount(
ctx,
mention.Status.ThreadID,
mention.TargetAccountID,
)
if err != nil {
return gtserror.Newf(
"error checking status thread mute %s: %w",
mention.Status.ThreadID, err,
)
}
if muted {
// This mentioned account
// has muted the thread.
// Don't pester them.
return nil
}
// Notify mentioned
// by status author.
if err := s.Notify(ctx,
gtsmodel.NotificationMention,
mention.TargetAccount,
mention.OriginAccount,
mention.StatusID,
); err != nil {
return gtserror.Newf(
"error notifying mention target %s: %w",
mention.TargetAccountID, err,
)
}
return nil
}
// notifyFollowRequest notifies the target of the given
// follow request that they have a new follow request.
func (s *Surface) notifyFollowRequest(