public async Task <IActionResult> AppleLogin([FromBody] AppleSignInRequestModel model) { var handler = new JwtSecurityTokenHandler(); var jsonToken = handler.ReadToken(model.Token) as JwtSecurityToken; string email = jsonToken.Claims.Single(x => x.Type == "email").Value; string appleId = jsonToken.Claims.Single(x => x.Type == "sub").Value; return(await MakeActionCallAsync(async() => await _tokenService.AppleLogin(model, email, appleId, GetDeviceToken(), GetLanguage(), GetDeviceId(), UserCurrency))); }
public async Task <TokenResponse> AppleLogin(AppleSignInRequestModel model, string email, string appleId, string deviceToken, Language language, string deviceId, string currencyCode) { User user = new User(); Password password; string generatedPassword = email.ToCharArray().Reverse().ToString(); var firstCasePerson = await _repository .Filter <User>(x => x.Email == email && x.VerifiedBy == VerifiedBy.Email).FirstOrDefaultAsync(); var secondCasePerson = await _repository.Filter <User>(x => x.Email == email && x.VerifiedBy == VerifiedBy.Email).Include(p => p.Passwords).FirstOrDefaultAsync(); if (firstCasePerson != null && firstCasePerson.IsBlocked || secondCasePerson != null && secondCasePerson.IsBlocked) { throw new Exception(_optionsBinder.Error().BlockedAccount); } int currencyId = 1; Currency currency = _repository.Filter <Currency>(c => c.Code == currencyCode && !c.IsDeleted).FirstOrDefault(); if (currency != null) { currencyId = currency.Id; } if (firstCasePerson == null) { generatedPassword = email.ToCharArray().Reverse().ToString(); user = new User { Email = email, FullName = model.FullName, ProfilePhoto = null, RoleEnum = Role.User, VerifiedBy = VerifiedBy.Email, OsType = OsType.Ios, UserStatusType = UserStatusType.Active, DateOfBirth = null, IsLocal = false, CurrencyId = currencyId }; _repository.Create(user); password = new Password { UserId = user.Id, LoginProvider = SocialLoginProvider.Apple, UniqueIdentifier = appleId, PasswordHash = Utilities.HashPassword(generatedPassword) }; _repository.Create(password); var verified = await _repository.Filter <Verified>(x => x.Email.ToLower() == email.ToLower()).FirstOrDefaultAsync(); if (verified == null) { verified = new Verified { Code = "0000", Email = email, IsRegistered = true, VerifiedType = VerifiedType.Verify, VerifiedBy = VerifiedBy.Email, IsVerified = true }; } _repository.Create(verified); } else if (secondCasePerson != null) { user = secondCasePerson; } if ((firstCasePerson == null) && (secondCasePerson == null)) { foreach (SubscriptionsType variable in Enum.GetValues(typeof(SubscriptionsType))) { _repository.Create(new PersonSetting { UserId = user.Id, SubscriptionsType = variable }); } _repository.Create(new PersonOtherSetting { UserId = user.Id, AreaUnit = AreaUnit.SquareMeter, Language = Language.English }); } await _repository.SaveChangesAsync(); return(await Token(new SocialTokenViewModel { DeviceToken = deviceToken, DeviceId = deviceId, OsType = OsType.Ios, Password = generatedPassword, Provider = SocialLoginProvider.Apple, SocialId = appleId, Email = user.Email, Id = user.Id })); }