using System; using System.Collections.Generic; using System.Threading; using System.Threading.Tasks; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Sozsoft.Notifications.Entities; using Sozsoft.Notifications.Enums; using Sozsoft.Platform.Data.Seeds; using Sozsoft.Sender.Mail; using Sozsoft.Sender.Rocket; using Sozsoft.Sender.Sms; using Sozsoft.Sender.WhatsApp; using Volo.Abp.BackgroundWorkers; using Volo.Abp.Domain.Repositories; using Volo.Abp.Identity; using Volo.Abp.Settings; using Volo.Abp.Uow; namespace Sozsoft.Platform.BackgroundWorkers; public class NotificationWorker : BackgroundWorkerBase { protected IRepository Repository { get; } protected IIdentityUserRepository UserRepository { get; } protected IdentityUserManager IdentityUserManager { get; } protected ISozsoftRocketSender ErpRocketSender { get; } protected ISozsoftEmailSender ErpEmailSender { get; } protected ISozsoftSmsSender ErpSmsSender { get; } protected ISozsoftWhatsAppSender ErpWhatsAppSender { get; } protected ISettingProvider SettingProvider { get; } public NotificationWorker( IRepository repository, IIdentityUserRepository userRepository, IdentityUserManager identityUserManager, ISozsoftSmsSender erpSmsSender, ISozsoftRocketSender erpRocketSender, ISozsoftEmailSender erpEmailSender, ISozsoftWhatsAppSender erpWhatsAppSender, ISettingProvider settingProvider) { Repository = repository; ErpSmsSender = erpSmsSender; UserRepository = userRepository; IdentityUserManager = identityUserManager; ErpRocketSender = erpRocketSender; ErpEmailSender = erpEmailSender; ErpWhatsAppSender = erpWhatsAppSender; SettingProvider = settingProvider; } public override async Task StartAsync(CancellationToken cancellationToken = default) { using var scope = ServiceProvider.CreateScope(); var uowManager = LazyServiceProvider.LazyGetRequiredService(); using var uow = uowManager.Begin(); var sms = await Repository.GetListAsync(a => a.NotificationChannel == NotificationChannels.Sms && !a.IsSent, cancellationToken: cancellationToken); foreach (var notification in sms) { try { var result = await ErpSmsSender.SendAsync(notification.Identifier, notification.Message); if (result.Success) { notification.IsSent = true; notification.IsRead = true; await Repository.UpdateAsync(notification, autoSave: true, cancellationToken: cancellationToken); } } catch (Exception ex) { Logger.LogException(ex); } } var rocket = await Repository.GetListAsync(a => a.NotificationChannel == NotificationChannels.Rocket && !a.IsSent, cancellationToken: cancellationToken); foreach (var notification in rocket) { try { var result = await ErpRocketSender.SendAsync(notification.Identifier, notification.Message); if (result.Success) { notification.IsSent = true; notification.IsRead = true; await Repository.UpdateAsync(notification, autoSave: true, cancellationToken: cancellationToken); } } catch (Exception ex) { Logger.LogException(ex); } } var mail = await Repository.GetListAsync(a => a.NotificationChannel == NotificationChannels.Mail && !a.IsSent, cancellationToken: cancellationToken); var senderName = await SettingProvider.GetOrNullAsync(SeedConsts.AbpSettings.Mailing.Default.DefaultFromDisplayName); var senderEmail = await SettingProvider.GetOrNullAsync(SeedConsts.AbpSettings.Mailing.Default.DefaultFromAddress); foreach (var notification in mail) { try { var result = await ErpEmailSender.SendEmailAsync( notification.Identifier, new KeyValuePair(senderName, senderEmail), new { }, notification.Message, $"Platform Bildirim: {notification.NotificationType}"); if (result.Success) { notification.IsSent = true; notification.IsRead = true; await Repository.UpdateAsync(notification, autoSave: true, cancellationToken: cancellationToken); } } catch (Exception ex) { Logger.LogException(ex); } } var whatsapp = await Repository.GetListAsync(a => a.NotificationChannel == NotificationChannels.WhatsApp && !a.IsSent, cancellationToken: cancellationToken); foreach (var notification in whatsapp) { try { var result = await ErpWhatsAppSender.SendAsync(notification.Identifier, notification.Message); if (result.Success) { notification.IsSent = true; notification.IsRead = true; await Repository.UpdateAsync(notification, autoSave: true, cancellationToken: cancellationToken); } } catch (Exception ex) { Logger.LogException(ex); } } await uow.SaveChangesAsync(cancellationToken); } }