using FabApprovalWorkerService.Models; using FabApprovalWorkerService.Services; using Quartz; using System.Net.Mail; using System.Text; namespace FabApprovalWorkerService.Workers; public class ExpiringTECNWorker : IJob { private readonly ILogger _logger; private readonly IMonInWorkerClient _monInClient; private readonly IUserService _userService; private readonly IECNService _ecnService; private readonly ISmtpService _smtpService; public ExpiringTECNWorker(ILogger logger, IMonInWorkerClient monInClient, IUserService userService, IECNService ecnService, ISmtpService smtpService) { _logger = logger ?? throw new ArgumentNullException("ILogger not injected"); _monInClient = monInClient ?? throw new ArgumentNullException("IMonInWorkerClient not injected"); _userService = userService ?? throw new ArgumentNullException("IUserService not injected"); _ecnService = ecnService ?? throw new ArgumentNullException("IECNService not injected"); _smtpService = smtpService ?? throw new ArgumentNullException("ISmtpService not injected"); } public async Task Execute(IJobExecutionContext context) { DateTime start = DateTime.Now; bool isInternalError = false; StringBuilder errorMessage = new(); string metricName = "ExpiringTECNWorker"; try { _logger.LogInformation("Attempting to notify users of expiring TECNs"); IEnumerable expiringTECNs = await _ecnService.GetExpiringTECNs(); _logger.LogInformation($"There are {expiringTECNs.Count()} TECNs expiring in the next 5 days"); foreach (ECN eCN in expiringTECNs) { string recipientEmail = await _userService.GetUserEmail(eCN.OriginatorID); MailAddress recipientAddress = new MailAddress(recipientEmail); List recipientList = new () { recipientAddress }; IEnumerable tecnNotificationUserEmails = await _ecnService.GetTECNNotificationUserEmails(); List ccRecipientList = new(); foreach (string email in tecnNotificationUserEmails) { ccRecipientList.Add(new MailAddress(email)); } StringBuilder bodyBuilder = new(); bodyBuilder.Append($"Good day, TECN# {eCN.ECNNumber} will be expire on "); bodyBuilder.Append($"{eCN.ExpirationDate.ToString("MMMM dd, yyyy")}. "); bodyBuilder.Append($"
Review TECN "); bodyBuilder.Append("here "); string subject = $"Notice of expiring TECN - {eCN.Title}"; await _smtpService.SendEmail(recipientList, ccRecipientList, subject, bodyBuilder.ToString()); } } catch (Exception ex) { StringBuilder errMsgBuilder = new(); errMsgBuilder.Append("An exception occurred when attempting to notify users of expiring TECNs. "); errMsgBuilder.Append($"Exception: {ex.Message}"); _logger.LogError(errMsgBuilder.ToString()); isInternalError = true; } finally { DateTime end = DateTime.Now; double latencyInMS = (end - start).TotalMilliseconds; _monInClient.PostAverage(metricName + "Latency", latencyInMS); if (isInternalError) { _monInClient.PostStatus(metricName, StatusValue.Critical); } else { _monInClient.PostStatus(metricName, StatusValue.Ok); } } } }