public async Task <IActionResult> ConfirmPhone([FromBody] ConfirmPhoneRequestModel model)
        {
            var response = await _accountService.ConfirmPhone(model);

            // there is _unitOfWork.SaveChanges call inside BuildLoginResponse
            return(Json(new JsonResponse <LoginResponseModel>(response)));
        }
        public async Task <LoginResponseModel> ConfrimRegistration(ConfirmPhoneRequestModel model)
        {
            var code = _unitOfWork.Repository <VerificationToken>()
                       .Find(x => !x.IsUsed && x.IsValid && x.Type == VerificationCodeType.ConfirmGoogle && x.TokenHash == _hashUtility.GetHash(model.Code));

            if (code == null)
            {
                throw new CustomException(HttpStatusCode.BadRequest, "code", "SMS code is not valid. Add correct code or re-send it");
            }

            // Parse and create user
            var userData = JsonConvert.DeserializeObject <RegisterWithSocialsUsingPhoneInternalModel>(code.Data);

            var user = new ApplicationUser
            {
                PhoneNumber          = userData.PhoneNumber,
                UserName             = userData.PhoneNumber,
                IsActive             = true,
                RegistratedAt        = DateTime.UtcNow,
                PhoneNumberConfirmed = false,
                GoogleId             = userData.SocialId
            };

            var result = await _userManager.CreateAsync(user);

            if (!result.Succeeded)
            {
                throw new CustomException(HttpStatusCode.BadRequest, "general", result.Errors.FirstOrDefault().Description);
            }

            result = await _userManager.AddToRoleAsync(user, Role.User);

            if (!result.Succeeded)
            {
                throw new CustomException(HttpStatusCode.BadRequest, "general", result.Errors.FirstOrDefault().Description);
            }

            code.IsUsed = true;

            _unitOfWork.Repository <VerificationToken>().Update(code);
            _unitOfWork.SaveChanges();

            var loginResponse = await _jwtService.BuildLoginResponse(user);

            return(loginResponse);
        }
        public async Task <LoginResponseModel> ConfirmPhone(ConfirmPhoneRequestModel model)
        {
            var dbCode = _unitOfWork.Repository <VerificationToken>().Find(x => !x.IsUsed && x.IsValid && x.PhoneNumber == model.PhoneNumber && x.Type == VerificationCodeType.Confirm && x.TokenHash == _hashUtility.GetHash(model.Code));

            if (dbCode == null)
            {
                throw new CustomException(HttpStatusCode.BadRequest, "general", "SMS code is not valid. Add correct code or re-send it");
            }

            var userData = JsonConvert.DeserializeObject <RegisterWithPhoneInternalModel>(dbCode.Data);

            var base64EncodedBytes = Convert.FromBase64String(userData.Password);
            var password           = System.Text.Encoding.UTF8.GetString(base64EncodedBytes);

            var user = new ApplicationUser
            {
                PhoneNumber          = userData.Phone,
                UserName             = userData.Phone,
                IsActive             = true,
                RegistratedAt        = DateTime.UtcNow,
                PhoneNumberConfirmed = true,
            };

            var result = await _userManager.CreateAsync(user, password);

            if (!result.Succeeded)
            {
                throw new CustomException(HttpStatusCode.BadRequest, "general", result.Errors.FirstOrDefault().Description);
            }

            result = await _userManager.AddToRoleAsync(user, Role.User);

            if (!result.Succeeded)
            {
                throw new CustomException(HttpStatusCode.BadRequest, "general", result.Errors.FirstOrDefault().Description);
            }

            dbCode.IsUsed = true;

            _unitOfWork.Repository <VerificationToken>().Update(dbCode);
            _unitOfWork.Repository <ApplicationUser>().Update(user);

            return(await _jwtService.BuildLoginResponse(user));
        }
        public async Task <IActionResult> ConfirmFacebook([FromBody] ConfirmPhoneRequestModel model)
        {
            var response = await _facebookService.ConfirmFacebookRegistration(model);

            return(Json(new JsonResponse <LoginResponseModel>(response)));
        }
        public async Task <IActionResult> ConfirmLinkedIn([FromBody] ConfirmPhoneRequestModel model)
        {
            var response = await _linkedInService.ConfrimRegistration(model);

            return(Json(new JsonResponse <LoginResponseModel>(response)));
        }