public async Task <IActionResult> Post([FromBody] UiUserDetails userDetails)
        {
            if (userDetails == null || !ModelState.IsValid || userDetails.Id != "new")
            {
                return(BadRequest(new UiResponse(false, "invalid_input", "Invalid input.")));
            }

            var errorList = new List <UiResponseMessage>();

            var userWithTheSameName = await _userManager.FindByNameAsync(userDetails.UserName);

            if (userWithTheSameName != null)
            {
                errorList.Add(new UiResponseMessage {
                    Code = "duplicate_name", Message = "User with the same name is already exists."
                });
            }

            var userWithTheSameEmail = await _userManager.FindByEmailAsync(userDetails.Email);

            if (userWithTheSameEmail != null)
            {
                errorList.Add(new UiResponseMessage {
                    Code = "duplicate_email", Message = "User with the same email is already exists."
                });
            }

            if (errorList.Count > 0)
            {
                return(BadRequest(new UiResponse(false, errorList)));
            }

            if (userDetails.Id == "new")
            {
                userDetails.Id = Guid.NewGuid().ToString();
            }

            var applicationUser = _mapper.Map <ApplicationUser>(userDetails);

            var userCreationResult = await _userManager.CreateAsync(applicationUser, userDetails.Password);

            if (!userCreationResult.Succeeded)
            {
                foreach (var identityError in userCreationResult.Errors)
                {
                    errorList.Add(new UiResponseMessage {
                        Code = "identity_error", Message = identityError.Description
                    });
                }
                return(BadRequest(new UiResponse(false, errorList)));
            }

            await _userManager.AddToRolesAsync(applicationUser, userDetails.Roles.Select(x => x.Name));

            return(Ok(new UiResponse(true, "user_created", "User created successfully.")));
        }
        public async Task <IActionResult> Put(string id, [FromBody] UiUserDetails userDetails)
        {
            if (!User.IsInRole("Admin") && id != User.FindFirstValue(ClaimTypes.NameIdentifier))
            {
                return(BadRequest(new UiResponse(false, "invalid_input", "Invalid input.")));
            }

            if (userDetails == null || !ModelState.IsValid || userDetails.Id != id || string.IsNullOrWhiteSpace(userDetails.Id))
            {
                return(BadRequest(new UiResponse(false, "invalid_input", "Invalid input.")));
            }

            var errorList = new List <UiResponseMessage>();

            var userWithTheSameName = await _userManager.FindByNameAsync(userDetails.UserName);

            if (userWithTheSameName != null && userWithTheSameName.Id != id)
            {
                errorList.Add(new UiResponseMessage {
                    Code = "duplicate_name", Message = "User with the same name is already exists."
                });
            }

            var userWithTheSameEmail = await _userManager.FindByEmailAsync(userDetails.Email);

            if (userWithTheSameEmail != null && userWithTheSameEmail.Id != id)
            {
                errorList.Add(new UiResponseMessage
                {
                    Code    = "duplicate_email",
                    Message = "User with the same email is already exists."
                });
            }

            var user = await _userManager.FindByIdAsync(id);

            if (user == null)
            {
                errorList.Add(new UiResponseMessage
                {
                    Code    = "internal_error",
                    Message = "User is not available for editing."
                });
            }

            if (errorList.Count > 0)
            {
                return(BadRequest(new UiResponse(false, errorList)));
            }
            user.Email       = userDetails.Email;
            user.PhoneNumber = userDetails.PhoneNumber;
            user.UserName    = userDetails.UserName;
            var updateUserResult = await _userManager.UpdateAsync(user);

            errorList.AddRange(IdentityResultToResponseMessages(updateUserResult));
            if (errorList.Count > 0)
            {
                return(BadRequest(new UiResponse(false, errorList)));
            }
            if (!string.IsNullOrWhiteSpace(userDetails.Password) &&
                userDetails.Password == userDetails.Password2)
            {
                if (await _userManager.HasPasswordAsync(user))
                {
                    await _userManager.RemovePasswordAsync(user);
                }
                var updatePasswordResult = await _userManager.AddPasswordAsync(user, userDetails.Password);

                if (!updatePasswordResult.Succeeded)
                {
                    errorList.AddRange(IdentityResultToResponseMessages(updatePasswordResult));
                    return(BadRequest(new UiResponse(false, errorList)));
                }
            }

            if (User.IsInRole("Admin"))
            {
                var roles = await _userManager.GetRolesAsync(user);

                await _userManager.RemoveFromRolesAsync(user, roles);

                await _userManager.AddToRolesAsync(user, userDetails.Roles.Select(x => x.Name));
            }
            return(Ok(new UiResponse(true, "user_updated", "User updated successfully.")));
        }