diff --git a/Controllers/APIController.cs b/Controllers/APIController.cs index 2f8cebb..71035c5 100644 --- a/Controllers/APIController.cs +++ b/Controllers/APIController.cs @@ -143,6 +143,7 @@ namespace CarCareTracker.Controllers }; _odometerLogic.AutoInsertOdometerRecord(odometerRecord); } + StaticHelper.NotifyAsync(_config.GetWebHookUrl(), vehicleId, User.Identity.Name, $"added service record via API {serviceRecord.Description}"); response.Success = true; response.Message = "Service Record Added"; return Json(response); @@ -210,6 +211,7 @@ namespace CarCareTracker.Controllers }; _odometerLogic.AutoInsertOdometerRecord(odometerRecord); } + StaticHelper.NotifyAsync(_config.GetWebHookUrl(), vehicleId, User.Identity.Name, $"added repair record via API {repairRecord.Description}"); response.Success = true; response.Message = "Repair Record Added"; return Json(response); @@ -277,6 +279,7 @@ namespace CarCareTracker.Controllers }; _odometerLogic.AutoInsertOdometerRecord(odometerRecord); } + StaticHelper.NotifyAsync(_config.GetWebHookUrl(), vehicleId, User.Identity.Name, $"added upgrade record via API {upgradeRecord.Description}"); response.Success = true; response.Message = "Upgrade Record Added"; return Json(response); @@ -330,6 +333,7 @@ namespace CarCareTracker.Controllers Cost = decimal.Parse(input.Cost) }; _taxRecordDataAccess.SaveTaxRecordToVehicle(taxRecord); + StaticHelper.NotifyAsync(_config.GetWebHookUrl(), vehicleId, User.Identity.Name, $"added tax record via API {taxRecord.Description}"); response.Success = true; response.Message = "Tax Record Added"; return Json(response); @@ -396,6 +400,7 @@ namespace CarCareTracker.Controllers Mileage = int.Parse(input.Odometer) }; _odometerRecordDataAccess.SaveOdometerRecordToVehicle(odometerRecord); + StaticHelper.NotifyAsync(_config.GetWebHookUrl(), vehicleId, User.Identity.Name, $"added odometer record via API {odometerRecord.Mileage.ToString()}"); response.Success = true; response.Message = "Odometer Record Added"; return Json(response); @@ -477,6 +482,7 @@ namespace CarCareTracker.Controllers }; _odometerLogic.AutoInsertOdometerRecord(odometerRecord); } + StaticHelper.NotifyAsync(_config.GetWebHookUrl(), vehicleId, User.Identity.Name, $"added gas record via API {gasRecord.Mileage.ToString()}"); response.Success = true; response.Message = "Gas Record Added"; return Json(response); diff --git a/Controllers/VehicleController.cs b/Controllers/VehicleController.cs index ecd9fec..0e18392 100644 --- a/Controllers/VehicleController.cs +++ b/Controllers/VehicleController.cs @@ -130,6 +130,10 @@ namespace CarCareTracker.Controllers if (isNewAddition) { _userLogic.AddUserAccessToVehicle(GetUserID(), vehicleInput.Id); + StaticHelper.NotifyAsync(_config.GetWebHookUrl(), vehicleInput.Id, User.Identity.Name, $"added new vehicle {vehicleInput.Year} {vehicleInput.Make} {vehicleInput.Model}"); + } else + { + StaticHelper.NotifyAsync(_config.GetWebHookUrl(), vehicleInput.Id, User.Identity.Name, $"edited vehicle {vehicleInput.Year} {vehicleInput.Make} {vehicleInput.Model}"); } return Json(result); } @@ -157,6 +161,10 @@ namespace CarCareTracker.Controllers _odometerRecordDataAccess.DeleteAllOdometerRecordsByVehicleId(vehicleId) && _userLogic.DeleteAllAccessToVehicle(vehicleId) && _dataAccess.DeleteVehicle(vehicleId); + if (result) + { + StaticHelper.NotifyAsync(_config.GetWebHookUrl(), vehicleId, User.Identity.Name, "deleted vehicle"); + } return Json(result); } [HttpPost] @@ -661,6 +669,10 @@ namespace CarCareTracker.Controllers } gasRecord.Files = gasRecord.Files.Select(x => { return new UploadedFiles { Name = x.Name, Location = _fileHelper.MoveFileFromTemp(x.Location, "documents/") }; }).ToList(); var result = _gasRecordDataAccess.SaveGasRecordToVehicle(gasRecord.ToGasRecord()); + if (result) + { + StaticHelper.NotifyAsync(_config.GetWebHookUrl(), gasRecord.VehicleId, User.Identity.Name, $"saved gas record {gasRecord.Mileage.ToString()}"); + } return Json(result); } [HttpGet] @@ -705,6 +717,10 @@ namespace CarCareTracker.Controllers public IActionResult DeleteGasRecordById(int gasRecordId) { var result = _gasRecordDataAccess.DeleteGasRecordById(gasRecordId); + if (result) + { + StaticHelper.NotifyAsync(_config.GetWebHookUrl(), 0, User.Identity.Name, $"deleted gas record id {gasRecordId}"); + } return Json(result); } [HttpPost] @@ -759,6 +775,10 @@ namespace CarCareTracker.Controllers PushbackRecurringReminderRecordWithChecks(serviceRecord.ReminderRecordId); } var result = _serviceRecordDataAccess.SaveServiceRecordToVehicle(serviceRecord.ToServiceRecord()); + if (result) + { + StaticHelper.NotifyAsync(_config.GetWebHookUrl(), serviceRecord.VehicleId, User.Identity.Name, $"saved service record {serviceRecord.Description}"); + } return Json(result); } [HttpGet] @@ -791,6 +811,10 @@ namespace CarCareTracker.Controllers public IActionResult DeleteServiceRecordById(int serviceRecordId) { var result = _serviceRecordDataAccess.DeleteServiceRecordById(serviceRecordId); + if (result) + { + StaticHelper.NotifyAsync(_config.GetWebHookUrl(), 0, User.Identity.Name, $"deleted service record id {serviceRecordId}"); + } return Json(result); } #endregion @@ -836,6 +860,10 @@ namespace CarCareTracker.Controllers PushbackRecurringReminderRecordWithChecks(collisionRecord.ReminderRecordId); } var result = _collisionRecordDataAccess.SaveCollisionRecordToVehicle(collisionRecord.ToCollisionRecord()); + if (result) + { + StaticHelper.NotifyAsync(_config.GetWebHookUrl(), collisionRecord.VehicleId, User.Identity.Name, $"saved repair record {collisionRecord.Description}"); + } return Json(result); } [HttpGet] @@ -868,6 +896,10 @@ namespace CarCareTracker.Controllers public IActionResult DeleteCollisionRecordById(int collisionRecordId) { var result = _collisionRecordDataAccess.DeleteCollisionRecordById(collisionRecordId); + if (result) + { + StaticHelper.NotifyAsync(_config.GetWebHookUrl(), 0, User.Identity.Name, $"deleted repair record id {collisionRecordId}"); + } return Json(result); } #endregion @@ -939,6 +971,10 @@ namespace CarCareTracker.Controllers PushbackRecurringReminderRecordWithChecks(taxRecord.ReminderRecordId); } var result = _taxRecordDataAccess.SaveTaxRecordToVehicle(taxRecord.ToTaxRecord()); + if (result) + { + StaticHelper.NotifyAsync(_config.GetWebHookUrl(), taxRecord.VehicleId, User.Identity.Name, $"saved tax record {taxRecord.Description}"); + } return Json(result); } [HttpGet] @@ -972,6 +1008,10 @@ namespace CarCareTracker.Controllers public IActionResult DeleteTaxRecordById(int taxRecordId) { var result = _taxRecordDataAccess.DeleteTaxRecordById(taxRecordId); + if (result) + { + StaticHelper.NotifyAsync(_config.GetWebHookUrl(), 0, User.Identity.Name, $"deleted tax record {taxRecordId}"); + } return Json(result); } #endregion @@ -1544,6 +1584,10 @@ namespace CarCareTracker.Controllers public IActionResult SaveReminderRecordToVehicleId(ReminderRecordInput reminderRecord) { var result = _reminderRecordDataAccess.SaveReminderRecordToVehicle(reminderRecord.ToReminderRecord()); + if (result) + { + StaticHelper.NotifyAsync(_config.GetWebHookUrl(), reminderRecord.VehicleId, User.Identity.Name, $"saved reminder {reminderRecord.Description}"); + } return Json(result); } [HttpPost] @@ -1584,6 +1628,10 @@ namespace CarCareTracker.Controllers public IActionResult DeleteReminderRecordById(int reminderRecordId) { var result = _reminderRecordDataAccess.DeleteReminderRecordById(reminderRecordId); + if (result) + { + StaticHelper.NotifyAsync(_config.GetWebHookUrl(), 0, User.Identity.Name, $"deleted reminder id {reminderRecordId}"); + } return Json(result); } #endregion @@ -1629,6 +1677,10 @@ namespace CarCareTracker.Controllers PushbackRecurringReminderRecordWithChecks(upgradeRecord.ReminderRecordId); } var result = _upgradeRecordDataAccess.SaveUpgradeRecordToVehicle(upgradeRecord.ToUpgradeRecord()); + if (result) + { + StaticHelper.NotifyAsync(_config.GetWebHookUrl(), upgradeRecord.VehicleId, User.Identity.Name, $"saved upgrade record {upgradeRecord.Description}"); + } return Json(result); } [HttpGet] @@ -1661,6 +1713,10 @@ namespace CarCareTracker.Controllers public IActionResult DeleteUpgradeRecordById(int upgradeRecordId) { var result = _upgradeRecordDataAccess.DeleteUpgradeRecordById(upgradeRecordId); + if (result) + { + StaticHelper.NotifyAsync(_config.GetWebHookUrl(), 0, User.Identity.Name, $"deleted upgrade record id {upgradeRecordId}"); + } return Json(result); } #endregion @@ -1685,6 +1741,10 @@ namespace CarCareTracker.Controllers public IActionResult SaveNoteToVehicleId(Note note) { var result = _noteDataAccess.SaveNoteToVehicle(note); + if (result) + { + StaticHelper.NotifyAsync(_config.GetWebHookUrl(), note.VehicleId, User.Identity.Name, $"saved note {note.Description}"); + } return Json(result); } [HttpGet] @@ -1702,6 +1762,10 @@ namespace CarCareTracker.Controllers public IActionResult DeleteNoteById(int noteId) { var result = _noteDataAccess.DeleteNoteById(noteId); + if (result) + { + StaticHelper.NotifyAsync(_config.GetWebHookUrl(), 0, User.Identity.Name, $"deleted note id {noteId}"); + } return Json(result); } [HttpPost] @@ -1823,6 +1887,10 @@ namespace CarCareTracker.Controllers //move files from temp. supplyRecord.Files = supplyRecord.Files.Select(x => { return new UploadedFiles { Name = x.Name, Location = _fileHelper.MoveFileFromTemp(x.Location, "documents/") }; }).ToList(); var result = _supplyRecordDataAccess.SaveSupplyRecordToVehicle(supplyRecord.ToSupplyRecord()); + if (result) + { + StaticHelper.NotifyAsync(_config.GetWebHookUrl(), supplyRecord.VehicleId, User.Identity.Name, $"saved supply record {supplyRecord.Description}"); + } return Json(result); } [HttpGet] @@ -1857,6 +1925,10 @@ namespace CarCareTracker.Controllers public IActionResult DeleteSupplyRecordById(int supplyRecordId) { var result = _supplyRecordDataAccess.DeleteSupplyRecordById(supplyRecordId); + if (result) + { + StaticHelper.NotifyAsync(_config.GetWebHookUrl(), 0, User.Identity.Name, $"deleted supply record id {supplyRecordId}"); + } return Json(result); } #endregion @@ -1884,6 +1956,10 @@ namespace CarCareTracker.Controllers planRecord.RequisitionHistory = RequisitionSupplyRecordsByUsage(planRecord.Supplies, DateTime.Parse(planRecord.DateCreated), planRecord.Description); } var result = _planRecordDataAccess.SavePlanRecordToVehicle(planRecord.ToPlanRecord()); + if (result) + { + StaticHelper.NotifyAsync(_config.GetWebHookUrl(), planRecord.VehicleId, User.Identity.Name, $"saved plan record {planRecord.Description}"); + } return Json(result); } [HttpPost] @@ -2069,6 +2145,10 @@ namespace CarCareTracker.Controllers public IActionResult DeletePlanRecordById(int planRecordId) { var result = _planRecordDataAccess.DeletePlanRecordById(planRecordId); + if (result) + { + StaticHelper.NotifyAsync(_config.GetWebHookUrl(), 0, User.Identity.Name, $"deleted plan record {planRecordId}"); + } return Json(result); } #endregion @@ -2108,6 +2188,10 @@ namespace CarCareTracker.Controllers //move files from temp. odometerRecord.Files = odometerRecord.Files.Select(x => { return new UploadedFiles { Name = x.Name, Location = _fileHelper.MoveFileFromTemp(x.Location, "documents/") }; }).ToList(); var result = _odometerRecordDataAccess.SaveOdometerRecordToVehicle(odometerRecord.ToOdometerRecord()); + if (result) + { + StaticHelper.NotifyAsync(_config.GetWebHookUrl(), odometerRecord.VehicleId, User.Identity.Name, $"saved odometer record {odometerRecord.Mileage.ToString()}"); + } return Json(result); } [HttpGet] @@ -2188,6 +2272,10 @@ namespace CarCareTracker.Controllers public IActionResult DeleteOdometerRecordById(int odometerRecordId) { var result = _odometerRecordDataAccess.DeleteOdometerRecordById(odometerRecordId); + if (result) + { + StaticHelper.NotifyAsync(_config.GetWebHookUrl(), 0, User.Identity.Name, $"deleted odometer record {odometerRecordId}"); + } return Json(result); } #endregion @@ -2289,6 +2377,10 @@ namespace CarCareTracker.Controllers } } } + if (result) + { + StaticHelper.NotifyAsync(_config.GetWebHookUrl(), 0, User.Identity.Name, $"moved multiple {source.ToString()} to {destination.ToString()} {string.Join(",", recordIds)}"); + } return Json(result); } public IActionResult DeleteRecords(List recordIds, ImportMode importMode) @@ -2327,6 +2419,10 @@ namespace CarCareTracker.Controllers break; } } + if (result) + { + StaticHelper.NotifyAsync(_config.GetWebHookUrl(), 0, User.Identity.Name, $"deleted multiple {importMode.ToString()} {string.Join(",", recordIds)}"); + } return Json(result); } public IActionResult DuplicateRecords(List recordIds, ImportMode importMode) @@ -2401,6 +2497,10 @@ namespace CarCareTracker.Controllers break; } } + if (result) + { + StaticHelper.NotifyAsync(_config.GetWebHookUrl(), 0, User.Identity.Name, $"duplicated multiple {importMode.ToString()} {string.Join(",", recordIds)}"); + } return Json(result); } [HttpPost] diff --git a/Helper/ConfigHelper.cs b/Helper/ConfigHelper.cs index fa99a77..b6c1844 100644 --- a/Helper/ConfigHelper.cs +++ b/Helper/ConfigHelper.cs @@ -12,6 +12,7 @@ namespace CarCareTracker.Helper UserConfig GetUserConfig(ClaimsPrincipal user); bool SaveUserConfig(ClaimsPrincipal user, UserConfig configData); bool AuthenticateRootUser(string username, string password); + string GetWebHookUrl(); string GetMOTD(); string GetLogoUrl(); string GetServerLanguage(); @@ -33,6 +34,15 @@ namespace CarCareTracker.Helper _userConfig = userConfig; _cache = memoryCache; } + public string GetWebHookUrl() + { + var webhook = _config["LUBELOGGER_WEBHOOK"]; + if (string.IsNullOrWhiteSpace(webhook)) + { + webhook = ""; + } + return webhook; + } public string GetMOTD() { var motd = _config["LUBELOGGER_MOTD"]; diff --git a/Helper/StaticHelper.cs b/Helper/StaticHelper.cs index 2e4c63e..3fe83e6 100644 --- a/Helper/StaticHelper.cs +++ b/Helper/StaticHelper.cs @@ -244,5 +244,20 @@ namespace CarCareTracker.Helper var motd = config["LUBELOGGER_MOTD"] ?? "Not Configured"; Console.WriteLine($"Message Of The Day: {motd}"); } + public static async void NotifyAsync(string webhookURL, int vehicleId, string username, string action) + { + if (string.IsNullOrWhiteSpace(webhookURL)) + { + return; + } + var httpClient = new HttpClient(); + var httpParams = new Dictionary + { + { "vehicleId", vehicleId.ToString() }, + { "username", username }, + { "action", action }, + }; + httpClient.PostAsJsonAsync(webhookURL, httpParams); + } } }