some code cleanup

This commit is contained in:
DESKTOP-T0O5CDB\DESK-555BD 2025-11-12 09:03:21 -07:00
parent ec52bc09e4
commit 5c895b4f82
9 changed files with 135 additions and 110 deletions

View File

@ -185,14 +185,14 @@ namespace CarCareTracker.Controllers
};
return PartialView("_Collaborators", viewModel);
}
[TypeFilter(typeof(CollaboratorFilter))]
[TypeFilter(typeof(StrictCollaboratorFilter), Arguments = new object[] {false, true})]
[HttpPost]
public IActionResult AddCollaboratorsToVehicle(int vehicleId, string username)
{
var result = _userLogic.AddCollaboratorToVehicle(vehicleId, username);
return Json(result);
}
[TypeFilter(typeof(CollaboratorFilter))]
[TypeFilter(typeof(StrictCollaboratorFilter), Arguments = new object[] { false, true })]
[HttpPost]
public IActionResult DeleteCollaboratorFromVehicle(int userId, int vehicleId)
{

View File

@ -151,14 +151,10 @@ namespace CarCareTracker.Controllers
return Json(false);
}
}
[TypeFilter(typeof(CollaboratorFilter))]
[HttpPost]
[TypeFilter(typeof(StrictCollaboratorFilter), Arguments = new object[] { false, true })]
public IActionResult DeleteVehicle(int vehicleId)
{
if (!_userLogic.UserCanDirectlyEditVehicle(GetUserID(), vehicleId))
{
return Json(false);
}
//Delete all service records, gas records, notes, etc.
var result = _gasRecordDataAccess.DeleteAllGasRecordsByVehicleId(vehicleId) &&
_serviceRecordDataAccess.DeleteAllServiceRecordsByVehicleId(vehicleId) &&
@ -179,88 +175,79 @@ namespace CarCareTracker.Controllers
{
StaticHelper.NotifyAsync(_config.GetWebHookUrl(), WebHookPayload.Generic(string.Empty, "vehicle.delete", User.Identity.Name, vehicleId.ToString()));
}
return Json(result);
return Json(OperationResponse.Succeed());
}
[HttpPost]
[TypeFilter(typeof(StrictCollaboratorFilter), Arguments = new object[] { true, true })]
public IActionResult DeleteVehicles(List<int> vehicleIds)
{
List<bool> results = new List<bool>();
foreach(int vehicleId in vehicleIds)
{
if (_userLogic.UserCanDirectlyEditVehicle(GetUserID(), vehicleId))
foreach (int vehicleId in vehicleIds)
{
//Delete all service records, gas records, notes, etc.
var result = _gasRecordDataAccess.DeleteAllGasRecordsByVehicleId(vehicleId) &&
_serviceRecordDataAccess.DeleteAllServiceRecordsByVehicleId(vehicleId) &&
_collisionRecordDataAccess.DeleteAllCollisionRecordsByVehicleId(vehicleId) &&
_taxRecordDataAccess.DeleteAllTaxRecordsByVehicleId(vehicleId) &&
_noteDataAccess.DeleteAllNotesByVehicleId(vehicleId) &&
_reminderRecordDataAccess.DeleteAllReminderRecordsByVehicleId(vehicleId) &&
_upgradeRecordDataAccess.DeleteAllUpgradeRecordsByVehicleId(vehicleId) &&
_planRecordDataAccess.DeleteAllPlanRecordsByVehicleId(vehicleId) &&
_planRecordTemplateDataAccess.DeleteAllPlanRecordTemplatesByVehicleId(vehicleId) &&
_inspectionRecordDataAccess.DeleteAllInspectionRecordsByVehicleId(vehicleId) &&
_inspectionRecordTemplateDataAccess.DeleteAllInspectionReportTemplatesByVehicleId(vehicleId) &&
_supplyRecordDataAccess.DeleteAllSupplyRecordsByVehicleId(vehicleId) &&
_odometerRecordDataAccess.DeleteAllOdometerRecordsByVehicleId(vehicleId) &&
_userLogic.DeleteAllAccessToVehicle(vehicleId) &&
_dataAccess.DeleteVehicle(vehicleId);
if (result)
{
//Delete all service records, gas records, notes, etc.
var result = _gasRecordDataAccess.DeleteAllGasRecordsByVehicleId(vehicleId) &&
_serviceRecordDataAccess.DeleteAllServiceRecordsByVehicleId(vehicleId) &&
_collisionRecordDataAccess.DeleteAllCollisionRecordsByVehicleId(vehicleId) &&
_taxRecordDataAccess.DeleteAllTaxRecordsByVehicleId(vehicleId) &&
_noteDataAccess.DeleteAllNotesByVehicleId(vehicleId) &&
_reminderRecordDataAccess.DeleteAllReminderRecordsByVehicleId(vehicleId) &&
_upgradeRecordDataAccess.DeleteAllUpgradeRecordsByVehicleId(vehicleId) &&
_planRecordDataAccess.DeleteAllPlanRecordsByVehicleId(vehicleId) &&
_planRecordTemplateDataAccess.DeleteAllPlanRecordTemplatesByVehicleId(vehicleId) &&
_inspectionRecordDataAccess.DeleteAllInspectionRecordsByVehicleId(vehicleId) &&
_inspectionRecordTemplateDataAccess.DeleteAllInspectionReportTemplatesByVehicleId(vehicleId) &&
_supplyRecordDataAccess.DeleteAllSupplyRecordsByVehicleId(vehicleId) &&
_odometerRecordDataAccess.DeleteAllOdometerRecordsByVehicleId(vehicleId) &&
_userLogic.DeleteAllAccessToVehicle(vehicleId) &&
_dataAccess.DeleteVehicle(vehicleId);
if (result)
{
StaticHelper.NotifyAsync(_config.GetWebHookUrl(), WebHookPayload.Generic(string.Empty, "vehicle.delete", User.Identity.Name, vehicleId.ToString()));
}
results.Add(result);
} else
{
results.Add(false);
StaticHelper.NotifyAsync(_config.GetWebHookUrl(), WebHookPayload.Generic(string.Empty, "vehicle.delete", User.Identity.Name, vehicleId.ToString()));
}
results.Add(result);
}
return Json(results.All(x => x));
return Json(OperationResponse.Conditional(results.Any() && results.All(x => x), "", StaticHelper.GenericErrorMessage));
}
[HttpPost]
[TypeFilter(typeof(StrictCollaboratorFilter), Arguments = new object[] { true, true })]
public IActionResult GetVehiclesCollaborators(List<int> vehicleIds)
{
var viewModel = new UserCollaboratorViewModel();
if (vehicleIds.Count() == 1)
{
//only one vehicle to manage
if (_userLogic.UserCanDirectlyEditVehicle(GetUserID(), vehicleIds.First()))
if (_userLogic.UserCanEditVehicle(GetUserID(), vehicleIds.First()))
{
viewModel.CommonCollaborators = _userLogic.GetCollaboratorsForVehicle(vehicleIds.First()).Select(x=>x.UserName).ToList();
viewModel.CommonCollaborators = _userLogic.GetCollaboratorsForVehicle(vehicleIds.First()).Select(x => x.UserName).ToList();
viewModel.VehicleIds.Add(vehicleIds.First());
} else
{
viewModel.CanModifyCollaborators = false;
}
}
}
else
{
List<UserCollaborator> allCollaborators = new List<UserCollaborator>();
foreach (int vehicleId in vehicleIds)
{
if (_userLogic.UserCanDirectlyEditVehicle(GetUserID(), vehicleId))
if (_userLogic.UserCanEditVehicle(GetUserID(), vehicleId))
{
var vehicleCollaborators = _userLogic.GetCollaboratorsForVehicle(vehicleId);
allCollaborators.AddRange(vehicleCollaborators);
viewModel.VehicleIds.Add(vehicleId);
} else
{
viewModel.CanModifyCollaborators = false;
}
}
var groupedCollaborations = allCollaborators.GroupBy(x => x.UserName);
viewModel.CommonCollaborators = groupedCollaborations.Where(x => x.Count() == vehicleIds.Count()).Select(y => y.Key).ToList();
viewModel.PartialCollaborators = groupedCollaborations.Where(x => x.Count() != vehicleIds.Count()).Select(y => y.Key).ToList();
}
return PartialView("_UserCollaborators",viewModel);
return PartialView("_UserCollaborators", viewModel);
}
[HttpPost]
[TypeFilter(typeof(StrictCollaboratorFilter), Arguments = new object[] { true, true })]
public IActionResult AddCollaboratorsToVehicles(List<string> usernames, List<int> vehicleIds)
{
List<OperationResponse> results = new List<OperationResponse>();
foreach(string username in usernames)
foreach (string username in usernames)
{
foreach(int vehicleId in vehicleIds)
foreach (int vehicleId in vehicleIds)
{
var result = _userLogic.AddCollaboratorToVehicle(vehicleId, username);
results.Add(result);
@ -274,6 +261,7 @@ namespace CarCareTracker.Controllers
return Json(OperationResponse.Succeed());
}
[HttpPost]
[TypeFilter(typeof(StrictCollaboratorFilter), Arguments = new object[] { true, true })]
public IActionResult RemoveCollaboratorsFromVehicles(List<string> usernames, List<int> vehicleIds)
{
List<OperationResponse> results = new List<OperationResponse>();
@ -292,37 +280,6 @@ namespace CarCareTracker.Controllers
}
return Json(OperationResponse.Succeed());
}
[HttpPost]
public IActionResult DuplicateVehicleCollaborators(int sourceVehicleId, int destVehicleId)
{
try
{
//retrieve collaborators for both source and destination vehicle id.
if (_userLogic.UserCanEditVehicle(GetUserID(), sourceVehicleId) && _userLogic.UserCanEditVehicle(GetUserID(), destVehicleId))
{
var sourceCollaborators = _userLogic.GetCollaboratorsForVehicle(sourceVehicleId).Select(x => x.UserVehicle.UserId).ToList();
var destCollaborators = _userLogic.GetCollaboratorsForVehicle(destVehicleId).Select(x => x.UserVehicle.UserId).ToList();
sourceCollaborators.RemoveAll(x => destCollaborators.Contains(x));
if (sourceCollaborators.Any())
{
foreach (int collaboratorId in sourceCollaborators)
{
_userLogic.AddUserAccessToVehicle(collaboratorId, destVehicleId);
}
}
else
{
return Json(OperationResponse.Failed("Both vehicles already have identical collaborators"));
}
}
return Json(OperationResponse.Succeed("Collaborators Copied"));
}
catch (Exception ex)
{
_logger.LogError(ex.Message);
return Json(OperationResponse.Failed());
}
}
#region "Shared Methods"
[HttpPost]
@ -354,7 +311,7 @@ namespace CarCareTracker.Controllers
if (caseSensitive)
{
searchResults.AddRange(results.Where(x => JsonSerializer.Serialize(x).Contains(searchQuery)).Select(x => new SearchResult { Id = x.Id, RecordType = ImportMode.ServiceRecord, Description = $"{x.Date.ToShortDateString()} - {x.Description}" }));
}
}
else
{
searchResults.AddRange(results.Where(x => JsonSerializer.Serialize(x).ToLower().Contains(searchQuery)).Select(x => new SearchResult { Id = x.Id, RecordType = ImportMode.ServiceRecord, Description = $"{x.Date.ToShortDateString()} - {x.Description}" }));
@ -367,7 +324,7 @@ namespace CarCareTracker.Controllers
if (caseSensitive)
{
searchResults.AddRange(results.Where(x => JsonSerializer.Serialize(x).Contains(searchQuery)).Select(x => new SearchResult { Id = x.Id, RecordType = ImportMode.RepairRecord, Description = $"{x.Date.ToShortDateString()} - {x.Description}" }));
}
}
else
{
searchResults.AddRange(results.Where(x => JsonSerializer.Serialize(x).ToLower().Contains(searchQuery)).Select(x => new SearchResult { Id = x.Id, RecordType = ImportMode.RepairRecord, Description = $"{x.Date.ToShortDateString()} - {x.Description}" }));
@ -380,7 +337,7 @@ namespace CarCareTracker.Controllers
if (caseSensitive)
{
searchResults.AddRange(results.Where(x => JsonSerializer.Serialize(x).Contains(searchQuery)).Select(x => new SearchResult { Id = x.Id, RecordType = ImportMode.UpgradeRecord, Description = $"{x.Date.ToShortDateString()} - {x.Description}" }));
}
}
else
{
searchResults.AddRange(results.Where(x => JsonSerializer.Serialize(x).ToLower().Contains(searchQuery)).Select(x => new SearchResult { Id = x.Id, RecordType = ImportMode.UpgradeRecord, Description = $"{x.Date.ToShortDateString()} - {x.Description}" }));
@ -406,7 +363,7 @@ namespace CarCareTracker.Controllers
if (caseSensitive)
{
searchResults.AddRange(results.Where(x => JsonSerializer.Serialize(x).Contains(searchQuery)).Select(x => new SearchResult { Id = x.Id, RecordType = ImportMode.SupplyRecord, Description = $"{x.Date.ToShortDateString()} - {x.Description}" }));
}
}
else
{
searchResults.AddRange(results.Where(x => JsonSerializer.Serialize(x).ToLower().Contains(searchQuery)).Select(x => new SearchResult { Id = x.Id, RecordType = ImportMode.SupplyRecord, Description = $"{x.Date.ToShortDateString()} - {x.Description}" }));
@ -419,7 +376,7 @@ namespace CarCareTracker.Controllers
if (caseSensitive)
{
searchResults.AddRange(results.Where(x => JsonSerializer.Serialize(x).Contains(searchQuery)).Select(x => new SearchResult { Id = x.Id, RecordType = ImportMode.PlanRecord, Description = $"{x.DateCreated.ToShortDateString()} - {x.Description}" }));
}
}
else
{
searchResults.AddRange(results.Where(x => JsonSerializer.Serialize(x).ToLower().Contains(searchQuery)).Select(x => new SearchResult { Id = x.Id, RecordType = ImportMode.PlanRecord, Description = $"{x.DateCreated.ToShortDateString()} - {x.Description}" }));
@ -432,7 +389,7 @@ namespace CarCareTracker.Controllers
if (caseSensitive)
{
searchResults.AddRange(results.Where(x => JsonSerializer.Serialize(x).Contains(searchQuery)).Select(x => new SearchResult { Id = x.Id, RecordType = ImportMode.OdometerRecord, Description = $"{x.Date.ToShortDateString()} - {x.Mileage}" }));
}
}
else
{
searchResults.AddRange(results.Where(x => JsonSerializer.Serialize(x).ToLower().Contains(searchQuery)).Select(x => new SearchResult { Id = x.Id, RecordType = ImportMode.OdometerRecord, Description = $"{x.Date.ToShortDateString()} - {x.Mileage}" }));

View File

@ -0,0 +1,71 @@
using CarCareTracker.Helper;
using CarCareTracker.Logic;
using CarCareTracker.Models;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Filters;
using System.Security.Claims;
namespace CarCareTracker.Filter
{
public class StrictCollaboratorFilter: ActionFilterAttribute
{
private readonly IUserLogic _userLogic;
private readonly IConfigHelper _config;
private readonly bool _multiple;
private readonly bool _jsonResponse;
public StrictCollaboratorFilter(IUserLogic userLogic, IConfigHelper config, bool? multiple = false, bool? jsonResponse = false) {
_userLogic = userLogic;
_config = config;
_multiple = multiple ?? false;
_jsonResponse = jsonResponse ?? false;
}
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
if (!filterContext.HttpContext.User.IsInRole(nameof(UserData.IsRootUser)))
{
List<int> vehicleIds = new List<int>();
if (!_multiple && filterContext.ActionArguments.ContainsKey("vehicleId"))
{
vehicleIds.Add(int.Parse(filterContext.ActionArguments["vehicleId"].ToString()));
}
else if (_multiple && filterContext.ActionArguments.ContainsKey("vehicleIds"))
{
vehicleIds.AddRange(filterContext.ActionArguments["vehicleIds"] as List<int>);
}
if (vehicleIds.Any())
{
foreach (int vehicleId in vehicleIds)
{
if (vehicleId != default)
{
var userId = int.Parse(filterContext.HttpContext.User.FindFirstValue(ClaimTypes.NameIdentifier));
if (!_userLogic.UserCanDirectlyEditVehicle(userId, vehicleId))
{
filterContext.Result = _jsonResponse ? new JsonResult(OperationResponse.Failed("Access Denied")) : new RedirectResult("/Error/Unauthorized");
}
}
else
{
var shopSupplyEndpoints = new List<string> { "ImportToVehicleIdFromCsv", "GetSupplyRecordsByVehicleId", "ExportFromVehicleToCsv" };
if (shopSupplyEndpoints.Contains(filterContext.RouteData.Values["action"].ToString()) && !_config.GetServerEnableShopSupplies())
{
//user trying to access shop supplies but shop supplies is not enabled by root user.
filterContext.Result = _jsonResponse ? new JsonResult(OperationResponse.Failed("Access Denied")) : new RedirectResult("/Error/Unauthorized");
}
else if (!shopSupplyEndpoints.Contains(filterContext.RouteData.Values["action"].ToString()))
{
//user trying to access any other endpoints using 0 as vehicle id.
filterContext.Result = _jsonResponse ? new JsonResult(OperationResponse.Failed("Access Denied")) : new RedirectResult("/Error/Unauthorized");
}
}
}
}
else
{
filterContext.Result = _jsonResponse ? new JsonResult(OperationResponse.Failed("Access Denied")) : new RedirectResult("/Error/Unauthorized");
}
}
}
}
}

View File

@ -5,6 +5,5 @@
public List<int> VehicleIds { get; set; } = new List<int>();
public List<string> CommonCollaborators { get; set; } = new List<string>();
public List<string> PartialCollaborators { get; set; } = new List<string>();
public bool CanModifyCollaborators { get; set; } = true;
}
}

View File

@ -11,8 +11,6 @@
<h5 class="modal-title" id="userCollaboratorsModalLabel">@translator.Translate(userLanguage, "Manage Collaborators")</h5>
<button type="button" class="btn-close" onclick="hideCollaboratorsModal()" aria-label="Close"></button>
</div>
@if (Model.CanModifyCollaborators)
{
<div class="modal-body">
@if (showTwoColumns)
{
@ -107,17 +105,4 @@
@:vehiclesToEdit.push(@recordId);
}
adjustCollaboratorsModalSize(@showTwoColumns.ToString().ToLower());
</script>
}
else
{
<div class="modal-body">
<div class="row">
<div class="col-12">
<div class="d-flex justify-content-center">
<span class="lead text-center">@translator.Translate(userLanguage, "You don't have access to manage collaborators for these vehicles")</span>
</div>
</div>
</div>
</div>
}
</script>

File diff suppressed because one or more lines are too long

View File

@ -365,10 +365,12 @@ function deleteVehicles(vehicleIds) {
}).then((result) => {
if (result.isConfirmed) {
$.post('/Vehicle/DeleteVehicles', { vehicleIds: vehicleIds }, function (data) {
if (!data) {
errorToast(genericErrorMessage());
if (data.success) {
loadGarage();
}
else {
errorToast(data.message);
}
loadGarage();
})
}
});
@ -378,7 +380,9 @@ function manageCollaborators(vehicleIds) {
return;
}
$.post('/Vehicle/GetVehiclesCollaborators', { vehicleIds: vehicleIds }, function (data) {
if (data) {
if (isOperationResponse(data)) {
return;
} else if (data) {
$("#userCollaboratorsModalContent").html(data);
$("#userCollaboratorsModal").modal('show');
}

View File

@ -1812,4 +1812,13 @@ function handleAttachmentCopyLink(e) {
let textToCopy = $(e).attr('data-link');
navigator.clipboard.writeText(textToCopy);
successToast("Copied Link to Clipboard");
}
function isOperationResponse(result) {
//checks if response from controller is operationresponse
if (result.success != undefined && result.message != undefined) {
if (!result.success) {
errorToast(result.message);
}
return true;
}
}

View File

@ -219,10 +219,10 @@ function deleteVehicle(vehicleId) {
}).then((result) => {
if (result.isConfirmed) {
$.post('/Vehicle/DeleteVehicle', { vehicleId: vehicleId }, function (data) {
if (data) {
if (data.success) {
window.location.href = '/Home';
} else {
errorToast(genericErrorMessage());
errorToast(data.message);
}
})
}