summaryrefslogtreecommitdiff
path: root/internal/processing/workers/surfacenotify.go
diff options
context:
space:
mode:
authorLibravatar tobi <tobi.smethurst@protonmail.com>2025-05-04 09:45:10 +0000
committerLibravatar kim <gruf@noreply.codeberg.org>2025-05-04 09:45:10 +0000
commitf3f185435916165a6dd72f3a1bd67e370a2a783d (patch)
tree766f79d878fbd94cf622944b3cdd8120469ecb55 /internal/processing/workers/surfacenotify.go
parent[chore/cicd] Account for force pushes in conditional runs (#4121) (diff)
downloadgotosocial-f3f185435916165a6dd72f3a1bd67e370a2a783d.tar.xz
[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>
Diffstat (limited to 'internal/processing/workers/surfacenotify.go')
-rw-r--r--internal/processing/workers/surfacenotify.go97
1 files changed, 59 insertions, 38 deletions
diff --git a/internal/processing/workers/surfacenotify.go b/internal/processing/workers/surfacenotify.go
index 6dddae359..8e034c23a 100644
--- a/internal/processing/workers/surfacenotify.go
+++ b/internal/processing/workers/surfacenotify.go
@@ -99,54 +99,75 @@ 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
+ // Do the thing.
+ if err := s.notifyMention(ctx, mention); err != nil {
+ errs = append(errs, err)
}
+ }
- if mention.TargetAccount.IsRemote() {
- // no need to notify
- // remote accounts.
- continue
- }
+ return errs.Combine()
+}
- // Ensure thread not muted
- // by mentioned account.
- muted, err := s.State.DB.IsThreadMutedByAccount(
- ctx,
- status.ThreadID,
- mention.TargetAccountID,
+// 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 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
- }
+ if mention.TargetAccount.IsRemote() {
+ // no need to notify
+ // remote accounts.
+ return nil
+ }
- // 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
- }
+ // 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,
+ )
}
- return errs.Combine()
+ 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