using FirebaseAdmin; using FirebaseAdmin.Messaging; using Google.Apis.Auth.OAuth2; using Hangfire; using Manager.Services; using ManagerService.Data; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using System; using System.Linq; using System.Threading.Tasks; namespace ManagerService.Services { public class NotificationService { private readonly ILogger _logger; private readonly IServiceScopeFactory _scopeFactory; public NotificationService(ILogger logger, IServiceScopeFactory scopeFactory) { _logger = logger; _scopeFactory = scopeFactory; } public async Task SendToTopicAsync(string notificationId) { using var scope = _scopeFactory.CreateScope(); var db = scope.ServiceProvider.GetRequiredService(); IHexIdGeneratorService idService = new HexIdGeneratorService(); var notification = await db.PushNotifications.FirstOrDefaultAsync(n => n.Id == notificationId); if (notification == null) { _logger.LogWarning("Notification {Id} not found", notificationId); return; } try { var message = new Message { Topic = notification.Topic, Notification = new Notification { Title = notification.Title, Body = notification.Body } }; await FirebaseMessaging.DefaultInstance.SendAsync(message); notification.Status = PushNotificationStatus.Sent; notification.SentAt = DateTime.UtcNow; } catch (Exception ex) { _logger.LogError(ex, "Failed to send notification {Id}", notificationId); notification.Status = PushNotificationStatus.Failed; } await db.SaveChangesAsync(); } } }