fix: resolve duplicate FCM service and add SendMulticast method

This commit is contained in:
GoHorse Deploy 2026-03-07 19:09:34 -03:00
parent 605ed39bfa
commit 6cf03c32e7
2 changed files with 23 additions and 78 deletions

View file

@ -1,78 +0,0 @@
package notifications
import (
"context"
"fmt"
"log"
firebase "firebase.google.com/go/v4"
"firebase.google.com/go/v4/messaging"
"google.golang.org/api/option"
)
type FCMService struct {
app *firebase.App
client *messaging.Client
}
func NewFCMService(serviceAccountJSON []byte) (*FCMService, error) {
ctx := context.Background()
opt := option.WithCredentialsJSON(serviceAccountJSON)
app, err := firebase.NewApp(ctx, nil, opt)
if err != nil {
return nil, fmt.Errorf("error initializing firebase app: %w", err)
}
client, err := app.Messaging(ctx)
if err != nil {
return nil, fmt.Errorf("error getting messaging client: %w", err)
}
return &FCMService{
app: app,
client: client,
}, nil
}
func (s *FCMService) SendPush(ctx context.Context, token, title, body string, data map[string]string) error {
message := &messaging.Message{
Token: token,
Notification: &messaging.Notification{
Title: title,
Body: body,
},
Data: data,
}
response, err := s.client.Send(ctx, message)
if err != nil {
return fmt.Errorf("error sending fcm message: %w", err)
}
log.Printf("Successfully sent fcm message: %s", response)
return nil
}
func (s *FCMService) SendMulticast(ctx context.Context, tokens []string, title, body string, data map[string]string) error {
if len(tokens) == 0 {
return nil
}
message := &messaging.MulticastMessage{
Tokens: tokens,
Notification: &messaging.Notification{
Title: title,
Body: body,
},
Data: data,
}
br, err := s.client.SendEachForMulticast(ctx, message)
if err != nil {
return fmt.Errorf("error sending multicast message: %w", err)
}
log.Printf("Multicast results: %d successes, %d failures", br.SuccessCount, br.FailureCount)
return nil
}

View file

@ -123,6 +123,29 @@ func (s *FCMService) Send(token, title, body string, data map[string]string) err
return s.SendPush(context.Background(), token, title, body, data)
}
func (s *FCMService) SendMulticast(ctx context.Context, tokens []string, title, body string, data map[string]string) error {
if len(tokens) == 0 {
return nil
}
client, err := s.getClient(ctx)
if err != nil {
return err
}
message := &messaging.MulticastMessage{
Tokens: tokens,
Notification: &messaging.Notification{
Title: title,
Body: body,
},
Data: data,
}
_, err = client.SendEachForMulticast(ctx, message)
return err
}
// SubscribeToTopic subscribes a token to a topic
func (s *FCMService) SubscribeToTopic(ctx context.Context, tokens []string, topic string) error {
client, err := s.getClient(ctx)