using CarCareTracker.Filter; using CarCareTracker.Helper; using CarCareTracker.Models; using Microsoft.AspNetCore.Mvc; namespace CarCareTracker.Controllers { public partial class VehicleController { private List GetRemindersAndUrgency(int vehicleId, DateTime dateCompare) { var currentMileage = _vehicleLogic.GetMaxMileage(vehicleId); var reminders = _reminderRecordDataAccess.GetReminderRecordsByVehicleId(vehicleId); List results = _reminderHelper.GetReminderRecordViewModels(reminders, currentMileage, dateCompare); return results; } private bool GetAndUpdateVehicleUrgentOrPastDueReminders(int vehicleId) { var result = GetRemindersAndUrgency(vehicleId, DateTime.Now); //check if user wants auto-refresh past-due reminders if (_config.GetUserConfig(User).EnableAutoReminderRefresh && _userLogic.UserCanEditVehicle(GetUserID(), vehicleId, HouseholdPermission.Edit)) { //check for past due reminders that are eligible for recurring. var pastDueAndRecurring = result.Where(x => x.Urgency == ReminderUrgency.PastDue && x.IsRecurring); if (pastDueAndRecurring.Any()) { foreach (ReminderRecordViewModel reminderRecord in pastDueAndRecurring) { //update based on recurring intervals. //pull reminderRecord based on ID var existingReminder = _reminderRecordDataAccess.GetReminderRecordById(reminderRecord.Id); existingReminder = _reminderHelper.GetUpdatedRecurringReminderRecord(existingReminder, null, null); //save to db. _reminderRecordDataAccess.SaveReminderRecordToVehicle(existingReminder); //set urgency to not urgent so it gets excluded in count. reminderRecord.Urgency = ReminderUrgency.NotUrgent; } } } //check for very urgent or past due reminders that were not eligible for recurring. var pastDueAndUrgentReminders = result.Where(x => x.Urgency == ReminderUrgency.VeryUrgent || x.Urgency == ReminderUrgency.PastDue); if (pastDueAndUrgentReminders.Any()) { return true; } return false; } [TypeFilter(typeof(CollaboratorFilter))] [HttpGet] public IActionResult GetVehicleHaveUrgentOrPastDueReminders(int vehicleId) { var result = GetAndUpdateVehicleUrgentOrPastDueReminders(vehicleId); return Json(result); } [TypeFilter(typeof(CollaboratorFilter))] [HttpGet] public IActionResult GetReminderRecordsByVehicleId(int vehicleId) { var result = GetRemindersAndUrgency(vehicleId, DateTime.Now); result = result.OrderByDescending(x => x.Urgency).ToList(); return PartialView("Reminder/_ReminderRecords", result); } [TypeFilter(typeof(CollaboratorFilter))] [HttpGet] public IActionResult GetRecurringReminderRecordsByVehicleId(int vehicleId) { var result = GetRemindersAndUrgency(vehicleId, DateTime.Now); result.RemoveAll(x => !x.IsRecurring); result = result.OrderByDescending(x => x.Urgency).ThenBy(x => x.Description).ToList(); return PartialView("_RecurringReminderSelector", result); } [HttpPost] public IActionResult PushbackRecurringReminderRecord(int reminderRecordId) { var result = PushbackRecurringReminderRecordWithChecks(reminderRecordId, null, null); return Json(result); } private OperationResponse PushbackRecurringReminderRecordWithChecks(int reminderRecordId, DateTime? currentDate, int? currentMileage) { try { var existingReminder = _reminderRecordDataAccess.GetReminderRecordById(reminderRecordId); if (existingReminder is not null && existingReminder.Id != default && existingReminder.IsRecurring) { //security check if (!_userLogic.UserCanEditVehicle(GetUserID(), existingReminder.VehicleId, HouseholdPermission.Edit)) { return OperationResponse.Failed("Access Denied"); } existingReminder = _reminderHelper.GetUpdatedRecurringReminderRecord(existingReminder, currentDate, currentMileage); //save to db. var reminderUpdateResult = _reminderRecordDataAccess.SaveReminderRecordToVehicle(existingReminder); if (!reminderUpdateResult) { _logger.LogError("Unable to update reminder either because the reminder no longer exists or is no longer recurring"); return OperationResponse.Failed("Unable to update reminder either because the reminder no longer exists or is no longer recurring"); } return OperationResponse.Succeed(); } else { _logger.LogError("Unable to update reminder because it no longer exists."); return OperationResponse.Failed("Unable to update reminder because it no longer exists."); } } catch (Exception ex) { _logger.LogError(ex.Message); return OperationResponse.Failed(StaticHelper.GenericErrorMessage); } } [HttpPost] public IActionResult SaveReminderRecordToVehicleId(ReminderRecordInput reminderRecord) { //security check. if (!_userLogic.UserCanEditVehicle(GetUserID(), reminderRecord.VehicleId, HouseholdPermission.Edit)) { return Json(OperationResponse.Failed("Access Denied")); } var result = _reminderRecordDataAccess.SaveReminderRecordToVehicle(reminderRecord.ToReminderRecord()); if (result) { StaticHelper.NotifyAsync(_config.GetWebHookUrl(), WebHookPayload.FromReminderRecord(reminderRecord.ToReminderRecord(), reminderRecord.Id == default ? "reminderrecord.add" : "reminderrecord.update", User.Identity.Name)); } return Json(OperationResponse.Conditional(result, string.Empty, StaticHelper.GenericErrorMessage)); } [HttpPost] public IActionResult GetAddReminderRecordPartialView(ReminderRecordInput? reminderModel) { if (reminderModel is not null) { return PartialView("Reminder/_ReminderRecordModal", reminderModel); } else { return PartialView("Reminder/_ReminderRecordModal", new ReminderRecordInput()); } } [HttpGet] public IActionResult GetReminderRecordForEditById(int reminderRecordId) { var result = _reminderRecordDataAccess.GetReminderRecordById(reminderRecordId); //security check. if (!_userLogic.UserCanEditVehicle(GetUserID(), result.VehicleId, HouseholdPermission.View)) { return Redirect("/Error/Unauthorized"); } //convert to Input object. var convertedResult = new ReminderRecordInput { Id = result.Id, Date = result.Date.ToShortDateString(), Description = result.Description, Notes = result.Notes, VehicleId = result.VehicleId, Mileage = result.Mileage, Metric = result.Metric, IsRecurring = result.IsRecurring, FixedIntervals = result.FixedIntervals, UseCustomThresholds = result.UseCustomThresholds, CustomThresholds = result.CustomThresholds, ReminderMileageInterval = result.ReminderMileageInterval, ReminderMonthInterval = result.ReminderMonthInterval, CustomMileageInterval = result.CustomMileageInterval, CustomMonthInterval = result.CustomMonthInterval, CustomMonthIntervalUnit = result.CustomMonthIntervalUnit, Tags = result.Tags }; return PartialView("Reminder/_ReminderRecordModal", convertedResult); } private OperationResponse DeleteReminderRecordWithChecks(int reminderRecordId) { var existingRecord = _reminderRecordDataAccess.GetReminderRecordById(reminderRecordId); //security check. if (!_userLogic.UserCanEditVehicle(GetUserID(), existingRecord.VehicleId, HouseholdPermission.Delete)) { return OperationResponse.Failed("Access Denied"); } var result = _reminderRecordDataAccess.DeleteReminderRecordById(existingRecord.Id); if (result) { StaticHelper.NotifyAsync(_config.GetWebHookUrl(), WebHookPayload.FromReminderRecord(existingRecord, "reminderrecord.delete", User.Identity.Name)); } return OperationResponse.Conditional(result, string.Empty, StaticHelper.GenericErrorMessage); } [HttpPost] public IActionResult DeleteReminderRecordById(int reminderRecordId) { var result = DeleteReminderRecordWithChecks(reminderRecordId); return Json(result); } } }