From 1b736b36f8c8359fad01fbf70036099708e9322e Mon Sep 17 00:00:00 2001 From: "DESKTOP-T0O5CDB\\DESK-555BD" Date: Fri, 6 Dec 2024 11:34:04 -0700 Subject: [PATCH] Added delete records. --- Controllers/APIController.cs | 153 +++++++++++++++++++++++ Controllers/Vehicle/PlanController.cs | 4 +- Controllers/Vehicle/RepairController.cs | 4 +- Controllers/Vehicle/ServiceController.cs | 4 +- Controllers/Vehicle/SupplyController.cs | 39 +----- Controllers/Vehicle/UpgradeController.cs | 4 +- Logic/VehicleLogic.cs | 51 +++++++- Models/Shared/WebHookPayload.cs | 6 +- Views/API/Index.cshtml | 102 +++++++++++++-- 9 files changed, 304 insertions(+), 63 deletions(-) diff --git a/Controllers/APIController.cs b/Controllers/APIController.cs index 2499f81..0ecb1cc 100644 --- a/Controllers/APIController.cs +++ b/Controllers/APIController.cs @@ -229,6 +229,34 @@ namespace CarCareTracker.Controllers return Json(OperationResponse.Failed(ex.Message)); } } + [HttpDelete] + [Route("/api/vehicle/servicerecords/delete")] + public IActionResult DeleteServiceRecord(int id) + { + var existingRecord = _serviceRecordDataAccess.GetServiceRecordById(id); + if (existingRecord == null || existingRecord.Id == default) + { + Response.StatusCode = 400; + return Json(OperationResponse.Failed("Invalid Record Id")); + } + //security check. + if (!_userLogic.UserCanEditVehicle(GetUserID(), existingRecord.VehicleId)) + { + Response.StatusCode = 401; + return Json(OperationResponse.Failed("Access Denied, you don't have access to this vehicle.")); + } + //restore any requisitioned supplies. + if (existingRecord.RequisitionHistory.Any()) + { + _vehicleLogic.RestoreSupplyRecordsByUsage(existingRecord.RequisitionHistory, existingRecord.Description); + } + var result = _serviceRecordDataAccess.DeleteServiceRecordById(existingRecord.Id); + if (result) + { + StaticHelper.NotifyAsync(_config.GetWebHookUrl(), WebHookPayload.FromGenericRecord(existingRecord, "servicerecord.delete.api", User.Identity.Name)); + } + return Json(OperationResponse.Conditional(result, "Service Record Deleted")); + } [HttpPut] [Route("/api/vehicle/servicerecords/update")] [Consumes("application/json")] @@ -362,6 +390,34 @@ namespace CarCareTracker.Controllers return Json(OperationResponse.Failed(ex.Message)); } } + [HttpDelete] + [Route("/api/vehicle/repairrecords/delete")] + public IActionResult DeleteRepairRecord(int id) + { + var existingRecord = _collisionRecordDataAccess.GetCollisionRecordById(id); + if (existingRecord == null || existingRecord.Id == default) + { + Response.StatusCode = 400; + return Json(OperationResponse.Failed("Invalid Record Id")); + } + //security check. + if (!_userLogic.UserCanEditVehicle(GetUserID(), existingRecord.VehicleId)) + { + Response.StatusCode = 401; + return Json(OperationResponse.Failed("Access Denied, you don't have access to this vehicle.")); + } + //restore any requisitioned supplies. + if (existingRecord.RequisitionHistory.Any()) + { + _vehicleLogic.RestoreSupplyRecordsByUsage(existingRecord.RequisitionHistory, existingRecord.Description); + } + var result = _collisionRecordDataAccess.DeleteCollisionRecordById(existingRecord.Id); + if (result) + { + StaticHelper.NotifyAsync(_config.GetWebHookUrl(), WebHookPayload.FromGenericRecord(existingRecord, "repairrecord.delete.api", User.Identity.Name)); + } + return Json(OperationResponse.Conditional(result, "Repair Record Deleted")); + } [HttpPut] [Route("/api/vehicle/repairrecords/update")] [Consumes("application/json")] @@ -495,6 +551,34 @@ namespace CarCareTracker.Controllers return Json(OperationResponse.Failed(ex.Message)); } } + [HttpDelete] + [Route("/api/vehicle/upgraderecords/delete")] + public IActionResult DeleteUpgradeRecord(int id) + { + var existingRecord = _upgradeRecordDataAccess.GetUpgradeRecordById(id); + if (existingRecord == null || existingRecord.Id == default) + { + Response.StatusCode = 400; + return Json(OperationResponse.Failed("Invalid Record Id")); + } + //security check. + if (!_userLogic.UserCanEditVehicle(GetUserID(), existingRecord.VehicleId)) + { + Response.StatusCode = 401; + return Json(OperationResponse.Failed("Access Denied, you don't have access to this vehicle.")); + } + //restore any requisitioned supplies. + if (existingRecord.RequisitionHistory.Any()) + { + _vehicleLogic.RestoreSupplyRecordsByUsage(existingRecord.RequisitionHistory, existingRecord.Description); + } + var result = _upgradeRecordDataAccess.DeleteUpgradeRecordById(existingRecord.Id); + if (result) + { + StaticHelper.NotifyAsync(_config.GetWebHookUrl(), WebHookPayload.FromGenericRecord(existingRecord, "upgraderecord.delete.api", User.Identity.Name)); + } + return Json(OperationResponse.Conditional(result,"Upgrade Record Deleted")); + } [HttpPut] [Route("/api/vehicle/upgraderecords/update")] [Consumes("application/json")] @@ -650,6 +734,29 @@ namespace CarCareTracker.Controllers return Json(OperationResponse.Failed(ex.Message)); } } + [HttpDelete] + [Route("/api/vehicle/taxrecords/delete")] + public IActionResult DeleteTaxRecord(int id) + { + var existingRecord = _taxRecordDataAccess.GetTaxRecordById(id); + if (existingRecord == null || existingRecord.Id == default) + { + Response.StatusCode = 400; + return Json(OperationResponse.Failed("Invalid Record Id")); + } + //security check. + if (!_userLogic.UserCanEditVehicle(GetUserID(), existingRecord.VehicleId)) + { + Response.StatusCode = 401; + return Json(OperationResponse.Failed("Access Denied, you don't have access to this vehicle.")); + } + var result = _taxRecordDataAccess.DeleteTaxRecordById(existingRecord.Id); + if (result) + { + StaticHelper.NotifyAsync(_config.GetWebHookUrl(), WebHookPayload.FromTaxRecord(existingRecord, "taxrecord.delete.api", User.Identity.Name)); + } + return Json(OperationResponse.Conditional(result, "Tax Record Deleted")); + } [HttpPut] [Route("/api/vehicle/taxrecords/update")] [Consumes("application/json")] @@ -785,6 +892,29 @@ namespace CarCareTracker.Controllers return Json(OperationResponse.Failed(ex.Message)); } } + [HttpDelete] + [Route("/api/vehicle/odometerrecords/delete")] + public IActionResult DeleteOdometerRecord(int id) + { + var existingRecord = _odometerRecordDataAccess.GetOdometerRecordById(id); + if (existingRecord == null || existingRecord.Id == default) + { + Response.StatusCode = 400; + return Json(OperationResponse.Failed("Invalid Record Id")); + } + //security check. + if (!_userLogic.UserCanEditVehicle(GetUserID(), existingRecord.VehicleId)) + { + Response.StatusCode = 401; + return Json(OperationResponse.Failed("Access Denied, you don't have access to this vehicle.")); + } + var result = _odometerRecordDataAccess.DeleteOdometerRecordById(existingRecord.Id); + if (result) + { + StaticHelper.NotifyAsync(_config.GetWebHookUrl(), WebHookPayload.FromOdometerRecord(existingRecord, "odometerrecord.delete.api", User.Identity.Name)); + } + return Json(OperationResponse.Conditional(result, "Odometer Record Deleted")); + } [HttpPut] [Route("/api/vehicle/odometerrecords/update")] [Consumes("application/json")] @@ -933,6 +1063,29 @@ namespace CarCareTracker.Controllers return Json(OperationResponse.Failed(ex.Message)); } } + [HttpDelete] + [Route("/api/vehicle/gasrecords/delete")] + public IActionResult DeleteGasRecord(int id) + { + var existingRecord = _gasRecordDataAccess.GetGasRecordById(id); + if (existingRecord == null || existingRecord.Id == default) + { + Response.StatusCode = 400; + return Json(OperationResponse.Failed("Invalid Record Id")); + } + //security check. + if (!_userLogic.UserCanEditVehicle(GetUserID(), existingRecord.VehicleId)) + { + Response.StatusCode = 401; + return Json(OperationResponse.Failed("Access Denied, you don't have access to this vehicle.")); + } + var result = _gasRecordDataAccess.DeleteGasRecordById(existingRecord.Id); + if (result) + { + StaticHelper.NotifyAsync(_config.GetWebHookUrl(), WebHookPayload.FromGasRecord(existingRecord, "gasrecord.delete.api", User.Identity.Name)); + } + return Json(OperationResponse.Conditional(result, "Odometer Record Deleted")); + } [HttpPut] [Route("/api/vehicle/gasrecords/update")] [Consumes("application/json")] diff --git a/Controllers/Vehicle/PlanController.cs b/Controllers/Vehicle/PlanController.cs index e161bf7..c8fba57 100644 --- a/Controllers/Vehicle/PlanController.cs +++ b/Controllers/Vehicle/PlanController.cs @@ -40,7 +40,7 @@ namespace CarCareTracker.Controllers } if (planRecord.DeletedRequisitionHistory.Any()) { - RestoreSupplyRecordsByUsage(planRecord.DeletedRequisitionHistory, planRecord.Description); + _vehicleLogic.RestoreSupplyRecordsByUsage(planRecord.DeletedRequisitionHistory, planRecord.Description); } var result = _planRecordDataAccess.SavePlanRecordToVehicle(planRecord.ToPlanRecord()); if (result) @@ -311,7 +311,7 @@ namespace CarCareTracker.Controllers //restore any requisitioned supplies if it has not been converted to other record types. if (existingRecord.RequisitionHistory.Any() && existingRecord.Progress != PlanProgress.Done) { - RestoreSupplyRecordsByUsage(existingRecord.RequisitionHistory, existingRecord.Description); + _vehicleLogic.RestoreSupplyRecordsByUsage(existingRecord.RequisitionHistory, existingRecord.Description); } var result = _planRecordDataAccess.DeletePlanRecordById(existingRecord.Id); if (result) diff --git a/Controllers/Vehicle/RepairController.cs b/Controllers/Vehicle/RepairController.cs index 0d74123..c60d929 100644 --- a/Controllers/Vehicle/RepairController.cs +++ b/Controllers/Vehicle/RepairController.cs @@ -53,7 +53,7 @@ namespace CarCareTracker.Controllers } if (collisionRecord.DeletedRequisitionHistory.Any()) { - RestoreSupplyRecordsByUsage(collisionRecord.DeletedRequisitionHistory, collisionRecord.Description); + _vehicleLogic.RestoreSupplyRecordsByUsage(collisionRecord.DeletedRequisitionHistory, collisionRecord.Description); } //push back any reminders if (collisionRecord.ReminderRecordId.Any()) @@ -112,7 +112,7 @@ namespace CarCareTracker.Controllers //restore any requisitioned supplies. if (existingRecord.RequisitionHistory.Any()) { - RestoreSupplyRecordsByUsage(existingRecord.RequisitionHistory, existingRecord.Description); + _vehicleLogic.RestoreSupplyRecordsByUsage(existingRecord.RequisitionHistory, existingRecord.Description); } var result = _collisionRecordDataAccess.DeleteCollisionRecordById(existingRecord.Id); if (result) diff --git a/Controllers/Vehicle/ServiceController.cs b/Controllers/Vehicle/ServiceController.cs index 3cdafd8..1ab9ccb 100644 --- a/Controllers/Vehicle/ServiceController.cs +++ b/Controllers/Vehicle/ServiceController.cs @@ -53,7 +53,7 @@ namespace CarCareTracker.Controllers } if (serviceRecord.DeletedRequisitionHistory.Any()) { - RestoreSupplyRecordsByUsage(serviceRecord.DeletedRequisitionHistory, serviceRecord.Description); + _vehicleLogic.RestoreSupplyRecordsByUsage(serviceRecord.DeletedRequisitionHistory, serviceRecord.Description); } //push back any reminders if (serviceRecord.ReminderRecordId.Any()) @@ -112,7 +112,7 @@ namespace CarCareTracker.Controllers //restore any requisitioned supplies. if (existingRecord.RequisitionHistory.Any()) { - RestoreSupplyRecordsByUsage(existingRecord.RequisitionHistory, existingRecord.Description); + _vehicleLogic.RestoreSupplyRecordsByUsage(existingRecord.RequisitionHistory, existingRecord.Description); } var result = _serviceRecordDataAccess.DeleteServiceRecordById(existingRecord.Id); if (result) diff --git a/Controllers/Vehicle/SupplyController.cs b/Controllers/Vehicle/SupplyController.cs index 0162450..b742fc4 100644 --- a/Controllers/Vehicle/SupplyController.cs +++ b/Controllers/Vehicle/SupplyController.cs @@ -73,44 +73,7 @@ namespace CarCareTracker.Controllers } return results; } - private void RestoreSupplyRecordsByUsage(List supplyUsage, string usageDescription) - { - foreach (SupplyUsageHistory supply in supplyUsage) - { - try - { - if (supply.Id == default) - { - continue; //no id, skip current supply. - } - var result = _supplyRecordDataAccess.GetSupplyRecordById(supply.Id); - if (result != null && result.Id != default) - { - //supply exists, re-add the quantity and cost - result.Quantity += supply.Quantity; - result.Cost += supply.Cost; - var requisitionRecord = new SupplyUsageHistory - { - Id = supply.Id, - Date = DateTime.Now.Date, - Description = $"Restored from {usageDescription}", - Quantity = supply.Quantity, - Cost = supply.Cost - }; - result.RequisitionHistory.Add(requisitionRecord); - //save - _supplyRecordDataAccess.SaveSupplyRecordToVehicle(result); - } - else - { - _logger.LogError($"Unable to find supply with id {supply.Id}"); - } - } catch (Exception ex) - { - _logger.LogError($"Error restoring supply with id {supply.Id} : {ex.Message}"); - } - } - } + [TypeFilter(typeof(CollaboratorFilter))] [HttpGet] public IActionResult GetSupplyRecordsByVehicleId(int vehicleId) diff --git a/Controllers/Vehicle/UpgradeController.cs b/Controllers/Vehicle/UpgradeController.cs index 264e75b..6992466 100644 --- a/Controllers/Vehicle/UpgradeController.cs +++ b/Controllers/Vehicle/UpgradeController.cs @@ -53,7 +53,7 @@ namespace CarCareTracker.Controllers } if (upgradeRecord.DeletedRequisitionHistory.Any()) { - RestoreSupplyRecordsByUsage(upgradeRecord.DeletedRequisitionHistory, upgradeRecord.Description); + _vehicleLogic.RestoreSupplyRecordsByUsage(upgradeRecord.DeletedRequisitionHistory, upgradeRecord.Description); } //push back any reminders if (upgradeRecord.ReminderRecordId.Any()) @@ -112,7 +112,7 @@ namespace CarCareTracker.Controllers //restore any requisitioned supplies. if (existingRecord.RequisitionHistory.Any()) { - RestoreSupplyRecordsByUsage(existingRecord.RequisitionHistory, existingRecord.Description); + _vehicleLogic.RestoreSupplyRecordsByUsage(existingRecord.RequisitionHistory, existingRecord.Description); } var result = _upgradeRecordDataAccess.DeleteUpgradeRecordById(existingRecord.Id); if (result) diff --git a/Logic/VehicleLogic.cs b/Logic/VehicleLogic.cs index 605fdaf..0b06faa 100644 --- a/Logic/VehicleLogic.cs +++ b/Logic/VehicleLogic.cs @@ -1,4 +1,5 @@ -using CarCareTracker.External.Interfaces; +using CarCareTracker.Controllers; +using CarCareTracker.External.Interfaces; using CarCareTracker.Helper; using CarCareTracker.Models; @@ -18,6 +19,7 @@ namespace CarCareTracker.Logic List GetReminders(List vehicles, bool isCalendar); List GetPlans(List vehicles, bool excludeDone); bool UpdateRecurringTaxes(int vehicleId); + void RestoreSupplyRecordsByUsage(List supplyUsage, string usageDescription); } public class VehicleLogic: IVehicleLogic { @@ -31,6 +33,8 @@ namespace CarCareTracker.Logic private readonly IPlanRecordDataAccess _planRecordDataAccess; private readonly IReminderHelper _reminderHelper; private readonly IVehicleDataAccess _dataAccess; + private readonly ISupplyRecordDataAccess _supplyRecordDataAccess; + private readonly ILogger _logger; public VehicleLogic( IServiceRecordDataAccess serviceRecordDataAccess, @@ -42,7 +46,9 @@ namespace CarCareTracker.Logic IReminderRecordDataAccess reminderRecordDataAccess, IPlanRecordDataAccess planRecordDataAccess, IReminderHelper reminderHelper, - IVehicleDataAccess dataAccess + IVehicleDataAccess dataAccess, + ISupplyRecordDataAccess supplyRecordDataAccess, + ILogger logger ) { _serviceRecordDataAccess = serviceRecordDataAccess; _gasRecordDataAccess = gasRecordDataAccess; @@ -54,6 +60,8 @@ namespace CarCareTracker.Logic _reminderRecordDataAccess = reminderRecordDataAccess; _reminderHelper = reminderHelper; _dataAccess = dataAccess; + _supplyRecordDataAccess = supplyRecordDataAccess; + _logger = logger; } public VehicleRecords GetVehicleRecords(int vehicleId) { @@ -374,5 +382,44 @@ namespace CarCareTracker.Logic } return false; //no outdated recurring tax records. } + public void RestoreSupplyRecordsByUsage(List supplyUsage, string usageDescription) + { + foreach (SupplyUsageHistory supply in supplyUsage) + { + try + { + if (supply.Id == default) + { + continue; //no id, skip current supply. + } + var result = _supplyRecordDataAccess.GetSupplyRecordById(supply.Id); + if (result != null && result.Id != default) + { + //supply exists, re-add the quantity and cost + result.Quantity += supply.Quantity; + result.Cost += supply.Cost; + var requisitionRecord = new SupplyUsageHistory + { + Id = supply.Id, + Date = DateTime.Now.Date, + Description = $"Restored from {usageDescription}", + Quantity = supply.Quantity, + Cost = supply.Cost + }; + result.RequisitionHistory.Add(requisitionRecord); + //save + _supplyRecordDataAccess.SaveSupplyRecordToVehicle(result); + } + else + { + _logger.LogError($"Unable to find supply with id {supply.Id}"); + } + } + catch (Exception ex) + { + _logger.LogError($"Error restoring supply with id {supply.Id} : {ex.Message}"); + } + } + } } } diff --git a/Models/Shared/WebHookPayload.cs b/Models/Shared/WebHookPayload.cs index fe55fcd..1b83e07 100644 --- a/Models/Shared/WebHookPayload.cs +++ b/Models/Shared/WebHookPayload.cs @@ -56,13 +56,13 @@ namespace CarCareTracker.Models var recordType = actionTypeParts[0]; var recordAction = actionTypeParts[1]; var thirdPart = actionTypeParts[2]; - if (recordAction == "delete") + if (recordAction == "add") { - recordAction = "DELETED"; + recordAction = "ADDED"; } else { - recordAction = $"{recordAction.ToUpper()}ED"; + recordAction = $"{recordAction.ToUpper()}D"; } if (thirdPart == "api") { diff --git a/Views/API/Index.cshtml b/Views/API/Index.cshtml index d1ab03e..b46d5aa 100644 --- a/Views/API/Index.cshtml +++ b/Views/API/Index.cshtml @@ -132,9 +132,8 @@ Updates Odometer Record
- Id - Id of Odometer Record -
Body(form-data): {
+ Id - Id of Odometer Record
date - Date to be entered
initialOdometer - Initial Odometer reading
odometer - Odometer reading
@@ -144,6 +143,20 @@ }
+
+
+ DELETE +
+
+ /api/vehicle/odometerrecords/delete +
+
+ Deletes Odometer Record +
+
+ Id - Id of Odometer Record +
+
GET @@ -193,9 +206,8 @@ Updates Service Record
- Id - Id of Service Record -
Body(form-data): {
+ Id - Id of Service Record
date - Date to be entered
odometer - Odometer reading
description - Description
@@ -206,6 +218,20 @@ }
+
+
+ DELETE +
+
+ /api/vehicle/servicerecords/delete +
+
+ Deletes Service Record +
+
+ Id - Id of Service Record +
+
GET @@ -255,9 +281,8 @@ Updates Repair Record
- Id - Id of Repair Record -
Body(form-data): {
+ Id - Id of Repair Record
date - Date to be entered
odometer - Odometer reading
description - Description
@@ -268,6 +293,20 @@ }
+
+
+ DELETE +
+
+ /api/vehicle/repairrecords/delete +
+
+ Deletes Repair Record +
+
+ Id - Id of Repair Record +
+
GET @@ -317,9 +356,8 @@ Updates Upgrade Record
- Id - Id of Upgrade Record -
Body(form-data): {
+ Id - Id of Upgrade Record
date - Date to be entered
odometer - Odometer reading
description - Description
@@ -330,6 +368,20 @@ }
+
+
+ DELETE +
+
+ /api/vehicle/upgraderecords/delete +
+
+ Deletes Upgrade Record +
+
+ Id - Id of Upgrade Record +
+
GET @@ -392,9 +444,8 @@ Updates Tax Record
- Id - Id of Tax Record -
Body(form-data): {
+ Id - Id of Tax Record
date - Date to be entered
description - Description
cost - Cost
@@ -404,6 +455,20 @@ }
+
+
+ DELETE +
+
+ /api/vehicle/taxrecords/delete +
+
+ Deletes Tax Record +
+
+ Id - Id of Tax Record +
+
GET @@ -459,9 +524,8 @@ Updates Gas Record
- Id - Id of Gas Record -
Body(form-data): {
+ Id - Id of Gas Record
date - Date to be entered
odometer - Odometer reading
fuelConsumed - Fuel Consumed
@@ -474,6 +538,20 @@ }
+
+
+ DELETE +
+
+ /api/vehicle/gasrecords/delete +
+
+ Deletes Gas Record +
+
+ Id - Id of Gas Record +
+
GET