From b153ef5ea55fe13990fc30b762728ae62089a470 Mon Sep 17 00:00:00 2001 From: "DESKTOP-GENO133\\IvanPlex" Date: Wed, 24 Jan 2024 21:43:26 -0700 Subject: [PATCH] added more mileage intervals and api endpoint to send out reminder emails. --- Controllers/APIController.cs | 54 +++++++++++++++++++++++ Enum/ReminderMileageInterval.cs | 2 + Helper/MailHelper.cs | 47 +++++++++++++++++++- Views/Vehicle/_ReminderRecordModal.cshtml | 2 + 4 files changed, 103 insertions(+), 2 deletions(-) diff --git a/Controllers/APIController.cs b/Controllers/APIController.cs index 4c008cd..3c05161 100644 --- a/Controllers/APIController.cs +++ b/Controllers/APIController.cs @@ -22,10 +22,13 @@ namespace CarCareTracker.Controllers private readonly IReminderRecordDataAccess _reminderRecordDataAccess; private readonly IUpgradeRecordDataAccess _upgradeRecordDataAccess; private readonly IOdometerRecordDataAccess _odometerRecordDataAccess; + private readonly IUserAccessDataAccess _userAccessDataAccess; + private readonly IUserRecordDataAccess _userRecordDataAccess; private readonly IReminderHelper _reminderHelper; private readonly IGasHelper _gasHelper; private readonly IUserLogic _userLogic; private readonly IFileHelper _fileHelper; + private readonly IMailHelper _mailHelper; public APIController(IVehicleDataAccess dataAccess, IGasHelper gasHelper, IReminderHelper reminderHelper, @@ -37,6 +40,9 @@ namespace CarCareTracker.Controllers IReminderRecordDataAccess reminderRecordDataAccess, IUpgradeRecordDataAccess upgradeRecordDataAccess, IOdometerRecordDataAccess odometerRecordDataAccess, + IUserAccessDataAccess userAccessDataAccess, + IUserRecordDataAccess userRecordDataAccess, + IMailHelper mailHelper, IFileHelper fileHelper, IUserLogic userLogic) { @@ -49,6 +55,9 @@ namespace CarCareTracker.Controllers _reminderRecordDataAccess = reminderRecordDataAccess; _upgradeRecordDataAccess = upgradeRecordDataAccess; _odometerRecordDataAccess = odometerRecordDataAccess; + _userAccessDataAccess = userAccessDataAccess; + _userRecordDataAccess = userRecordDataAccess; + _mailHelper = mailHelper; _gasHelper = gasHelper; _reminderHelper = reminderHelper; _userLogic = userLogic; @@ -428,6 +437,51 @@ namespace CarCareTracker.Controllers } [Authorize(Roles = nameof(UserData.IsRootUser))] [HttpGet] + [Route("/api/vehicle/reminders/send")] + public IActionResult SendReminders(List urgencies) + { + var vehicles = _dataAccess.GetVehicles(); + List operationResponses = new List(); + foreach(Vehicle vehicle in vehicles) + { + var vehicleId = vehicle.Id; + //get reminders + var currentMileage = GetMaxMileage(vehicleId); + var reminders = _reminderRecordDataAccess.GetReminderRecordsByVehicleId(vehicleId); + var results = _reminderHelper.GetReminderRecordViewModels(reminders, currentMileage, DateTime.Now).OrderByDescending(x => x.Urgency).ToList(); + results.RemoveAll(x => !urgencies.Contains(x.Urgency)); + if (!results.Any()) + { + return Json(new OperationResponse { Success = false, Message = "No reminders could be found with those parameters" }); + } + //get list of recipients. + var userIds = _userAccessDataAccess.GetUserAccessByVehicleId(vehicleId).Select(x => x.Id.UserId); + List emailRecipients = new List(); + foreach (int userId in userIds) + { + var userData = _userRecordDataAccess.GetUserRecordById(userId); + emailRecipients.Add(userData.EmailAddress); + }; + if (!emailRecipients.Any()) + { + return Json(new OperationResponse { Success = false, Message = "No recipients could be found with those parameters" }); + } + var result = _mailHelper.NotifyUserForReminders(emailRecipients, results); + operationResponses.Add(result); + } + if (operationResponses.All(x => x.Success)) + { + return Json(new OperationResponse { Success = true, Message = "Emails sent" }); + } else if (operationResponses.All(x => !x.Success)) + { + return Json(new OperationResponse { Success = false, Message = "All emails failed, check SMTP settings" }); + } else + { + return Json(new OperationResponse { Success = true, Message = "Some emails sent, some failed, check recipient settings" }); + } + } + [Authorize(Roles = nameof(UserData.IsRootUser))] + [HttpGet] [Route("/api/makebackup")] public IActionResult MakeBackup() { diff --git a/Enum/ReminderMileageInterval.cs b/Enum/ReminderMileageInterval.cs index 50ba696..824664c 100644 --- a/Enum/ReminderMileageInterval.cs +++ b/Enum/ReminderMileageInterval.cs @@ -14,7 +14,9 @@ FifteenThousandMiles = 15000, TwentyThousandMiles = 20000, ThirtyThousandMiles = 30000, + FortyThousandMiles = 40000, FiftyThousandMiles = 50000, + SixtyThousandMiles = 60000, OneHundredThousandMiles = 100000, OneHundredFiftyThousandMiles = 150000 } diff --git a/Helper/MailHelper.cs b/Helper/MailHelper.cs index 6915f1d..fc6b9fb 100644 --- a/Helper/MailHelper.cs +++ b/Helper/MailHelper.cs @@ -8,6 +8,7 @@ namespace CarCareTracker.Helper { OperationResponse NotifyUserForRegistration(string emailAddress, string token); OperationResponse NotifyUserForPasswordReset(string emailAddress, string token); + OperationResponse NotifyUserForReminders(List emailAddresses, List reminders); } public class MailHelper : IMailHelper { @@ -60,20 +61,62 @@ namespace CarCareTracker.Helper return new OperationResponse { Success = false, Message = StaticHelper.GenericErrorMessage }; } } - private bool SendEmail(string emailTo, string emailSubject, string emailBody) { + public OperationResponse NotifyUserForReminders(List emailAddresses, List reminders) + { + if (string.IsNullOrWhiteSpace(mailConfig.EmailServer)) + { + return new OperationResponse { Success = false, Message = "SMTP Server Not Setup" }; + } + if (!emailAddresses.Any()) + { + return new OperationResponse { Success = false, Message = "No recipients could be found" }; + } + if (!reminders.Any()) + { + return new OperationResponse { Success = false, Message = "No reminders could be found" }; + } + string emailSubject = $"Vehicle Reminders From LubeLogger - {DateTime.Now.ToShortDateString()}"; + //construct html table. + string emailBody = ""; + foreach(ReminderRecordViewModel reminder in reminders) + { + emailBody += $""; + } + emailBody += "
UrgencyDescription
{reminder.Urgency}{reminder.Description}
"; + try + { + foreach (string emailAddress in emailAddresses) + { + SendEmail(emailAddress, emailSubject, emailBody, true, true); + } + return new OperationResponse { Success = true, Message = "Email Sent!" }; + } catch (Exception ex) + { + return new OperationResponse { Success = false, Message = ex.Message }; + } + } + private bool SendEmail(string emailTo, string emailSubject, string emailBody, bool isBodyHtml = false, bool useAsync = false) { string to = emailTo; string from = mailConfig.EmailFrom; var server = mailConfig.EmailServer; MailMessage message = new MailMessage(from, to); message.Subject = emailSubject; message.Body = emailBody; + message.IsBodyHtml = isBodyHtml; SmtpClient client = new SmtpClient(server); client.EnableSsl = mailConfig.UseSSL; client.Port = mailConfig.Port; client.Credentials = new NetworkCredential(mailConfig.Username, mailConfig.Password); try { - client.Send(message); + if (useAsync) + { + client.SendMailAsync(message, new CancellationToken()); + } + else + { + client.Send(message); + } return true; } catch (Exception ex) diff --git a/Views/Vehicle/_ReminderRecordModal.cshtml b/Views/Vehicle/_ReminderRecordModal.cshtml index f38fa22..a630939 100644 --- a/Views/Vehicle/_ReminderRecordModal.cshtml +++ b/Views/Vehicle/_ReminderRecordModal.cshtml @@ -59,7 +59,9 @@ 15000 mi. / Km 20000 mi. / Km 30000 mi. / Km + 40000 mi. / Km 50000 mi. / Km + 60000 mi. / Km 100000 mi. / Km 150000 mi. / Km