♻️ Improved the notification subscriber API
This commit is contained in:
		
							
								
								
									
										9
									
								
								.idea/workspace.xml
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										9
									
								
								.idea/workspace.xml
									
									
									
										generated
									
									
									
								
							@@ -4,10 +4,10 @@
 | 
			
		||||
    <option name="autoReloadType" value="ALL" />
 | 
			
		||||
  </component>
 | 
			
		||||
  <component name="ChangeListManager">
 | 
			
		||||
    <list default="true" id="3fefb2c4-b6f9-466b-a523-53352e8d6f95" name="更改" comment=":bug: Fix new realm owner missing permissions">
 | 
			
		||||
    <list default="true" id="3fefb2c4-b6f9-466b-a523-53352e8d6f95" name="更改" comment=":zap: Use map to improve message delivery time">
 | 
			
		||||
      <change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
 | 
			
		||||
      <change beforePath="$PROJECT_DIR$/pkg/server/notify_ws.go" beforeDir="false" afterPath="$PROJECT_DIR$/pkg/server/notify_ws.go" afterDir="false" />
 | 
			
		||||
      <change beforePath="$PROJECT_DIR$/pkg/services/connections.go" beforeDir="false" afterPath="$PROJECT_DIR$/pkg/services/connections.go" afterDir="false" />
 | 
			
		||||
      <change beforePath="$PROJECT_DIR$/pkg/models/notifications.go" beforeDir="false" afterPath="$PROJECT_DIR$/pkg/models/notifications.go" afterDir="false" />
 | 
			
		||||
      <change beforePath="$PROJECT_DIR$/pkg/server/notifications_api.go" beforeDir="false" afterPath="$PROJECT_DIR$/pkg/server/notifications_api.go" afterDir="false" />
 | 
			
		||||
      <change beforePath="$PROJECT_DIR$/pkg/services/notifications.go" beforeDir="false" afterPath="$PROJECT_DIR$/pkg/services/notifications.go" afterDir="false" />
 | 
			
		||||
    </list>
 | 
			
		||||
    <option name="SHOW_DIALOG" value="false" />
 | 
			
		||||
@@ -151,7 +151,8 @@
 | 
			
		||||
    <MESSAGE value=":bug: Bug fixes on realm missing member on creation" />
 | 
			
		||||
    <MESSAGE value=":bug: Dumb man make dumb mistake again" />
 | 
			
		||||
    <MESSAGE value=":bug: Fix new realm owner missing permissions" />
 | 
			
		||||
    <option name="LAST_COMMIT_MESSAGE" value=":bug: Fix new realm owner missing permissions" />
 | 
			
		||||
    <MESSAGE value=":zap: Use map to improve message delivery time" />
 | 
			
		||||
    <option name="LAST_COMMIT_MESSAGE" value=":zap: Use map to improve message delivery time" />
 | 
			
		||||
  </component>
 | 
			
		||||
  <component name="VgoProject">
 | 
			
		||||
    <settings-migrated>true</settings-migrated>
 | 
			
		||||
 
 | 
			
		||||
@@ -31,8 +31,9 @@ const (
 | 
			
		||||
type NotificationSubscriber struct {
 | 
			
		||||
	BaseModel
 | 
			
		||||
 | 
			
		||||
	UserAgent string `json:"user_agent"`
 | 
			
		||||
	Provider  string `json:"provider"`
 | 
			
		||||
	DeviceID  string `json:"device_id" gorm:"uniqueIndex"`
 | 
			
		||||
	AccountID uint   `json:"account_id"`
 | 
			
		||||
	UserAgent   string `json:"user_agent"`
 | 
			
		||||
	Provider    string `json:"provider"`
 | 
			
		||||
	DeviceID    string `json:"device_id" gorm:"uniqueIndex"`
 | 
			
		||||
	DeviceToken string `json:"device_token"`
 | 
			
		||||
	AccountID   uint   `json:"account_id"`
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -89,8 +89,9 @@ func addNotifySubscriber(c *fiber.Ctx) error {
 | 
			
		||||
	user := c.Locals("principal").(models.Account)
 | 
			
		||||
 | 
			
		||||
	var data struct {
 | 
			
		||||
		Provider string `json:"provider" validate:"required"`
 | 
			
		||||
		DeviceID string `json:"device_id" validate:"required"`
 | 
			
		||||
		Provider    string `json:"provider" validate:"required"`
 | 
			
		||||
		DeviceToken string `json:"device_token" validate:"required"`
 | 
			
		||||
		DeviceID    string `json:"device_id" validate:"required"`
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if err := utils.BindAndValidate(c, &data); err != nil {
 | 
			
		||||
@@ -99,8 +100,9 @@ func addNotifySubscriber(c *fiber.Ctx) error {
 | 
			
		||||
 | 
			
		||||
	var count int64
 | 
			
		||||
	if err := database.C.Where(&models.NotificationSubscriber{
 | 
			
		||||
		DeviceID:  data.DeviceID,
 | 
			
		||||
		AccountID: user.ID,
 | 
			
		||||
		DeviceID:    data.DeviceID,
 | 
			
		||||
		DeviceToken: data.DeviceToken,
 | 
			
		||||
		AccountID:   user.ID,
 | 
			
		||||
	}).Model(&models.NotificationSubscriber{}).Count(&count).Error; err != nil || count > 0 {
 | 
			
		||||
		return c.SendStatus(fiber.StatusOK)
 | 
			
		||||
	}
 | 
			
		||||
@@ -109,6 +111,7 @@ func addNotifySubscriber(c *fiber.Ctx) error {
 | 
			
		||||
		user,
 | 
			
		||||
		data.Provider,
 | 
			
		||||
		data.DeviceID,
 | 
			
		||||
		data.DeviceToken,
 | 
			
		||||
		c.Get(fiber.HeaderUserAgent),
 | 
			
		||||
	)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
 
 | 
			
		||||
@@ -3,6 +3,7 @@ package services
 | 
			
		||||
import (
 | 
			
		||||
	"context"
 | 
			
		||||
	jsoniter "github.com/json-iterator/go"
 | 
			
		||||
	"reflect"
 | 
			
		||||
 | 
			
		||||
	"firebase.google.com/go/messaging"
 | 
			
		||||
	"git.solsynth.dev/hydrogen/passport/pkg/database"
 | 
			
		||||
@@ -11,15 +12,32 @@ import (
 | 
			
		||||
	"github.com/rs/zerolog/log"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func AddNotifySubscriber(user models.Account, provider, device, ua string) (models.NotificationSubscriber, error) {
 | 
			
		||||
	subscriber := models.NotificationSubscriber{
 | 
			
		||||
		UserAgent: ua,
 | 
			
		||||
		Provider:  provider,
 | 
			
		||||
		DeviceID:  device,
 | 
			
		||||
func AddNotifySubscriber(user models.Account, provider, id, tk, ua string) (models.NotificationSubscriber, error) {
 | 
			
		||||
	var prev models.NotificationSubscriber
 | 
			
		||||
	var subscriber models.NotificationSubscriber
 | 
			
		||||
	if err := database.C.Where(&models.NotificationSubscriber{
 | 
			
		||||
		DeviceID:  id,
 | 
			
		||||
		AccountID: user.ID,
 | 
			
		||||
	}); err != nil {
 | 
			
		||||
		subscriber = models.NotificationSubscriber{
 | 
			
		||||
			UserAgent:   ua,
 | 
			
		||||
			Provider:    provider,
 | 
			
		||||
			DeviceID:    id,
 | 
			
		||||
			DeviceToken: tk,
 | 
			
		||||
			AccountID:   user.ID,
 | 
			
		||||
		}
 | 
			
		||||
	} else {
 | 
			
		||||
		prev = subscriber
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	err := database.C.Save(&subscriber).Error
 | 
			
		||||
	subscriber.UserAgent = ua
 | 
			
		||||
	subscriber.Provider = provider
 | 
			
		||||
	subscriber.DeviceToken = tk
 | 
			
		||||
 | 
			
		||||
	var err error
 | 
			
		||||
	if !reflect.DeepEqual(subscriber, prev) {
 | 
			
		||||
		err = database.C.Save(&subscriber).Error
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return subscriber, err
 | 
			
		||||
}
 | 
			
		||||
@@ -72,7 +90,7 @@ func PushNotification(notification models.Notification) error {
 | 
			
		||||
					Title: notification.Subject,
 | 
			
		||||
					Body:  notification.Content,
 | 
			
		||||
				},
 | 
			
		||||
				Token: subscriber.DeviceID,
 | 
			
		||||
				Token: subscriber.DeviceToken,
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			if response, err := client.Send(ctx, message); err != nil {
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user