status-go/notifications/push/fcm/notification.go

56 lines
1.6 KiB
Go

package fcm
import (
"encoding/json"
"fmt"
"github.com/NaySoftware/go-fcm"
)
// Notifier manages Push Notifications.
type Notifier interface {
Send(dataPayloadJSON string, tokens ...string) error
}
// NotificationConstructor returns constructor of configured instance Notifier interface.
type NotificationConstructor func() Notifier
// Notification represents messaging provider for notifications.
type Notification struct {
client FirebaseClient
}
// NewNotification Firebase Cloud Messaging client constructor.
func NewNotification(key string) NotificationConstructor {
return func() Notifier {
client := fcm.NewFcmClient(key).
SetDelayWhileIdle(true).
SetContentAvailable(true).
SetPriority(fcm.Priority_HIGH). // Message needs to be marked as high-priority so that background task in an Android's recipient device can be invoked (https://github.com/invertase/react-native-firebase/blob/d13f0af53f1c8f20db8bc8d4b6f8c6d210e108b9/android/src/main/java/io/invertase/firebase/messaging/RNFirebaseMessagingService.java#L56)
SetTimeToLive(fcm.MAX_TTL)
return &Notification{client}
}
}
// Send sends a push notification to the tokens list.
func (n *Notification) Send(dataPayloadJSON string, tokens ...string) error {
var dataPayload map[string]string
err := json.Unmarshal([]byte(dataPayloadJSON), &dataPayload)
if err != nil {
return err
}
n.client.NewFcmRegIdsMsg(tokens, dataPayload)
resp, err := n.client.Send()
if err != nil {
return err
}
if resp != nil && !resp.Ok {
return fmt.Errorf("FCM error sending message, code=%d err=%s", resp.StatusCode, resp.Err)
}
return nil
}