2
\$\begingroup\$

I have implemented my business logic using the repository pattern. I have an Approve method in my controller. I am calling the service method ApproveUserChangeRequest, which in turn invokes GetUserChangeRequest and ApproveUserChangeRequest in the UnitofWork class. I would like to know if this is standard practice or if there are better ways of doing it. Please bear in mind in to test the service methods.

UserConroller

[HttpPost]
[AllowAnonymous]
[Route("approve-change-request")]
public IActionResult ApproveUserChangeRequest([FromBody] ApproveUserChangeRequests approveUserChangeRequests)
{
    if (!ModelState.IsValid)
    {
        return BadRequest(new ResponseModel()
        {
            ResponseMessages = new Dictionary<string, string[]>
            {
                { "Errors", ModelState.Values.SelectMany(x => x.Errors).Select(x => x.ErrorMessage).ToArray() }
            }
        });
    }    

    var result  = _userService.ApproveUserChangeRequest(approveUserChangeRequests);
    var message = string.Empty;
    if (result.Succeeded)
    {
        return Ok(new ResponseModel()
        {
            ResponseMessages = new Dictionary<string, string[]>
            {
               { "Info", new string[] { $"True" } }
            }
        });
    }
    message = string.Join(";", result.Errors.Select(x => $"Code: {x.Code}. Description: {x.Description}"));
    _logger.Error(new IdentityException($"Error approving user change requests. Message: {message}"));
    return BadRequest();

}

UserService class

public  IdentityResult ApproveUserChangeRequest(ApproveUserChangeRequests approveUserChangeRequests)
{
    var userChangeRequest = _userUow.GetUserChangeRequest(approveUserChangeRequests.UserChangeRequestID);

    IdentityResult result =  _userUow.ApproveUserChangeRequest(userChangeRequest, approveUserChangeRequests.ApprovedByAuthUserId, approveUserChangeRequests.AuthApplicationName);
    return result;
}    

UnitofWork class (uow)

public UserChangeRequest GetUserChangeRequest(int userChangeRequestId)
{
    return UserChangeRequestRepository.GetQueryable(x =>
        x.Id == userChangeRequestId)
        .FirstOrDefault();
}


  public IdentityResult ApproveUserChangeRequest(UserChangeRequest userChangeRequest, int approvedByAuthUserId, string authApplicationName)
{
    var idResult = IdentityResult.Success;

    // Check if UserChangeRequest is still Pending
    bool isUserChangeRequestPending = UserChangeRequestRepository.GetQueryable(x => x.Id == userChangeRequest.Id && x.ChangeStatus == "Pending").Any();

    if (isUserChangeRequestPending && approvedByAuthUserId > 0)
    {
        // Inserting record in the UserChangeRequestApproval table
        InsertUserChangeRequestApproval(userChangeRequest);
        SaveContext();

        //Updating the user details in IdentityDB, ClientCompanyContact and AuthUser tables 
        UpdateUserDetails(userChangeRequest, authApplicationName);
    }
    else
    {
        idResult = IdentityResult.Failed(new IdentityError { Description = "No userchange request to approve" });
    }
    return idResult;
}
\$\endgroup\$
2
  • 3
    \$\begingroup\$ Do you have a usage example with this? \$\endgroup\$
    – Mast
    Nov 14, 2019 at 8:55
  • 1
    \$\begingroup\$ To add to what Mast said, could you add all the related classes? For example, ApproveUserChangeRequests isn't here, we'd need it to give the best review possible. \$\endgroup\$
    – IEatBagels
    Nov 14, 2019 at 13:38

0

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.

Browse other questions tagged or ask your own question.