diff --git a/internal/notification/service.go b/internal/notification/service.go index e14e072..6ee77e6 100644 --- a/internal/notification/service.go +++ b/internal/notification/service.go @@ -99,11 +99,14 @@ func (s *notificationService) Send(ctx context.Context, req *NotificationRequest } func (s *notificationService) sendToRecipient(ctx context.Context, recipient notificationRecipient, req *NotificationRequest, link, image string) { - if err := s.persistNotification(ctx, recipient, req, link, image); err != nil { - s.logger.Error("Failed to persist in-app notification", map[string]interface{}{ - "error": err.Error(), - "user_id": recipient.UserID, - }) + for _, channel := range req.Channels { + if err := s.persistNotification(ctx, recipient, req, link, image, channel); err != nil { + s.logger.Error("Failed to persist notification", map[string]interface{}{ + "error": err.Error(), + "user_id": recipient.UserID, + "channel": channel, + }) + } } metadata := map[string]any{ @@ -149,15 +152,26 @@ func (s *notificationService) sendToRecipient(ctx context.Context, recipient not } } -func (s *notificationService) persistNotification(ctx context.Context, recipient notificationRecipient, req *NotificationRequest, link, image string) error { - methods := map[string]string{ - "in_app": "true", - } - if slices.Contains(req.Channels, DeliveryChannelEmail) && recipient.Email != "" { +func (s *notificationService) persistNotification(ctx context.Context, recipient notificationRecipient, req *NotificationRequest, link, image string, channel DeliveryChannel) error { + methods := map[string]string{} + eventType := string(channel) + + switch channel { + case DeliveryChannelEmail: + if recipient.Email == "" { + return nil + } methods["email"] = recipient.Email - } - if slices.Contains(req.Channels, DeliveryChannelPush) && len(recipient.DeviceTokens) > 0 { + case DeliveryChannelPush: + if len(recipient.DeviceTokens) == 0 { + return nil + } methods["push"] = recipient.DeviceTokens[0] + case DeliveryChannelInApp: + eventType = EventTypeInApp + methods["in_app"] = "true" + default: + return nil } status := string(DeliveryStatusSent) @@ -173,7 +187,7 @@ func (s *notificationService) persistNotification(ctx context.Context, recipient Image: image, Priority: string(req.Priority), Type: string(req.Type), - EventType: EventTypeInApp, + EventType: eventType, Status: status, Methods: methods, Metadata: map[string]any{