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)));
        }
Beispiel #2
0
        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
            }));
        }