Skip to content

Commit

Permalink
optimsitic and new comment/admire push notifications (#1159)
Browse files Browse the repository at this point in the history
* optimsitic and new comment/admire push notifications

* truncate long names

* wrong join var
  • Loading branch information
benny-conn authored Aug 21, 2023
1 parent cf136c9 commit de5376c
Show file tree
Hide file tree
Showing 3 changed files with 91 additions and 4 deletions.
26 changes: 26 additions & 0 deletions db/gen/coredb/query.sql.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

3 changes: 3 additions & 0 deletions db/queries/core/query.sql
Original file line number Diff line number Diff line change
Expand Up @@ -82,6 +82,9 @@ SELECT c.* FROM galleries g, unnest(g.collections)
-- name: GetTokenById :one
select * from tokens where id = $1 and displayable and deleted = false;

-- name: GetTokenMediaByTokenId :one
select tm.* from tokens join token_medias tm on tokens.token_media_id = tm.id where tokens.id = $1 and tokens.displayable and not tokens.deleted and not tm.deleted;

-- name: GetTokenByIdBatch :batchone
select * from tokens where id = $1 and displayable and deleted = false;

Expand Down
66 changes: 62 additions & 4 deletions service/notifications/notifications.go
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,7 @@ type pushLimiter struct {
comments *limiters.KeyRateLimiter
admires *limiters.KeyRateLimiter
follows *limiters.KeyRateLimiter
tokens *limiters.KeyRateLimiter
}

func newPushLimiter() *pushLimiter {
Expand All @@ -57,6 +58,7 @@ func newPushLimiter() *pushLimiter {
comments: limiters.NewKeyRateLimiter(ctx, cache, "comments", 5, time.Minute),
admires: limiters.NewKeyRateLimiter(ctx, cache, "admires", 1, time.Minute*10),
follows: limiters.NewKeyRateLimiter(ctx, cache, "follows", 1, time.Minute*10),
tokens: limiters.NewKeyRateLimiter(ctx, cache, "tokens", 1, time.Minute*10),
}
}

Expand Down Expand Up @@ -101,6 +103,18 @@ func (p *pushLimiter) tryFollow(ctx context.Context, sendingUserID persist.DBID,
}
}

func (p *pushLimiter) tryTokens(ctx context.Context, sendingUserID persist.DBID, tokenID persist.DBID) error {
key := fmt.Sprintf("%s:%s", sendingUserID, tokenID)
if p.isActionAllowed(ctx, p.tokens, key) {
return nil
}

return errRateLimited{
limiterName: p.follows.Name(),
senderID: sendingUserID,
}
}

func (p *pushLimiter) isActionAllowed(ctx context.Context, limiter *limiters.KeyRateLimiter, key string) bool {
canContinue, _, err := limiter.ForKey(ctx, key)
if err != nil {
Expand Down Expand Up @@ -493,7 +507,7 @@ func createPushMessage(ctx context.Context, notif db.Notification, queries *db.Q
},
}

if notif.Action == persist.ActionAdmiredFeedEvent {
if notif.Action == persist.ActionAdmiredFeedEvent || notif.Action == persist.ActionAdmiredPost {
admirer, err := queries.GetUserById(ctx, notif.Data.AdmirerIDs[0])
if err != nil {
return task.PushNotificationMessage{}, err
Expand All @@ -507,11 +521,16 @@ func createPushMessage(ctx context.Context, notif db.Notification, queries *db.Q
return task.PushNotificationMessage{}, fmt.Errorf("user with ID=%s has no username", admirer.ID)
}

message.Body = fmt.Sprintf("%s admired your activity", admirer.Username.String)
ac := "activity"
if notif.Action == persist.ActionAdmiredPost {
ac = "post"
}

message.Body = fmt.Sprintf("%s admired your %s", admirer.Username.String, ac)
return message, nil
}

if notif.Action == persist.ActionCommentedOnFeedEvent {
if notif.Action == persist.ActionCommentedOnFeedEvent || notif.Action == persist.ActionCommentedOnPost {
comment, err := queries.GetCommentByCommentID(ctx, notif.CommentID)
if err != nil {
return task.PushNotificationMessage{}, err
Expand All @@ -530,7 +549,12 @@ func createPushMessage(ctx context.Context, notif db.Notification, queries *db.Q
return task.PushNotificationMessage{}, fmt.Errorf("user with ID=%s has no username", commenter.ID)
}

message.Body = fmt.Sprintf("%s commented on your activity", commenter.Username.String)
ac := "activity"
if notif.Action == persist.ActionCommentedOnPost {
ac = "post"
}

message.Body = fmt.Sprintf("%s commented on your %s", commenter.Username.String, ac)
return message, nil
}

Expand Down Expand Up @@ -558,6 +582,34 @@ func createPushMessage(ctx context.Context, notif db.Notification, queries *db.Q
message.Body = body
return message, nil
}
if notif.Action == persist.ActionNewTokensReceived {

tm, err := queries.GetTokenMediaByTokenId(ctx, notif.Data.NewTokenID)
if err != nil {
return task.PushNotificationMessage{}, err
}
name := tm.Name
if name == "" {
to, err := queries.GetTokenById(ctx, notif.Data.NewTokenID)
if err != nil {
return task.PushNotificationMessage{}, err
}
name = to.Name.String
}

name = util.TruncateWithEllipsis(name, 20)

if err := limiter.tryTokens(ctx, notif.OwnerID, notif.Data.NewTokenID); err != nil {
return task.PushNotificationMessage{}, err
}
amount := notif.Data.NewTokenQuantity
i := amount.BigInt().Uint64()
if i > 1 {
message.Body = fmt.Sprintf("You received %d new %s tokens", i, name)
} else {
message.Body = fmt.Sprintf("You received a new %s token", name)
}
}

return task.PushNotificationMessage{}, fmt.Errorf("unsupported notification action: %s", notif.Action)
}
Expand All @@ -570,6 +622,12 @@ func actionSupportsPushNotifications(action persist.Action) bool {
return true
case persist.ActionUserFollowedUsers:
return true
case persist.ActionNewTokensReceived:
return true
case persist.ActionCommentedOnPost:
return true
case persist.ActionAdmiredPost:
return true
default:
return false
}
Expand Down

0 comments on commit de5376c

Please sign in to comment.