🐛 Trying to prevent send same notification to the same user in batch
This commit is contained in:
		
							
								
								
									
										14
									
								
								.idea/workspace.xml
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										14
									
								
								.idea/workspace.xml
									
									
									
										generated
									
									
									
								
							| @@ -4,15 +4,9 @@ | |||||||
|     <option name="autoReloadType" value="ALL" /> |     <option name="autoReloadType" value="ALL" /> | ||||||
|   </component> |   </component> | ||||||
|   <component name="ChangeListManager"> |   <component name="ChangeListManager"> | ||||||
|     <list default="true" id="3fefb2c4-b6f9-466b-a523-53352e8d6f95" name="更改" comment=":sparkles: Auth config to limit auth steps"> |     <list default="true" id="3fefb2c4-b6f9-466b-a523-53352e8d6f95" name="更改" comment=":recycle: Single table to store auth preferences"> | ||||||
|       <change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" /> |       <change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" /> | ||||||
|       <change beforePath="$PROJECT_DIR$/pkg/internal/database/migrator.go" beforeDir="false" afterPath="$PROJECT_DIR$/pkg/internal/database/migrator.go" afterDir="false" /> |       <change beforePath="$PROJECT_DIR$/pkg/internal/grpc/notifier.go" beforeDir="false" afterPath="$PROJECT_DIR$/pkg/internal/grpc/notifier.go" afterDir="false" /> | ||||||
|       <change beforePath="$PROJECT_DIR$/pkg/internal/models/accounts.go" beforeDir="false" afterPath="$PROJECT_DIR$/pkg/internal/models/accounts.go" afterDir="false" /> |  | ||||||
|       <change beforePath="$PROJECT_DIR$/pkg/internal/models/preferences.go" beforeDir="false" afterPath="$PROJECT_DIR$/pkg/internal/models/preferences.go" afterDir="false" /> |  | ||||||
|       <change beforePath="$PROJECT_DIR$/pkg/internal/server/api/index.go" beforeDir="false" afterPath="$PROJECT_DIR$/pkg/internal/server/api/index.go" afterDir="false" /> |  | ||||||
|       <change beforePath="$PROJECT_DIR$/pkg/internal/server/api/preferences_api.go" beforeDir="false" afterPath="$PROJECT_DIR$/pkg/internal/server/api/preferences_api.go" afterDir="false" /> |  | ||||||
|       <change beforePath="$PROJECT_DIR$/pkg/internal/services/preferences.go" beforeDir="false" afterPath="$PROJECT_DIR$/pkg/internal/services/preferences.go" afterDir="false" /> |  | ||||||
|       <change beforePath="$PROJECT_DIR$/pkg/internal/services/ticket.go" beforeDir="false" afterPath="$PROJECT_DIR$/pkg/internal/services/ticket.go" afterDir="false" /> |  | ||||||
|     </list> |     </list> | ||||||
|     <option name="SHOW_DIALOG" value="false" /> |     <option name="SHOW_DIALOG" value="false" /> | ||||||
|     <option name="HIGHLIGHT_CONFLICTS" value="true" /> |     <option name="HIGHLIGHT_CONFLICTS" value="true" /> | ||||||
| @@ -159,7 +153,6 @@ | |||||||
|     </option> |     </option> | ||||||
|   </component> |   </component> | ||||||
|   <component name="VcsManagerConfiguration"> |   <component name="VcsManagerConfiguration"> | ||||||
|     <MESSAGE value=":sparkles: Bots aka. automated accounts" /> |  | ||||||
|     <MESSAGE value=":sparkles: Return affiliated to and automated by in userinfo grpc call" /> |     <MESSAGE value=":sparkles: Return affiliated to and automated by in userinfo grpc call" /> | ||||||
|     <MESSAGE value=":sparkles: Pagination bots api" /> |     <MESSAGE value=":sparkles: Pagination bots api" /> | ||||||
|     <MESSAGE value=":bug: Fix query issue" /> |     <MESSAGE value=":bug: Fix query issue" /> | ||||||
| @@ -184,7 +177,8 @@ | |||||||
|     <MESSAGE value=":sparkles: Realm avatar, banner and access policy" /> |     <MESSAGE value=":sparkles: Realm avatar, banner and access policy" /> | ||||||
|     <MESSAGE value=":sparkles: Account deletion" /> |     <MESSAGE value=":sparkles: Account deletion" /> | ||||||
|     <MESSAGE value=":sparkles: Auth config to limit auth steps" /> |     <MESSAGE value=":sparkles: Auth config to limit auth steps" /> | ||||||
|     <option name="LAST_COMMIT_MESSAGE" value=":sparkles: Auth config to limit auth steps" /> |     <MESSAGE value=":recycle: Single table to store auth preferences" /> | ||||||
|  |     <option name="LAST_COMMIT_MESSAGE" value=":recycle: Single table to store auth preferences" /> | ||||||
|   </component> |   </component> | ||||||
|   <component name="VgoProject"> |   <component name="VgoProject"> | ||||||
|     <settings-migrated>true</settings-migrated> |     <settings-migrated>true</settings-migrated> | ||||||
|   | |||||||
| @@ -3,6 +3,7 @@ package grpc | |||||||
| import ( | import ( | ||||||
| 	"context" | 	"context" | ||||||
| 	"fmt" | 	"fmt" | ||||||
|  | 	"github.com/rs/zerolog/log" | ||||||
|  |  | ||||||
| 	"git.solsynth.dev/hydrogen/passport/pkg/internal/database" | 	"git.solsynth.dev/hydrogen/passport/pkg/internal/database" | ||||||
| 	jsoniter "github.com/json-iterator/go" | 	jsoniter "github.com/json-iterator/go" | ||||||
| @@ -37,6 +38,8 @@ func (v *Server) NotifyUser(_ context.Context, in *proto.NotifyUserRequest) (*pr | |||||||
| 		AccountID:   user.ID, | 		AccountID:   user.ID, | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|  | 	log.Debug().Str("topic", notification.Topic).Uint("uid", notification.AccountID).Msg("Notifying user...") | ||||||
|  |  | ||||||
| 	if notification.IsRealtime { | 	if notification.IsRealtime { | ||||||
| 		if err := services.PushNotification(notification); err != nil { | 		if err := services.PushNotification(notification); err != nil { | ||||||
| 			return nil, err | 			return nil, err | ||||||
| @@ -64,8 +67,13 @@ func (v *Server) NotifyUserBatch(_ context.Context, in *proto.NotifyUserBatchReq | |||||||
| 	var metadata map[string]any | 	var metadata map[string]any | ||||||
| 	_ = jsoniter.Unmarshal(in.GetNotify().GetMetadata(), &metadata) | 	_ = jsoniter.Unmarshal(in.GetNotify().GetMetadata(), &metadata) | ||||||
|  |  | ||||||
|  | 	var checklist = make(map[uint]bool, len(users)) | ||||||
| 	var notifications []models.Notification | 	var notifications []models.Notification | ||||||
| 	for _, user := range users { | 	for _, user := range users { | ||||||
|  | 		if checklist[user.ID] { | ||||||
|  | 			continue | ||||||
|  | 		} | ||||||
|  |  | ||||||
| 		notification := models.Notification{ | 		notification := models.Notification{ | ||||||
| 			Topic:       in.GetNotify().GetTopic(), | 			Topic:       in.GetNotify().GetTopic(), | ||||||
| 			Title:       in.GetNotify().GetTitle(), | 			Title:       in.GetNotify().GetTitle(), | ||||||
| @@ -79,10 +87,13 @@ func (v *Server) NotifyUserBatch(_ context.Context, in *proto.NotifyUserBatchReq | |||||||
| 			Account:     user, | 			Account:     user, | ||||||
| 			AccountID:   user.ID, | 			AccountID:   user.ID, | ||||||
| 		} | 		} | ||||||
|  | 		checklist[user.ID] = true | ||||||
|  |  | ||||||
| 		notifications = append(notifications, notification) | 		notifications = append(notifications, notification) | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|  | 	log.Debug().Str("topic", notifications[0].Topic).Any("uid", lo.Keys(checklist)).Msg("Notifying users...") | ||||||
|  |  | ||||||
| 	if in.GetNotify().GetIsRealtime() { | 	if in.GetNotify().GetIsRealtime() { | ||||||
| 		services.PushNotificationBatch(notifications) | 		services.PushNotificationBatch(notifications) | ||||||
| 	} else { | 	} else { | ||||||
| @@ -105,8 +116,13 @@ func (v *Server) NotifyAllUser(_ context.Context, in *proto.NotifyRequest) (*pro | |||||||
| 	var metadata map[string]any | 	var metadata map[string]any | ||||||
| 	_ = jsoniter.Unmarshal(in.GetMetadata(), &metadata) | 	_ = jsoniter.Unmarshal(in.GetMetadata(), &metadata) | ||||||
|  |  | ||||||
|  | 	var checklist = make(map[uint]bool, len(users)) | ||||||
| 	var notifications []models.Notification | 	var notifications []models.Notification | ||||||
| 	for _, user := range users { | 	for _, user := range users { | ||||||
|  | 		if checklist[user.ID] { | ||||||
|  | 			continue | ||||||
|  | 		} | ||||||
|  |  | ||||||
| 		notification := models.Notification{ | 		notification := models.Notification{ | ||||||
| 			Topic:       in.GetTopic(), | 			Topic:       in.GetTopic(), | ||||||
| 			Title:       in.GetTitle(), | 			Title:       in.GetTitle(), | ||||||
| @@ -120,10 +136,13 @@ func (v *Server) NotifyAllUser(_ context.Context, in *proto.NotifyRequest) (*pro | |||||||
| 			Account:     user, | 			Account:     user, | ||||||
| 			AccountID:   user.ID, | 			AccountID:   user.ID, | ||||||
| 		} | 		} | ||||||
|  | 		checklist[user.ID] = true | ||||||
|  |  | ||||||
| 		notifications = append(notifications, notification) | 		notifications = append(notifications, notification) | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|  | 	log.Debug().Str("topic", notifications[0].Topic).Any("uid", lo.Keys(checklist)).Msg("Notifying users...") | ||||||
|  |  | ||||||
| 	if in.GetIsRealtime() { | 	if in.GetIsRealtime() { | ||||||
| 		services.PushNotificationBatch(notifications) | 		services.PushNotificationBatch(notifications) | ||||||
| 	} else { | 	} else { | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user