SimpleCloudNotifier/server/firebase/firebase.go
2022-11-19 15:11:36 +01:00

75 lines
1.5 KiB
Go

package firebase
import (
"context"
_ "embed"
fb "firebase.google.com/go"
"firebase.google.com/go/messaging"
"github.com/rs/zerolog/log"
"google.golang.org/api/option"
)
//go:embed scnserviceaccountkey.json
var scnserviceaccountkey []byte
type App struct {
app *fb.App
messaging *messaging.Client
}
func NewFirebaseApp() App {
opt := option.WithCredentialsJSON(scnserviceaccountkey)
app, err := fb.NewApp(context.Background(), nil, opt)
if err != nil {
log.Error().Err(err).Msg("failed to init firebase app")
}
msg, err := app.Messaging(context.Background())
if err != nil {
log.Error().Err(err).Msg("failed to init messaging client")
}
log.Info().Msg("Initialized Firebase")
return App{
app: app,
messaging: msg,
}
}
type Notification struct {
Id string
Token string
Platform string
Title string
Body string
Priority int
}
func (fb App) SendNotification(ctx context.Context, notification Notification) (string, error) {
n := messaging.Message{
Data: map[string]string{"scn_msg_id": notification.Id},
Notification: &messaging.Notification{
Title: notification.Title,
Body: notification.Body,
},
Android: nil,
APNS: nil,
Webpush: nil,
FCMOptions: nil,
Token: notification.Token,
Topic: "",
Condition: "",
}
if notification.Platform == "ios" {
n.APNS = nil
}
if notification.Platform == "android" {
n.Android = nil
}
res, err := fb.messaging.Send(ctx, &n)
if err != nil {
log.Error().Err(err).Msg("failed to send push")
}
return res, err
}