public async Task <Option <ResourceOwner> > Execute(string phoneNumber, CancellationToken cancellationToken)
        {
            // 1. Send the confirmation code (SMS).
            var option = await _generateAndSendSmsCodeOperation.Execute(phoneNumber, cancellationToken).ConfigureAwait(false);

            if (option is Option <string> .Error e)
            {
                return(new Option <ResourceOwner> .Error(e.Details, e.State));
            }

            // 2. Try to get the resource owner.
            var resourceOwner = await _resourceOwnerRepository.GetResourceOwnerByClaim(
                OpenIdClaimTypes.PhoneNumber,
                phoneNumber,
                cancellationToken)
                                .ConfigureAwait(false);

            if (resourceOwner != null)
            {
                return(new Option <ResourceOwner> .Result(resourceOwner));
            }

            // 3. CreateJwk a new resource owner.
            var claims = new[]
            {
                new Claim(OpenIdClaimTypes.PhoneNumber, phoneNumber),
                new Claim(OpenIdClaimTypes.PhoneNumberVerified, "false")
            };
            var id = await _subjectBuilder.BuildSubject(claims, cancellationToken).ConfigureAwait(false);

            var record = new ResourceOwner {
                Subject = id, Password = Id.Create().ToSha256Hash(_salt), Claims = claims
            };

            // 3.2 Add user.
            await _addUser.Execute(record, cancellationToken).ConfigureAwait(false);

            //}

            var result = await _resourceOwnerRepository.GetResourceOwnerByClaim(
                OpenIdClaimTypes.PhoneNumber,
                phoneNumber,
                cancellationToken)
                         .ConfigureAwait(false);

            return(new Option <ResourceOwner> .Result(result !));
        }
 public async Task When_Passing_Null_Parameters_Then_Exceptions_Are_Thrown()
 {
     await Assert
     .ThrowsAsync <NullReferenceException>(() => _addResourceOwnerAction.Execute(null, CancellationToken.None))
     .ConfigureAwait(false);
 }