diff --git a/note.md b/note.md
index 1c4b54ea..f014d2b3 100644
--- a/note.md
+++ b/note.md
@@ -1,3 +1,17 @@
Test Account
Tài khoản: hongochai10@icloud.com
-Mật Khẩu: Velik@2026
\ No newline at end of file
+Mật Khẩu: Velik@2026
+
+
+curl -s -X POST "http
+://localhost:5001/connect/token" \
+> -H "Content-Type: application/x-www-fo
+rm-urlencoded" \
+> -d "grant_type=password" \
+> -d "client_id=password-client" \
+> -d "client_secret=password-client-secret" \
+> -d "username=hongochai10@icloud.com" \
+
+> -d "password=Velik@2026" \
+> -d "scope=openid profile email api offline_access" 2>
+&1 | jq .
\ No newline at end of file
diff --git a/services/iam-service-net/src/IamService.API/Application/Commands/AccessRequests/AccessRequestCommandHandlers.cs b/services/iam-service-net/src/IamService.API/Application/Commands/AccessRequests/AccessRequestCommandHandlers.cs
new file mode 100644
index 00000000..04a3ab04
--- /dev/null
+++ b/services/iam-service-net/src/IamService.API/Application/Commands/AccessRequests/AccessRequestCommandHandlers.cs
@@ -0,0 +1,159 @@
+using MediatR;
+using IamService.Domain.AggregatesModel.AccessRequestAggregate;
+using IamService.Domain.Exceptions;
+
+namespace IamService.API.Application.Commands.AccessRequests;
+
+///
+/// EN: Handler for CreateAccessRequestCommand.
+/// VI: Handler cho CreateAccessRequestCommand.
+///
+public class CreateAccessRequestCommandHandler : IRequestHandler
+{
+ private readonly IAccessRequestRepository _repository;
+
+ public CreateAccessRequestCommandHandler(IAccessRequestRepository repository)
+ {
+ _repository = repository;
+ }
+
+ public async Task Handle(
+ CreateAccessRequestCommand request,
+ CancellationToken cancellationToken)
+ {
+ var priority = request.Priority.HasValue
+ ? AccessRequestPriority.FromId(request.Priority.Value)
+ : AccessRequestPriority.Medium;
+
+ var accessRequest = AccessRequest.Create(
+ request.RequesterId,
+ request.ResourceType,
+ request.ResourceId,
+ request.RequestedPermission,
+ request.Justification,
+ priority);
+
+ // EN: Add approvers
+ // VI: Thêm approvers
+ foreach (var approverId in request.ApproverIds)
+ {
+ accessRequest.AddApprover(approverId);
+ }
+
+ _repository.Add(accessRequest);
+ await _repository.UnitOfWork.SaveEntitiesAsync(cancellationToken);
+
+ return new CreateAccessRequestCommandResult(
+ accessRequest.Id,
+ accessRequest.Status.Name,
+ accessRequest.CreatedAt);
+ }
+}
+
+///
+/// EN: Handler for SubmitAccessRequestCommand.
+/// VI: Handler cho SubmitAccessRequestCommand.
+///
+public class SubmitAccessRequestCommandHandler : IRequestHandler
+{
+ private readonly IAccessRequestRepository _repository;
+
+ public SubmitAccessRequestCommandHandler(IAccessRequestRepository repository)
+ {
+ _repository = repository;
+ }
+
+ public async Task Handle(SubmitAccessRequestCommand request, CancellationToken cancellationToken)
+ {
+ var accessRequest = await _repository.GetByIdWithApproversAsync(request.RequestId, cancellationToken);
+ if (accessRequest == null)
+ throw new DomainException($"Access request {request.RequestId} not found.");
+
+ accessRequest.Submit();
+ _repository.Update(accessRequest);
+ await _repository.UnitOfWork.SaveEntitiesAsync(cancellationToken);
+
+ return Unit.Value;
+ }
+}
+
+///
+/// EN: Handler for ApproveAccessRequestCommand.
+/// VI: Handler cho ApproveAccessRequestCommand.
+///
+public class ApproveAccessRequestCommandHandler : IRequestHandler
+{
+ private readonly IAccessRequestRepository _repository;
+
+ public ApproveAccessRequestCommandHandler(IAccessRequestRepository repository)
+ {
+ _repository = repository;
+ }
+
+ public async Task Handle(ApproveAccessRequestCommand request, CancellationToken cancellationToken)
+ {
+ var accessRequest = await _repository.GetByIdWithApproversAsync(request.RequestId, cancellationToken);
+ if (accessRequest == null)
+ throw new DomainException($"Access request {request.RequestId} not found.");
+
+ accessRequest.Approve(request.ApproverId, request.Comments);
+ _repository.Update(accessRequest);
+ await _repository.UnitOfWork.SaveEntitiesAsync(cancellationToken);
+
+ return Unit.Value;
+ }
+}
+
+///
+/// EN: Handler for RejectAccessRequestCommand.
+/// VI: Handler cho RejectAccessRequestCommand.
+///
+public class RejectAccessRequestCommandHandler : IRequestHandler
+{
+ private readonly IAccessRequestRepository _repository;
+
+ public RejectAccessRequestCommandHandler(IAccessRequestRepository repository)
+ {
+ _repository = repository;
+ }
+
+ public async Task Handle(RejectAccessRequestCommand request, CancellationToken cancellationToken)
+ {
+ var accessRequest = await _repository.GetByIdWithApproversAsync(request.RequestId, cancellationToken);
+ if (accessRequest == null)
+ throw new DomainException($"Access request {request.RequestId} not found.");
+
+ accessRequest.Reject(request.ApproverId, request.Reason);
+ _repository.Update(accessRequest);
+ await _repository.UnitOfWork.SaveEntitiesAsync(cancellationToken);
+
+ return Unit.Value;
+ }
+}
+
+///
+/// EN: Handler for CancelAccessRequestCommand.
+/// VI: Handler cho CancelAccessRequestCommand.
+///
+public class CancelAccessRequestCommandHandler : IRequestHandler
+{
+ private readonly IAccessRequestRepository _repository;
+
+ public CancelAccessRequestCommandHandler(IAccessRequestRepository repository)
+ {
+ _repository = repository;
+ }
+
+ public async Task Handle(CancelAccessRequestCommand request, CancellationToken cancellationToken)
+ {
+ var accessRequest = await _repository.GetByIdAsync(request.RequestId, cancellationToken);
+ if (accessRequest == null)
+ throw new DomainException($"Access request {request.RequestId} not found.");
+
+ accessRequest.Cancel();
+ _repository.Update(accessRequest);
+ await _repository.UnitOfWork.SaveEntitiesAsync(cancellationToken);
+
+ return Unit.Value;
+ }
+}
diff --git a/services/iam-service-net/src/IamService.API/Application/Commands/AccessRequests/AccessRequestCommands.cs b/services/iam-service-net/src/IamService.API/Application/Commands/AccessRequests/AccessRequestCommands.cs
new file mode 100644
index 00000000..a2f1c95a
--- /dev/null
+++ b/services/iam-service-net/src/IamService.API/Application/Commands/AccessRequests/AccessRequestCommands.cs
@@ -0,0 +1,51 @@
+using MediatR;
+
+namespace IamService.API.Application.Commands.AccessRequests;
+
+///
+/// EN: Command to create a new access request.
+/// VI: Command để tạo yêu cầu truy cập mới.
+///
+public record CreateAccessRequestCommand(
+ Guid RequesterId,
+ string ResourceType,
+ Guid ResourceId,
+ string RequestedPermission,
+ string? Justification,
+ int? Priority,
+ List ApproverIds) : IRequest;
+
+public record CreateAccessRequestCommandResult(
+ Guid Id,
+ string Status,
+ DateTime CreatedAt);
+
+///
+/// EN: Command to submit access request for approval.
+/// VI: Command để gửi yêu cầu truy cập để phê duyệt.
+///
+public record SubmitAccessRequestCommand(Guid RequestId) : IRequest;
+
+///
+/// EN: Command to approve access request.
+/// VI: Command để phê duyệt yêu cầu truy cập.
+///
+public record ApproveAccessRequestCommand(
+ Guid RequestId,
+ Guid ApproverId,
+ string? Comments) : IRequest;
+
+///
+/// EN: Command to reject access request.
+/// VI: Command để từ chối yêu cầu truy cập.
+///
+public record RejectAccessRequestCommand(
+ Guid RequestId,
+ Guid ApproverId,
+ string? Reason) : IRequest;
+
+///
+/// EN: Command to cancel access request.
+/// VI: Command để hủy yêu cầu truy cập.
+///
+public record CancelAccessRequestCommand(Guid RequestId) : IRequest;
diff --git a/services/iam-service-net/src/IamService.API/Application/Queries/AccessRequests/AccessRequestQueries.cs b/services/iam-service-net/src/IamService.API/Application/Queries/AccessRequests/AccessRequestQueries.cs
new file mode 100644
index 00000000..007418f6
--- /dev/null
+++ b/services/iam-service-net/src/IamService.API/Application/Queries/AccessRequests/AccessRequestQueries.cs
@@ -0,0 +1,52 @@
+using MediatR;
+
+namespace IamService.API.Application.Queries.AccessRequests;
+
+///
+/// EN: Query to get access request by ID.
+/// VI: Query để lấy yêu cầu truy cập theo ID.
+///
+public record GetAccessRequestByIdQuery(Guid Id) : IRequest;
+
+///
+/// EN: Query to get my access requests.
+/// VI: Query để lấy yêu cầu truy cập của tôi.
+///
+public record GetMyAccessRequestsQuery(Guid RequesterId) : IRequest>;
+
+///
+/// EN: Query to get pending approvals for current user.
+/// VI: Query để lấy các yêu cầu đang chờ phê duyệt của user hiện tại.
+///
+public record GetPendingApprovalsQuery(Guid ApproverId) : IRequest>;
+
+///
+/// EN: Access request DTO.
+/// VI: DTO cho yêu cầu truy cập.
+///
+public record AccessRequestDto(
+ Guid Id,
+ Guid RequesterId,
+ string ResourceType,
+ Guid ResourceId,
+ string RequestedPermission,
+ string? Justification,
+ string Status,
+ string Priority,
+ DateTime CreatedAt,
+ DateTime? SubmittedAt,
+ DateTime? ResolvedAt,
+ DateTime? ExpiresAt,
+ IEnumerable Approvers);
+
+///
+/// EN: Access request approver DTO.
+/// VI: DTO cho người phê duyệt yêu cầu truy cập.
+///
+public record AccessRequestApproverDto(
+ Guid Id,
+ Guid UserId,
+ int Order,
+ string Status,
+ DateTime? RespondedAt,
+ string? Comments);
diff --git a/services/iam-service-net/src/IamService.API/Application/Queries/AccessRequests/AccessRequestQueryHandlers.cs b/services/iam-service-net/src/IamService.API/Application/Queries/AccessRequests/AccessRequestQueryHandlers.cs
new file mode 100644
index 00000000..fab37bf8
--- /dev/null
+++ b/services/iam-service-net/src/IamService.API/Application/Queries/AccessRequests/AccessRequestQueryHandlers.cs
@@ -0,0 +1,127 @@
+using MediatR;
+using IamService.Domain.AggregatesModel.AccessRequestAggregate;
+
+namespace IamService.API.Application.Queries.AccessRequests;
+
+///
+/// EN: Handler for GetAccessRequestByIdQuery.
+/// VI: Handler cho GetAccessRequestByIdQuery.
+///
+public class GetAccessRequestByIdQueryHandler : IRequestHandler
+{
+ private readonly IAccessRequestRepository _repository;
+
+ public GetAccessRequestByIdQueryHandler(IAccessRequestRepository repository)
+ {
+ _repository = repository;
+ }
+
+ public async Task Handle(GetAccessRequestByIdQuery request, CancellationToken cancellationToken)
+ {
+ var accessRequest = await _repository.GetByIdWithApproversAsync(request.Id, cancellationToken);
+ return accessRequest != null ? MapToDto(accessRequest) : null;
+ }
+
+ private static AccessRequestDto MapToDto(AccessRequest request) => new(
+ request.Id,
+ request.RequesterId,
+ request.ResourceType,
+ request.ResourceId,
+ request.RequestedPermission,
+ request.Justification,
+ request.Status.Name,
+ request.Priority.Name,
+ request.CreatedAt,
+ request.SubmittedAt,
+ request.ResolvedAt,
+ request.ExpiresAt,
+ request.Approvers.Select(a => new AccessRequestApproverDto(
+ a.Id,
+ a.UserId,
+ a.Order,
+ a.Status.Name,
+ a.RespondedAt,
+ a.Comments)));
+}
+
+///
+/// EN: Handler for GetMyAccessRequestsQuery.
+/// VI: Handler cho GetMyAccessRequestsQuery.
+///
+public class GetMyAccessRequestsQueryHandler : IRequestHandler>
+{
+ private readonly IAccessRequestRepository _repository;
+
+ public GetMyAccessRequestsQueryHandler(IAccessRequestRepository repository)
+ {
+ _repository = repository;
+ }
+
+ public async Task> Handle(GetMyAccessRequestsQuery request, CancellationToken cancellationToken)
+ {
+ var requests = await _repository.GetByRequesterIdAsync(request.RequesterId, cancellationToken);
+ return requests.Select(MapToDto);
+ }
+
+ private static AccessRequestDto MapToDto(AccessRequest request) => new(
+ request.Id,
+ request.RequesterId,
+ request.ResourceType,
+ request.ResourceId,
+ request.RequestedPermission,
+ request.Justification,
+ request.Status.Name,
+ request.Priority.Name,
+ request.CreatedAt,
+ request.SubmittedAt,
+ request.ResolvedAt,
+ request.ExpiresAt,
+ request.Approvers.Select(a => new AccessRequestApproverDto(
+ a.Id,
+ a.UserId,
+ a.Order,
+ a.Status.Name,
+ a.RespondedAt,
+ a.Comments)));
+}
+
+///
+/// EN: Handler for GetPendingApprovalsQuery.
+/// VI: Handler cho GetPendingApprovalsQuery.
+///
+public class GetPendingApprovalsQueryHandler : IRequestHandler>
+{
+ private readonly IAccessRequestRepository _repository;
+
+ public GetPendingApprovalsQueryHandler(IAccessRequestRepository repository)
+ {
+ _repository = repository;
+ }
+
+ public async Task> Handle(GetPendingApprovalsQuery request, CancellationToken cancellationToken)
+ {
+ var requests = await _repository.GetPendingByApproverIdAsync(request.ApproverId, cancellationToken);
+ return requests.Select(MapToDto);
+ }
+
+ private static AccessRequestDto MapToDto(AccessRequest request) => new(
+ request.Id,
+ request.RequesterId,
+ request.ResourceType,
+ request.ResourceId,
+ request.RequestedPermission,
+ request.Justification,
+ request.Status.Name,
+ request.Priority.Name,
+ request.CreatedAt,
+ request.SubmittedAt,
+ request.ResolvedAt,
+ request.ExpiresAt,
+ request.Approvers.Select(a => new AccessRequestApproverDto(
+ a.Id,
+ a.UserId,
+ a.Order,
+ a.Status.Name,
+ a.RespondedAt,
+ a.Comments)));
+}
diff --git a/services/iam-service-net/src/IamService.API/Application/Validations/AccessRequestCommandValidators.cs b/services/iam-service-net/src/IamService.API/Application/Validations/AccessRequestCommandValidators.cs
new file mode 100644
index 00000000..a22f30d6
--- /dev/null
+++ b/services/iam-service-net/src/IamService.API/Application/Validations/AccessRequestCommandValidators.cs
@@ -0,0 +1,111 @@
+using FluentValidation;
+using IamService.API.Application.Commands.AccessRequests;
+
+namespace IamService.API.Application.Validations;
+
+///
+/// EN: Validator for CreateAccessRequestCommand.
+/// VI: Validator cho CreateAccessRequestCommand.
+///
+public class CreateAccessRequestCommandValidator : AbstractValidator
+{
+ private static readonly string[] ValidResourceTypes = ["Organization", "Group", "Role", "Application", "Resource"];
+
+ public CreateAccessRequestCommandValidator()
+ {
+ RuleFor(x => x.RequesterId)
+ .NotEmpty().WithMessage("Requester ID is required");
+
+ RuleFor(x => x.ResourceType)
+ .NotEmpty().WithMessage("Resource type is required")
+ .MaximumLength(100).WithMessage("Resource type cannot exceed 100 characters")
+ .Must(t => ValidResourceTypes.Contains(t))
+ .WithMessage($"Resource type must be one of: {string.Join(", ", ValidResourceTypes)}");
+
+ RuleFor(x => x.ResourceId)
+ .NotEmpty().WithMessage("Resource ID is required");
+
+ RuleFor(x => x.RequestedPermission)
+ .NotEmpty().WithMessage("Requested permission is required")
+ .MaximumLength(100).WithMessage("Requested permission cannot exceed 100 characters");
+
+ RuleFor(x => x.Justification)
+ .MaximumLength(2000).WithMessage("Justification cannot exceed 2000 characters")
+ .When(x => x.Justification != null);
+
+ RuleFor(x => x.Priority)
+ .Must(p => p == null || (p >= 1 && p <= 4))
+ .WithMessage("Priority must be 1 (Low), 2 (Medium), 3 (High), or 4 (Critical)");
+
+ RuleFor(x => x.ApproverIds)
+ .NotEmpty().WithMessage("At least one approver is required")
+ .Must(ids => ids.All(id => id != Guid.Empty))
+ .WithMessage("All approver IDs must be valid GUIDs");
+ }
+}
+
+///
+/// EN: Validator for ApproveAccessRequestCommand.
+/// VI: Validator cho ApproveAccessRequestCommand.
+///
+public class ApproveAccessRequestCommandValidator : AbstractValidator
+{
+ public ApproveAccessRequestCommandValidator()
+ {
+ RuleFor(x => x.RequestId)
+ .NotEmpty().WithMessage("Request ID is required");
+
+ RuleFor(x => x.ApproverId)
+ .NotEmpty().WithMessage("Approver ID is required");
+
+ RuleFor(x => x.Comments)
+ .MaximumLength(1000).WithMessage("Comments cannot exceed 1000 characters")
+ .When(x => x.Comments != null);
+ }
+}
+
+///
+/// EN: Validator for RejectAccessRequestCommand.
+/// VI: Validator cho RejectAccessRequestCommand.
+///
+public class RejectAccessRequestCommandValidator : AbstractValidator
+{
+ public RejectAccessRequestCommandValidator()
+ {
+ RuleFor(x => x.RequestId)
+ .NotEmpty().WithMessage("Request ID is required");
+
+ RuleFor(x => x.ApproverId)
+ .NotEmpty().WithMessage("Approver ID is required");
+
+ RuleFor(x => x.Reason)
+ .MaximumLength(1000).WithMessage("Reason cannot exceed 1000 characters")
+ .When(x => x.Reason != null);
+ }
+}
+
+///
+/// EN: Validator for SubmitAccessRequestCommand.
+/// VI: Validator cho SubmitAccessRequestCommand.
+///
+public class SubmitAccessRequestCommandValidator : AbstractValidator
+{
+ public SubmitAccessRequestCommandValidator()
+ {
+ RuleFor(x => x.RequestId)
+ .NotEmpty().WithMessage("Request ID is required");
+ }
+}
+
+///
+/// EN: Validator for CancelAccessRequestCommand.
+/// VI: Validator cho CancelAccessRequestCommand.
+///
+public class CancelAccessRequestCommandValidator : AbstractValidator
+{
+ public CancelAccessRequestCommandValidator()
+ {
+ RuleFor(x => x.RequestId)
+ .NotEmpty().WithMessage("Request ID is required");
+ }
+}
diff --git a/services/iam-service-net/src/IamService.API/Controllers/AccessRequestsController.cs b/services/iam-service-net/src/IamService.API/Controllers/AccessRequestsController.cs
new file mode 100644
index 00000000..68bb0c38
--- /dev/null
+++ b/services/iam-service-net/src/IamService.API/Controllers/AccessRequestsController.cs
@@ -0,0 +1,246 @@
+using Asp.Versioning;
+using MediatR;
+using Microsoft.AspNetCore.Authorization;
+using Microsoft.AspNetCore.Mvc;
+using Swashbuckle.AspNetCore.Annotations;
+using IamService.API.Application.Common;
+using IamService.API.Application.Commands.AccessRequests;
+using IamService.API.Application.Queries.AccessRequests;
+
+namespace IamService.API.Controllers;
+
+///
+/// EN: Access request management controller.
+/// VI: Controller quản lý yêu cầu truy cập.
+///
+[ApiController]
+[ApiVersion("1.0")]
+[Route("api/v{version:apiVersion}/access-requests")]
+[Authorize(AuthenticationSchemes = "Bearer")]
+[SwaggerTag("Access request management - requires authentication")]
+public class AccessRequestsController : ControllerBase
+{
+ private readonly IMediator _mediator;
+ private readonly ILogger _logger;
+
+ public AccessRequestsController(IMediator mediator, ILogger logger)
+ {
+ _mediator = mediator;
+ _logger = logger;
+ }
+
+ ///
+ /// EN: Create a new access request.
+ /// VI: Tạo yêu cầu truy cập mới.
+ ///
+ [HttpPost]
+ [SwaggerOperation(Summary = "Create access request", OperationId = "CreateAccessRequest")]
+ [SwaggerResponse(StatusCodes.Status201Created, "Request created", typeof(ApiResponse))]
+ public async Task CreateAccessRequest(
+ [FromBody] CreateAccessRequestRequest request,
+ CancellationToken cancellationToken = default)
+ {
+ var command = new CreateAccessRequestCommand(
+ request.RequesterId,
+ request.ResourceType,
+ request.ResourceId,
+ request.RequestedPermission,
+ request.Justification,
+ request.Priority,
+ request.ApproverIds);
+
+ var result = await _mediator.Send(command, cancellationToken);
+
+ return CreatedAtAction(nameof(GetAccessRequestById), new { id = result.Id },
+ ApiResponse.Ok(new AccessRequestResponse
+ {
+ Id = result.Id,
+ Status = result.Status,
+ CreatedAt = result.CreatedAt
+ }));
+ }
+
+ ///
+ /// EN: Get access request by ID.
+ /// VI: Lấy yêu cầu truy cập theo ID.
+ ///
+ [HttpGet("{id:guid}")]
+ [SwaggerOperation(Summary = "Get access request by ID", OperationId = "GetAccessRequestById")]
+ [SwaggerResponse(StatusCodes.Status200OK, "Request found", typeof(ApiResponse))]
+ [SwaggerResponse(StatusCodes.Status404NotFound, "Request not found")]
+ public async Task GetAccessRequestById(
+ [FromRoute] Guid id,
+ CancellationToken cancellationToken = default)
+ {
+ var result = await _mediator.Send(new GetAccessRequestByIdQuery(id), cancellationToken);
+ if (result == null)
+ return NotFound(ApiResponse.Fail("REQUEST_NOT_FOUND", $"Access request {id} not found."));
+
+ return Ok(ApiResponse.Ok(result));
+ }
+
+ ///
+ /// EN: Get my access requests.
+ /// VI: Lấy yêu cầu truy cập của tôi.
+ ///
+ [HttpGet]
+ [SwaggerOperation(Summary = "Get my access requests", OperationId = "GetMyAccessRequests")]
+ [SwaggerResponse(StatusCodes.Status200OK, "Requests returned", typeof(ApiResponse>))]
+ public async Task GetMyAccessRequests(
+ [FromQuery] Guid requesterId,
+ CancellationToken cancellationToken = default)
+ {
+ var result = await _mediator.Send(new GetMyAccessRequestsQuery(requesterId), cancellationToken);
+ return Ok(ApiResponse>.Ok(result));
+ }
+
+ ///
+ /// EN: Get pending approvals for me.
+ /// VI: Lấy các yêu cầu đang chờ tôi phê duyệt.
+ ///
+ [HttpGet("pending")]
+ [SwaggerOperation(Summary = "Get pending approvals", OperationId = "GetPendingApprovals")]
+ [SwaggerResponse(StatusCodes.Status200OK, "Pending approvals returned", typeof(ApiResponse>))]
+ public async Task GetPendingApprovals(
+ [FromQuery] Guid approverId,
+ CancellationToken cancellationToken = default)
+ {
+ var result = await _mediator.Send(new GetPendingApprovalsQuery(approverId), cancellationToken);
+ return Ok(ApiResponse>.Ok(result));
+ }
+
+ ///
+ /// EN: Submit access request for approval.
+ /// VI: Gửi yêu cầu truy cập để phê duyệt.
+ ///
+ [HttpPost("{id:guid}/submit")]
+ [SwaggerOperation(Summary = "Submit access request", OperationId = "SubmitAccessRequest")]
+ [SwaggerResponse(StatusCodes.Status200OK, "Request submitted")]
+ [SwaggerResponse(StatusCodes.Status404NotFound, "Request not found")]
+ public async Task SubmitAccessRequest(
+ [FromRoute] Guid id,
+ CancellationToken cancellationToken = default)
+ {
+ try
+ {
+ await _mediator.Send(new SubmitAccessRequestCommand(id), cancellationToken);
+ return Ok(ApiResponse