public async Task <ActionResult <AuthResult> > AccessTokenAsync(UserCredentials credentials)
        {
            var user = await _userService.GetUserAsync(credentials.UserName);

            if (user == null)
            {
                return(NotFound(OperationDetails.Error($"User '{credentials.UserName}' not found.")));
            }
            var identity = user.Identity as UserIdentity;

            if (await _userManager.CheckPasswordAsync(identity, credentials.Password))
            {
                var result = new AuthResult
                {
                    AccessToken = await JwtHelper.GetEncodedJwtAsync(identity, _userManager),
                    AppState    = new InitialAppState
                    {
                        IsAuthenticated = true,
                        UserName        = user.Identity.UserName,
                        Photo           = Url.Content(user.Profile.PhotoFilePath),
                        IsAdmin         = await _userManager.IsInRoleAsync(user.Identity as UserIdentity, "Administrator"),
                    }
                };
                if (result.AppState.IsAdmin)
                {
                    result.AppState.NewMessagesCount = (await _messageService.GetMessagesAsync()).Where(x => !x.IsRead).Count();
                    result.AppState.Roles            = result.AppState.IsAdmin ? _roleManager.Roles.Select(role => role.Name) : null;
                }
                return(result);
            }
            return(BadRequest(OperationDetails.Error("Invalid password.")));
        }
        public override void OnException(ExceptionContext context)
        {
            var ex = context.Exception;

            if (ex is EntityNotFoundException)
            {
                context.Result = new NotFoundObjectResult(OperationDetails.Error(ex.Message));
                return;
            }

            if (ex is DuplicateEntityException)
            {
                context.Result = new BadRequestObjectResult(OperationDetails.Error(ex.Message));
                return;
            }

            if (ex is DomainServiceException)
            {
                string message;
                if (ex.InnerException != null && ex.InnerException is InvalidOperationException)
                {
                    message = ex.InnerException.Message;
                }
                else
                {
                    message = ex.Message;
                }
                context.Result = new BadRequestObjectResult(OperationDetails.Error(message));
                return;
            }

            context.Result = new StatusCodeResult(500);
        }
        public IActionResult Withdraw([FromBody] double amount)
        {
            if (amount < _bankingService.GetBankOperationMinAmoun())
            {
                return(BadRequest(OperationDetails.Error("Withdraw error")));
            }

            var result = _bankingService.Withdraw(new BankOperation(_userIdentityService.GetUserId(User.Claims), amount));

            return(result.Succeeded == true ? (IActionResult)Ok(result) : BadRequest(result));
        }
        public async Task <ActionResult <DomainUser> > GetUserAsync([FromRoute] string userName)
        {
            var user = await _userService.GetUserAsync(userName);

            if (user == null)
            {
                return(NotFound(OperationDetails.Error($"The entity of type '{typeof(DomainUser)}' with value '{userName}' " +
                                                       $"for '{nameof(IUserIdentity.UserName)}' not found.")));
            }
            return(PrepareForReturn(user));
        }
        public IActionResult RegisterUser([FromBody] Identity identity)
        {
            if (identity == null)
            {
                return(BadRequest(OperationDetails.Error("Registration error")));
            }

            var result = _userIdentityService.RegisterUser(identity.Name, identity.Password);

            return(result.Succeeded == true ? (IActionResult)Ok(result) : BadRequest(result));
        }
        public IActionResult Transfer([FromBody] BankOperation bankOperation)
        {
            if (bankOperation == null || bankOperation.Amount < _bankingService.GetBankOperationMinAmoun())
            {
                return(BadRequest(OperationDetails.Error("Transfer error")));
            }

            bankOperation.SenderId = _userIdentityService.GetUserId(User.Claims);
            var result = _bankingService.Transfer(bankOperation);

            return(result.Succeeded == true ? (IActionResult)Ok(result) : BadRequest(result));
        }
        public async Task <IActionResult> RegisterAsync([FromForm] RegisterUserBindingModel model)
        {
            var user = await _userService.GetUserAsync(model.UserName);

            if (user == null)
            {
                var creator = await _userService.GetUserAsync(User?.Identity?.Name);

                await _userService.CreateUserAsync(model.UserName, model.Password, model.Email, model.Role, creator);

                return(Ok(OperationDetails.Success($"User '@{model.UserName}' has been registered successfully.")));
            }
            else
            {
                return(BadRequest(OperationDetails.Error($"User '@{model.UserName}' already exists.")));
            }
        }
        private UserIdentityController GetUserIdentityController()
        {
            var mockIdentityService = new Mock <IUserIdentityService>();

            mockIdentityService.Setup(identit => identit.IdentityUser(It.Is <string>(s => s.Contains(invalidUser.Name)),
                                                                      It.IsAny <string>())).Returns(invalidUser);

            mockIdentityService.Setup(identit => identit.IdentityUser(It.Is <string>(s => s.Contains(validUser.Name)),
                                                                      It.Is <string>(s => s.Contains(validUser.Password)))).Returns(validUser);

            mockIdentityService.Setup(identit => identit.RegisterUser(It.Is <string>(s => s.Contains(validUser.Name)),
                                                                      It.IsAny <string>())).Returns(OperationDetails.Error(""));

            mockIdentityService.Setup(identit => identit.RegisterUser(It.Is <string>(s => s.Contains(validUser.Name)),
                                                                      It.Is <string>(s => s.Contains(validUser.Password)))).Returns(validOperationDetails);

            mockIdentityService.Setup(identit => identit.GetIdentity(It.Is <User>(u => u.Name == validUser.Name && u.Password == validUser.Password)))
            .Returns("token");

            var controller = new UserIdentityController(mockIdentityService.Object);

            return(controller);
        }