feat: add post mention
This commit is contained in:
@@ -32,6 +32,7 @@ const (
|
||||
NotifFollowRequest = "follow_request"
|
||||
NotifFollowAccepted = "follow_accepted"
|
||||
NotifPostLike = "post_like"
|
||||
NotifPostMention = "post_mention"
|
||||
|
||||
// Reminder kinds are delivered live (email + push + a websocket toast)
|
||||
// but NOT persisted — they're ephemeral nudges, not history.
|
||||
@@ -192,6 +193,38 @@ func (s *NotificationService) NotifyPostLike(ctx context.Context, postID, author
|
||||
// single post — a burst of likes within the window produces one email.
|
||||
const likeEmailThrottle = 6 * time.Hour
|
||||
|
||||
// NotifyPostMention tells `mentionedID` that `actorID` (the post author)
|
||||
// tagged them in a post. Persisted row + realtime + Web Push; no email
|
||||
// (push/in-app is enough, and a post can tag many people). Skips self-tags.
|
||||
func (s *NotificationService) NotifyPostMention(ctx context.Context, mentionedID, actorID, postID string) {
|
||||
if mentionedID == "" || actorID == "" || mentionedID == actorID {
|
||||
return
|
||||
}
|
||||
if err := s.notifs.CreateMention(ctx, mentionedID, actorID, postID); err != nil {
|
||||
s.logger.Warn("persist mention notification failed",
|
||||
zap.String("recipient", mentionedID), zap.Error(err))
|
||||
}
|
||||
actorUser, _ := s.users.FindByID(ctx, actorID)
|
||||
s.publishRealtime(ctx, mentionedID, NotifPostMention, actorUser)
|
||||
|
||||
if s.push == nil {
|
||||
return
|
||||
}
|
||||
who := "Someone"
|
||||
url := s.frontendURL + "/notifications"
|
||||
if actorUser != nil {
|
||||
who = actorDisplay(actorUser)
|
||||
url = s.frontendURL + "/u/" + actorUser.Handle + "/posts#post-" + postID
|
||||
}
|
||||
s.push.SendToUser(ctx, mentionedID, PushPayload{
|
||||
Title: "You were mentioned",
|
||||
Body: who + " mentioned you in a post",
|
||||
URL: url,
|
||||
Icon: s.iconURL(),
|
||||
Tag: NotifPostMention + ":" + postID,
|
||||
})
|
||||
}
|
||||
|
||||
// likeMessage renders the aggregated like text: "X liked your post" or
|
||||
// "X and N others liked your post".
|
||||
func likeMessage(who string, count int) string {
|
||||
|
||||
Reference in New Issue
Block a user