public async Task <IActionResult> SetUserPhoneNumberAsync( [FromBody] PhoneNumberRequest model, CancellationToken token) { if (User.Identity.IsAuthenticated) { _logger.Error("Set User Phone number User is already sign in"); return(Unauthorized()); } var user = await _signInManager.GetTwoFactorAuthenticationUserAsync(); if (user == null) { _logger.Error("Set User Phone number We can't identify the user"); return(Unauthorized()); } if (!user.EmailConfirmed || user.PhoneNumberConfirmed) { return(Unauthorized()); } var retVal = await _userManager.SetPhoneNumberAndCountryAsync(user, model.PhoneNumber, model.CountryCode.ToString(), token); //Ram: I disable this - we have an issue that sometime we get the wrong ip look at id //3DCDBF98-6545-473A-8EAA-A9DF00787C70 of UserLocation table in dev sql //if (country != null) //{ // if (!string.Equals(user.Country, country, StringComparison.OrdinalIgnoreCase)) // { // var command2 = new AddUserLocationCommand(user, country, HttpContext.Connection.GetIpAddress()); // var t1 = _commandBus.DispatchAsync(command2, token); // await _userManager.SetLockoutEndDateAsync(user, DateTimeOffset.MaxValue); // ModelState.AddModelError(nameof(model.PhoneNumber), _smsLocalizer["PhoneNumberNotSameCountry"]); // var t2 = _signInManager.SignOutAsync(); // await Task.WhenAll(t1, t2); // return BadRequest(ModelState); // } //} if (retVal.Succeeded) { TempData[SmsTime] = DateTime.UtcNow.ToString(CultureInfo.InvariantCulture); TempData[PhoneCallTime] = DateTime.UtcNow.AddMinutes(-2).ToString(CultureInfo.InvariantCulture); await _client.SendSmsAsync(user, token); return(Ok()); } if (retVal.Errors.Any(a => a.Code == "InvalidPhoneNumber")) { ModelState.AddModelError(nameof(model.PhoneNumber), _localizer["InvalidPhoneNumber"]); } if (retVal.Errors.Any(a => a.Code == "Duplicate")) { _logger.Warning("phone number is duplicate"); ModelState.AddModelError(nameof(model.PhoneNumber), _smsLocalizer["DuplicatePhoneNumber"]); } else { _logger.Warning("Some other error" + retVal.Errors.FirstOrDefault()?.Description); ModelState.AddIdentityModelError(retVal); } return(BadRequest(ModelState)); }
public async Task <IActionResult> RequestTutorAsync(RequestTutorRequest model, [FromServices] IIpToLocation ipLocation, [FromServices] TelemetryClient client, [FromHeader(Name = "referer")] Uri referer, [FromServices] ICountryService countryService, CancellationToken token) { if (!_userManager.TryGetLongUserId(User, out var userId)) { if (model.Email == null) { ModelState.AddModelError("error", _stringLocalizer["Need to have email"]); client.TrackTrace("Need to have email 1"); return(BadRequest(ModelState)); } if (model.Phone == null) { ModelState.AddModelError("error", _stringLocalizer["Need to have phone"]); client.TrackTrace("Need to have phone 2"); return(BadRequest(ModelState)); } var location = await ipLocation.GetAsync(HttpContext.GetIpAddress(), token); var user = await _userManager.FindByEmailAsync(model.Email); if (user != null) { if (user.PhoneNumber == null) { var result = await _userManager.SetPhoneNumberAndCountryAsync(user, model.Phone, location?.CallingCode, token); if (result != IdentityResult.Success) { if (string.Equals(result.Errors.First().Code, "Duplicate", StringComparison.OrdinalIgnoreCase)) { client.TrackTrace("Invalid Phone number"); ModelState.AddModelError("error", _stringLocalizer["Phone number Already in use"]); return(BadRequest(ModelState)); } client.TrackTrace("Invalid Phone number"); ModelState.AddModelError("error", _stringLocalizer["Invalid Phone number"]); return(BadRequest(ModelState)); } } userId = user.Id; } else { user = await _userManager.FindByPhoneAsync(model.Phone, location?.CallingCode); if (user != null) { userId = user.Id; } else { var country = await countryService.GetUserCountryAsync(token); user = new User(model.Email, model.Name, null, CultureInfo.CurrentCulture, country); var createUserCommand = new CreateUserCommand(user, model.Course); await _commandBus.DispatchAsync(createUserCommand, token); var result = await _userManager.SetPhoneNumberAndCountryAsync(user, model.Phone, location?.CallingCode, token); if (result != IdentityResult.Success) { ModelState.AddModelError("error", _stringLocalizer["Invalid Phone number"]); client.TrackTrace("Invalid Phone number 2"); return(BadRequest(ModelState)); } userId = user.Id; } } } try { var queryString = Microsoft.AspNetCore.WebUtilities.QueryHelpers.ParseQuery(referer.Query); queryString.TryGetValue("utm_source", out var utmSource); var command = new RequestTutorCommand(model.Course, _stringLocalizer["RequestTutorChatMessage", model.Course, model.Text ?? string.Empty], userId, referer.AbsoluteUri, model.Text, model.TutorId, utmSource, model.MoreTutors); await _commandBus.DispatchAsync(command, token); } catch (ArgumentException) { ModelState.AddModelError("error", _stringLocalizer["You cannot request tutor to yourself"]); return(BadRequest(ModelState)); } catch (SqlConstraintViolationException) { client.TrackTrace("Invalid Course"); ModelState.AddModelError("error", _stringLocalizer["Invalid Course"]); return(BadRequest(ModelState)); } if (model.TutorId.HasValue) { var query = new GetPhoneNumberQuery(model.TutorId.Value); var val = await _queryBus.QueryAsync(query, token); return(Ok(new { PhoneNumber = val })); } return(Ok()); }