Skip to content

Commit ffcef3e

Browse files
committed
feat: Update user roles and permissions for enhanced user management
- Added new user roles: UserManagementRoles and MerchandiserAccountManagementRoles in UserRoles.cs. - Updated authorization roles in CratesController and InvoiceController to include PodOperator. - Modified InventoryTransferController to restrict access to Admin, StockController, and DepotController roles. - Adjusted InvoiceController to restrict customer access based on user roles. - Enhanced UserManagementController to require permissions for creating users and managing merchandiser accounts. - Updated UploadCratePodHandler and ValidateBulkCratePodsHandler to include PodOperator in role checks. - Introduced new permission: CreateMerchandiserAccounts in Permission.cs and updated related services.
1 parent 9c4787d commit ffcef3e

14 files changed

Lines changed: 2403 additions & 2355 deletions

File tree

ShopInventory.Web/Components/Pages/CratePodHistory.razor

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -174,7 +174,7 @@
174174
@onclick="() => DownloadAttachmentAsync(attachment)">
175175
Download
176176
</button>
177-
@if (canSubmitPods)
177+
@if (canDeleteCratePods)
178178
{
179179
<button type="button" class="crpod-attachment-action crpod-attachment-action-delete"
180180
@onclick="() => BeginDeleteAttachment(pod, attachment)">

ShopInventory.Web/Components/Pages/CratePodsPageBase.cs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -552,6 +552,11 @@ protected async Task CloseAttachmentViewerAsync()
552552

553553
protected void BeginDeleteAttachment(CratePodSubmissionDto pod, DocumentAttachmentDto attachment)
554554
{
555+
if (!canDeleteCratePods)
556+
{
557+
return;
558+
}
559+
555560
podToDelete = pod;
556561
attachmentToDelete = attachment;
557562
attachmentDeleteContext = $"{GetPodReferenceLabel(pod)} {pod.SubmissionRole} submission";
@@ -568,7 +573,7 @@ protected void CancelDeleteAttachment()
568573

569574
protected async Task DeletePodAsync()
570575
{
571-
if (podToDelete is null || isDeletingAttachment)
576+
if (!canDeleteCratePods || podToDelete is null || isDeletingAttachment)
572577
{
573578
return;
574579
}

ShopInventory.Web/Components/Pages/CrateTrackingPageBase.cs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ public abstract class CrateTrackingPageBase : ComponentBase
2727
protected bool canRaiseGrvs;
2828
protected bool canChoosePodRole;
2929
protected bool canSubmitPods;
30+
protected bool canDeleteCratePods;
3031
protected bool canViewCrateTransactions;
3132
protected bool canViewCrateGrvs;
3233

@@ -112,8 +113,9 @@ protected async Task LoadCurrentUserAsync()
112113

113114
canManageOpeningBalances = isAdmin;
114115
canRaiseGrvs = isAdmin || isManager || isMerchandiser;
115-
canChoosePodRole = isAdmin || isManager || isOperator;
116-
canSubmitPods = isAdmin || isManager || isMerchandiser || isOperator || isDriver;
116+
canChoosePodRole = isAdmin || isManager || isPodOperator || isOperator;
117+
canSubmitPods = isAdmin || isManager || isMerchandiser || isPodOperator || isOperator || isDriver;
118+
canDeleteCratePods = isAdmin || isManager || isMerchandiser || isOperator || isDriver;
117119
canViewCrateTransactions = canSubmitPods || isPodOperator || isOperator || isSalesRep;
118120
canViewCrateGrvs = canRaiseGrvs || isDriver || isSalesRep;
119121

ShopInventory.Web/Components/Pages/CreateMerchandiserAccount.razor

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
@page "/merchandiser-account"
2+
@using ShopInventory.Web.Data
23
@using Microsoft.AspNetCore.Authorization
34
@using Microsoft.AspNetCore.Components.Forms
4-
@attribute [Authorize(Roles = "Admin,SalesRep")]
5+
@attribute [Authorize(Roles = UserRoles.MerchandiserAccountManagementRoles)]
56
@rendermode InteractiveServer
67

78
<PageTitle>Manage Merchandiser Accounts - Shop Inventory</PageTitle>

ShopInventory.Web/Components/Pages/UserManagement.razor

Lines changed: 2361 additions & 2341 deletions
Large diffs are not rendered by default.

ShopInventory.Web/Data/UserRoles.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,8 @@ public static class UserRoles
7474
public const string PurchasingRoles = "Admin,Manager";
7575

7676
public const string PodRoles = "Admin,Cashier,PodOperator,Driver,SalesRep";
77+
public const string UserManagementRoles = "Admin,PodOperator,SalesRep";
78+
public const string MerchandiserAccountManagementRoles = "Admin,SalesRep";
7779

7880
/// <summary>
7981
/// Get all available roles

ShopInventory/Controllers/CratesController.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ public async Task<IActionResult> GetPods(
7373
}
7474

7575
[HttpPost("pods/validate-bulk")]
76-
[Authorize(Roles = "Admin,Manager,Merchandiser,Operator,Driver")]
76+
[Authorize(Roles = "Admin,Manager,Merchandiser,PodOperator,Operator,Driver")]
7777
[ProducesResponseType(typeof(BulkCratePodValidationResponseDto), StatusCodes.Status200OK)]
7878
[ProducesResponseType(typeof(ErrorResponseDto), StatusCodes.Status400BadRequest)]
7979
public async Task<IActionResult> ValidateBulkPods(
@@ -218,7 +218,7 @@ public async Task<IActionResult> DeleteOpeningBalance(
218218
}
219219

220220
[HttpPost("transactions/{crateTransactionId:int}/pods")]
221-
[Authorize(Roles = "Admin,Manager,Merchandiser,Operator,Driver")]
221+
[Authorize(Roles = "Admin,Manager,Merchandiser,PodOperator,Operator,Driver")]
222222
[RequestSizeLimit(20 * 1024 * 1024)]
223223
[ProducesResponseType(typeof(CratePodSubmissionDto), StatusCodes.Status200OK)]
224224
public async Task<IActionResult> UploadCratePod(

ShopInventory/Controllers/InventoryTransferController.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ namespace ShopInventory.Controllers;
2323
public class InventoryTransferController(IMediator mediator) : ApiControllerBase
2424
{
2525
[HttpPost]
26+
[Authorize(Roles = "Admin,StockController,DepotController")]
2627
[ProducesResponseType(typeof(InventoryTransferCreatedResponseDto), StatusCodes.Status201Created)]
2728
[ProducesResponseType(typeof(InventoryTransferCreatedResponseDto), StatusCodes.Status202Accepted)]
2829
[ProducesResponseType(typeof(ErrorResponseDto), StatusCodes.Status400BadRequest)]
@@ -94,6 +95,7 @@ public async Task<IActionResult> GetInventoryTransferByDocEntry(int docEntry, Ca
9495
#region Transfer Request Endpoints
9596

9697
[HttpPost("request")]
98+
[Authorize(Roles = "Admin,StockController,DepotController")]
9799
[ProducesResponseType(typeof(TransferRequestCreatedResponseDto), StatusCodes.Status201Created)]
98100
[ProducesResponseType(typeof(ErrorResponseDto), StatusCodes.Status400BadRequest)]
99101
public async Task<IActionResult> CreateTransferRequest(
@@ -106,6 +108,7 @@ public async Task<IActionResult> CreateTransferRequest(
106108
}
107109

108110
[HttpPost("request/{docEntry:int}/convert")]
111+
[Authorize(Roles = "Admin,StockController,DepotController")]
109112
[ProducesResponseType(typeof(TransferRequestConvertedResponseDto), StatusCodes.Status201Created)]
110113
public async Task<IActionResult> ConvertTransferRequestToTransfer(int docEntry, CancellationToken cancellationToken)
111114
{
@@ -116,6 +119,7 @@ public async Task<IActionResult> ConvertTransferRequestToTransfer(int docEntry,
116119
}
117120

118121
[HttpPost("request/{docEntry:int}/close")]
122+
[Authorize(Roles = "Admin,StockController,DepotController")]
119123
[ProducesResponseType(StatusCodes.Status200OK)]
120124
public async Task<IActionResult> CloseTransferRequest(int docEntry, CancellationToken cancellationToken)
121125
{

ShopInventory/Controllers/InvoiceController.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,7 @@ public async Task<IActionResult> GetInvoiceByDocNum(
104104
int docNum,
105105
CancellationToken cancellationToken = default)
106106
{
107-
var restrictToAssignedCustomers = User.IsInRole("Driver") || User.IsInRole("PodOperator") || User.IsInRole("Operator");
107+
var restrictToAssignedCustomers = User.IsInRole("Driver") || User.IsInRole("Operator");
108108
var result = await mediator.Send(
109109
new GetInvoiceByDocNumQuery(
110110
docNum,
@@ -170,7 +170,7 @@ public async Task<IActionResult> GetInvoicesByCustomer(
170170
[FromQuery] int? page = null,
171171
[FromQuery] int? pageSize = null)
172172
{
173-
var restrictToAssignedCustomers = User.IsInRole("Driver") || User.IsInRole("PodOperator");
173+
var restrictToAssignedCustomers = User.IsInRole("Driver");
174174
var result = await mediator.Send(
175175
new GetInvoicesByCustomerQuery(
176176
cardCode,
@@ -248,7 +248,7 @@ public async Task<IActionResult> UploadPod(
248248
}
249249

250250
[HttpPost("{docEntry:int}/crate-pod")]
251-
[Authorize(Roles = "Admin,Manager,Merchandiser,Operator,Driver")]
251+
[Authorize(Roles = "Admin,Manager,Merchandiser,PodOperator,Operator,Driver")]
252252
[ProducesResponseType(typeof(CratePodSubmissionDto), StatusCodes.Status200OK)]
253253
[ProducesResponseType(typeof(ErrorResponseDto), StatusCodes.Status400BadRequest)]
254254
[RequestSizeLimit(20 * 1024 * 1024)]

ShopInventory/Controllers/UserManagementController.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ public async Task<IActionResult> GetUser(Guid id, CancellationToken cancellation
5151
}
5252

5353
[HttpPost]
54-
[RequirePermission(Permission.CreateUsers)]
54+
[RequirePermission(Permission.CreateUsers, Permission.CreateMerchandiserAccounts)]
5555
public async Task<IActionResult> CreateUser([FromBody] CreateUserDetailRequest request, CancellationToken cancellationToken)
5656
{
5757
var result = await mediator.Send(new CreateUserCommand(request), cancellationToken);
@@ -61,15 +61,15 @@ public async Task<IActionResult> CreateUser([FromBody] CreateUserDetailRequest r
6161
}
6262

6363
[HttpGet("merchandisers")]
64-
[RequirePermission(Permission.CreateUsers)]
64+
[RequirePermission(Permission.CreateMerchandiserAccounts)]
6565
public async Task<IActionResult> GetManagedMerchandiserAccounts(CancellationToken cancellationToken)
6666
{
6767
var result = await mediator.Send(new GetManagedMerchandiserAccountsQuery(), cancellationToken);
6868
return result.Match(value => Ok(value), errors => Problem(errors));
6969
}
7070

7171
[HttpPut("merchandisers/{id:guid}/assigned-customers")]
72-
[RequirePermission(Permission.CreateUsers)]
72+
[RequirePermission(Permission.CreateMerchandiserAccounts)]
7373
public async Task<IActionResult> UpdateMerchandiserAssignedCustomers(
7474
Guid id,
7575
[FromBody] UpdateMerchandiserAssignedCustomersRequest request,

0 commit comments

Comments
 (0)