コード例 #1
0
        public void test_THAT_daterangesoverlap_operation_IS_rendered_to_caml_properly()
        {
            // arrange
            var startFieldRefOperandStub      = MockRepository.GenerateStub <FieldRefOperand>("");
            var stopFieldRefOperandStub       = MockRepository.GenerateStub <FieldRefOperand>("");
            var recurrenceFieldRefOperandStub = MockRepository.GenerateStub <FieldRefOperand>("");
            var dateTimevalueOperandStub      = MockRepository.GenerateStub <TextValueOperand>("");

            startFieldRefOperandStub.Stub(o => o.ToCaml()).Return(new XElement("startFieldRefOperandStub"));
            stopFieldRefOperandStub.Stub(o => o.ToCaml()).Return(new XElement("stopFieldRefOperandStub"));
            recurrenceFieldRefOperandStub.Stub(o => o.ToCaml()).Return(new XElement("recurrenceFieldRefOperandStub"));
            dateTimevalueOperandStub.Stub(o => o.ToCaml()).Return(new XElement("dateTimevalueOperandStub"));

            var resultBuilder = new OperationResultBuilder();
            var operation     = new DateRangesOverlapOperation(resultBuilder,
                                                               startFieldRefOperandStub, stopFieldRefOperandStub, recurrenceFieldRefOperandStub, dateTimevalueOperandStub);

            // act
            var caml = operation.ToResult().ToString();

            // assert
            const string expected =
                @"<DateRangesOverlap>
                    <startFieldRefOperandStub />
                    <stopFieldRefOperandStub />
                    <recurrenceFieldRefOperandStub />
                    <dateTimevalueOperandStub />
                </DateRangesOverlap>";

            Assert.That(caml, Is.EqualTo(expected).Using(new CamlComparer()));
        }
コード例 #2
0
        private async Task <IOperationResult <T> > ParseInternalAsync(
            Stream stream,
            CancellationToken cancellationToken)
        {
            using (JsonDocument document = await JsonDocument.ParseAsync(stream)
                                           .ConfigureAwait(false))
            {
                var builder = OperationResultBuilder.New <T>();

                if (document.RootElement.TryGetProperty(
                        _data, out JsonElement data))
                {
                    builder.SetData(ParserData(data));
                }

                if (document.RootElement.TryGetProperty(
                        _error, out JsonElement errors))
                {
                    builder.AddErrors(ParseErrors(errors));
                }

                if (TryParseExtensions(
                        document.RootElement,
                        out IReadOnlyDictionary <string, object?>?extensions))
                {
                    builder.AddExtensions(extensions !);
                }

                return(builder.Build());
            }
        }
コード例 #3
0
        public async Task <OperationResult <UserDataResponse> > Handle(UpdateUserDataRequest message, CancellationToken cancellationToken)
        {
            using (var context = _companyContextFactory())
                using (var transaction = context.Database.BeginTransaction())
                {
                    try
                    {
                        var userEntity = await context.Users.SingleAsync(x => x.Id == message.Id, cancellationToken)
                                         .ConfigureAwait(false);

                        _mapper.Map(message, userEntity);

                        await context.SaveChangesAsync(cancellationToken)
                        .ConfigureAwait(false);

                        transaction.Commit();

                        var response = _mapper.Map <UserDataResponse>(userEntity);

                        return(OperationResultBuilder.CreateSuccess(response));
                    }
                    catch (TaskCanceledException)
                    {
                        transaction.Rollback();
                        return(OperationResultBuilder.CreateFailure <UserDataResponse>(Resources.Exception_Update_Canceled));
                    }
                }
        }
コード例 #4
0
        private async Task <IOperationResult <T> > ParseInternalAsync(
            Stream stream,
            CancellationToken cancellationToken)
        {
            using (JsonDocument document = await JsonDocument.ParseAsync(stream)
                                           .ConfigureAwait(false))
            {
                var builder = OperationResultBuilder.New <T>();

                if (document.RootElement.TryGetProperty(
                        _data, out JsonElement data))
                {
                    builder.SetData(ParserData(data));
                }

                if (document.RootElement.TryGetProperty(
                        _error, out JsonElement errors))
                {
                    // TODO : add error deserialization
                }

                if (document.RootElement.TryGetProperty(
                        _extensions, out JsonElement extensions))
                {
                    // TODO : add extension deserialization
                }

                return(builder.Build());
            }
        }
コード例 #5
0
        public void test_WHEN_single_xelement_passed_THEN_xelement_operation_result_is_created()
        {
            var operationResultBuilder = new OperationResultBuilder();
            var result = operationResultBuilder.CreateResult(new XElement("foo"));

            Assert.That(result, Is.InstanceOf <XElementOperationResult>());
        }
コード例 #6
0
        public void test_WHEN_multiple_xelements_passed_THEN_xelement_array_operation_result_is_created()
        {
            var operationResultBuilder = new OperationResultBuilder();
            var result = operationResultBuilder.CreateResult(new[] { new XElement("foo"), new XElement("foo") });

            Assert.That(result, Is.InstanceOf <XElementArrayOperationResult>());
        }
コード例 #7
0
        public void test_THAT_andalso_with_nested_andalso_IS_translated_to_caml_properly()
        {
            // arrange
            var leftEqOperation  = MockRepository.GenerateStub <EqOperation>(null, null, null);
            var rightEqOperation = MockRepository.GenerateStub <EqOperation>(null, null, null);

            var resultBuilder = new OperationResultBuilder();
            var leftOperation = new AndAlsoOperation(resultBuilder, leftEqOperation, rightEqOperation);

            leftEqOperation.Stub(o => o.ToResult()).Return(xelementResult("Eq1"));
            rightEqOperation.Stub(o => o.ToResult()).Return(xelementResult("Eq2"));

            var operation = new AndAlsoOperation(resultBuilder, leftOperation, rightEqOperation);

            // act
            string caml = operation.ToResult().ToString();

            // assert
            string expected =
                @"<And>
                    <And>
                        <Eq1 />
                        <Eq2 />
                    </And>
                    <Eq2 />
                </And>";

            Assert.That(caml, Is.EqualTo(expected).Using(new CamlComparer()));
        }
コード例 #8
0
        public async Task <OperationResult <UserDataResponse> > Handle(RegisterCustomerRequest message, CancellationToken cancellationToken)
        {
            var customerEntity = _mapper.Map <CustomerEntity>(message);

            using (var context = _companyContextFactory())
                using (var transaction = context.Database.BeginTransaction())
                {
                    try
                    {
                        var username = message.Username.ToUpper();
                        var isUnique = !await context.Users.AnyAsync(x => username == x.Username.ToUpper(), cancellationToken)
                                       .ConfigureAwait(false);

                        if (!isUnique)
                        {
                            return(OperationResultBuilder.CreateFailure <UserDataResponse>(Resources.Exception_Registration_Username_Already_Taken));
                        }

                        var userEntity = context.Users.Add(customerEntity);
                        await context.SaveChangesAsync(cancellationToken)
                        .ConfigureAwait(false);

                        transaction.Commit();

                        var response = _mapper.Map <UserDataResponse>(userEntity);

                        return(OperationResultBuilder.CreateSuccess(response));
                    }
                    catch (TaskCanceledException)
                    {
                        transaction.Rollback();
                        return(OperationResultBuilder.CreateFailure <UserDataResponse>(Resources.Exception_Registration_Canceled));
                    }
                }
        }
コード例 #9
0
        public async Task <OperationResult <UserWalletsDTO> > GetUserWalletsAsync
            (Guid userId)
        {
            var result = new UserWalletsDTO();

            var user = _userService.Get(userId);

            if (user != null)
            {
                result.Wallets = _walletRepo
                                 .Get(w => w.UserFK.Equals(user.Id))
                                 .Select(w => new WalletDTO()
                {
                    Currency = w.CurrencyISOCode,
                    Amount   = w.Amount
                });
            }
            else
            {
                user = await _userService.CreateUserAsync();
            }

            result.UserId = user.Id;

            return(OperationResultBuilder <UserWalletsDTO> .BuildSuccess(result));
        }
コード例 #10
0
        static SPSearch()
        {
            // factories setup
            var operandBuilder         = new OperandBuilder();
            var operationResultBuilder = new OperationResultBuilder();
            var analyzerFactory        = new AnalyzerFactory(operandBuilder, operationResultBuilder);

            TranslatorFactory = new TranslatorFactory(analyzerFactory);
        }
コード例 #11
0
        public async Task <OperationResult <bool> > Handle(VerifyUsernameUniqueRequest message, CancellationToken cancellationToken)
        {
            using (var context = _companyContextFactory())
            {
                var username = message.Username.ToUpper();
                var isUnique = !await context.Users.AnyAsync(x => username == x.Username.ToUpper(), cancellationToken)
                               .ConfigureAwait(false);

                return(OperationResultBuilder.CreateSuccess(isUnique));
            }
        }
コード例 #12
0
        public async Task <OperationResult <UserWalletsDTO> > ChangeWalletBalanceAsync
            (UserWalletBalanceOperationDTO userWallet)
        {
            if (!userWallet.UserId.HasValue)
            {
                throw new ArgumentNullException(nameof(userWallet.UserId), "User ID must not be null.");
            }

            var user = _userService.Get(userWallet.UserId.Value);

            if (user == null)
            {
                user = await _userService.CreateUserAsync();
            }

            if (!await _currencySrv.IsExists(userWallet.Wallet.Currency))
            {
                return(OperationResultBuilder <UserWalletsDTO>
                       .BuildError(null, "Currency does not exist or is not supported."));
            }

            var wallet = _walletRepo.Data
                         .FirstOrDefault(w =>
                                         w.UserFK.Equals(user.Id) &&
                                         string.Equals(w.CurrencyISOCode, userWallet.Wallet.Currency, StringComparison.InvariantCultureIgnoreCase));

            if (wallet == null)
            {
                wallet = new Wallet()
                {
                    UserFK          = user.Id,
                    Amount          = 0,
                    CurrencyISOCode = userWallet.Wallet.Currency
                };

                wallet = await _walletRepo.AddAsync(wallet);
            }

            wallet.Amount += userWallet.Wallet.Amount;

            if (wallet.Amount < 0)
            {
                return(OperationResultBuilder <UserWalletsDTO> .BuildError(null,
                                                                           "Operation rejected, insufficient funds."));
            }

            wallet = await _walletRepo.UpdateAsync(wallet);

            return(await GetUserWalletsAsync(user.Id));
        }
コード例 #13
0
        static Camlex()
        {
            // factories setup
            var operandBuilder         = new OperandBuilder();
            var operationResultBuilder = new OperationResultBuilder();
            var analyzerFactory        = new AnalyzerFactory(operandBuilder, operationResultBuilder);

            translatorFactory = new TranslatorFactory(analyzerFactory);

            // re
            var reoperandBuilder  = new ReOperandBuilderFromCaml();
            var reanalyzerFactory = new ReAnalyzerFromCamlFactory(reoperandBuilder);

            retranslatorFactory = new ReTranslatorFromCamlFactory(reanalyzerFactory);
            relinkerFactory     = new ReLinkerFromCamlFactory();
        }
コード例 #14
0
        public override IOperationResult ToResult()
        {
            string result;

            if (ValueOperand is TextValueOperand)
            {
                string value = ((string)ValueOperand.GetValue()).TrimEnd('*').TrimStart('*');
                result = string.Format("CONTAINS({0},'\"{1}*\"')", ColumnOperand, value);
            }
            else
            {
                result = string.Format("CONTAINS({0},'\"{1}*\"')", ColumnOperand, ValueOperand.GetValue());
            }

            return(OperationResultBuilder.CreateResult(result));
        }
コード例 #15
0
        public override IOperationResult ToResult()
        {
            string result;

            if (ValueOperand is TextValueOperand)
            {
                string value = (string)ValueOperand.GetValue();
                result = value.Contains("*")
                             ? string.Format("CONTAINS({0},'\"{1}\"')", ColumnOperand, value)
                             : string.Format("CONTAINS({0},{1})", ColumnOperand, ValueOperand);
            }
            else
            {
                result = string.Format("CONTAINS({0},{1})", ColumnOperand, ValueOperand);
            }

            return(OperationResultBuilder.CreateResult(result));
        }
コード例 #16
0
        public async Task <IOperationResult> ExecuteAsync(
            IOperation operation,
            CancellationToken cancellationToken)
        {
            if (operation is null)
            {
                throw new ArgumentNullException(nameof(operation));
            }

            var resultBuilder = OperationResultBuilder.New(operation.ResultType);

            await ExecuteOperationAsync(
                operation,
                resultBuilder,
                cancellationToken)
            .ConfigureAwait(false);

            return(resultBuilder.Build());
        }
コード例 #17
0
        public async Task <IOperationResult <T> > ExecuteAsync <T>(
            IOperation <T> operation,
            CancellationToken cancellationToken)
            where T : class
        {
            if (operation is null)
            {
                throw new ArgumentNullException(nameof(operation));
            }

            var resultBuilder = OperationResultBuilder.New <T>();

            await ExecuteOperationAsync(
                operation,
                resultBuilder,
                cancellationToken)
            .ConfigureAwait(false);

            return(resultBuilder.Build());
        }
コード例 #18
0
        public void test_THAT_operation_IS_rendered_to_caml_properly()
        {
            // arrange
            var fieldRefOperandStub1 = MockRepository.GenerateStub <FieldRefOperand>("");
            var fieldRefOperandStub2 = MockRepository.GenerateStub <FieldRefOperand>("");

            fieldRefOperandStub1.Stub(o => o.ToCaml()).Return(new XElement("fieldRefOperandStub1"));
            fieldRefOperandStub2.Stub(o => o.ToCaml()).Return(new XElement("fieldRefOperandStub2"));

            var resultBuilder = new OperationResultBuilder();
            var operation     = new ArrayOperation(resultBuilder, fieldRefOperandStub1, fieldRefOperandStub2);

            // act
            string caml = operation.ToResult().ToString();

            // assert
            string expected =
                @"<fieldRefOperandStub1 />
                  <fieldRefOperandStub2 />";

            Assert.That(caml, Is.EqualTo(expected).Using(new CamlComparer()));
        }
コード例 #19
0
        private OperationMessage DeserializeSubscriptionResultMessage(
            GraphQLSocketMessage parsedMessage)
        {
            if (parsedMessage.Id is null || !parsedMessage.HasPayload)
            {
                // TODO : resources
                throw new InvalidOperationException("Invalid message structure.");
            }

            if (_subscriptionManager.TryGetSubscription(
                    parsedMessage.Id,
                    out ISubscription? subscription))
            {
                IResultParser          parser        = subscription !.ResultParser;
                OperationResultBuilder resultBuilder =
                    OperationResultBuilder.New(parser.ResultType);
                parser.Parse(parsedMessage.Payload, resultBuilder);
                return(new DataResultMessage(parsedMessage.Id, resultBuilder));
            }

            return(KeepConnectionAliveMessage.Default);
        }
コード例 #20
0
        public void test_THAT_isnotnull_operation_IS_rendered_to_caml_properly()
        {
            // arrange
            var fieldRefOperandStub = MockRepository.GenerateStub <FieldRefOperand>("");
            var valueOperandStub    = MockRepository.GenerateStub <IntegerValueOperand>(0);

            fieldRefOperandStub.Stub(o => o.ToCaml()).Return(new XElement("fieldRefOperandStub"));
            valueOperandStub.Stub(o => o.ToCaml()).Return(new XElement("valueOperandStub"));

            var resultBuilder = new OperationResultBuilder();
            var operation     = new IsNotNullOperation(resultBuilder, fieldRefOperandStub);

            // act
            string caml = operation.ToResult().ToString();

            // assert
            string expected =
                @"<IsNotNull>
                    <fieldRefOperandStub />
                </IsNotNull>";

            Assert.That(caml, Is.EqualTo(expected).Using(new CamlComparer()));
        }
コード例 #21
0
        public async Task <OperationResult <UserDataResponse> > Handle(GetUserByCredentialsRequest message, CancellationToken cancellationToken)
        {
            using (var context = _companyContextFactory())
            {
                var username = message.Username.ToUpper();
                var userDb   = await context.Users.AsNoTracking()
                               .SingleOrDefaultAsync(x => username == x.Username.ToUpper(), cancellationToken)
                               .ConfigureAwait(false);

                if (userDb == null)
                {
                    return(OperationResultBuilder.CreateFailure <UserDataResponse>(Resources.Exception_Authorization_Username_Not_Found));
                }

                if (!_passwordHasher.VerifyPasswordHash(message.Password, userDb.PasswordHash))
                {
                    return(OperationResultBuilder.CreateFailure <UserDataResponse>(Resources.Authorization_Message_Validation_Errors));
                }

                var response = _mapper.Map <UserDataResponse>(userDb);
                return(OperationResultBuilder.CreateSuccess(response));
            }
        }
コード例 #22
0
        public void test_THAT_membership_operation_IS_rendered_to_caml_properly()
        {
            // arrange
            var fieldRefOperandStub = MockRepository.GenerateStub <FieldRefOperand>("");
            var membershipTypeStub  = MockRepository.GenerateStub <Camlex.MembershipType>();

            fieldRefOperandStub.Stub(o => o.ToCaml()).Return(new XElement("fieldRefOperandStub"));
            membershipTypeStub.Stub(o => o.ToString()).Return("membershipTypeStub");

            var resultBuilder = new OperationResultBuilder();
            var operation     = new MembershipOpeartion(resultBuilder,
                                                        fieldRefOperandStub, membershipTypeStub);

            // act
            var caml = operation.ToResult().ToString();

            // assert
            const string expected =
                @"<Membership Type=""membershipTypeStub"">
                    <fieldRefOperandStub />
                </Membership>";

            Assert.That(caml, Is.EqualTo(expected).Using(new CamlComparer()));
        }
コード例 #23
0
        public void test_THAT_beginswith_operation_IS_renderedtocaml_properly()
        {
            // arrange
            var fieldRefOperandStub = MockRepository.GenerateStub <FieldRefOperand>("");
            var valueOperandStub    = MockRepository.GenerateStub <TextValueOperand>("");

            fieldRefOperandStub.Stub(o => o.ToCaml()).Return(new XElement("fieldRefOperandStub"));
            valueOperandStub.Stub(o => o.ToCaml()).Return(new XElement("valueOperandStub"));

            var resultBuilder = new OperationResultBuilder();
            var operation     = new BeginsWithOperation(resultBuilder, fieldRefOperandStub, valueOperandStub);

            // act
            var caml = operation.ToResult().ToString();

            // assert
            const string expected =
                @"<BeginsWith>
                    <fieldRefOperandStub />
                    <valueOperandStub />
                </BeginsWith>";

            Assert.That(caml, Is.EqualTo(expected).Using(new CamlComparer()));
        }
コード例 #24
0
 public ExpenseGroupWorker(IExpenseGroupService expenseGroupService)
 {
     this.expenseGroupService = expenseGroupService;
     this.workerResultBuilder = new OperationResultBuilder <ExpenseGroupDto>();
 }
コード例 #25
0
 public ExpenseGroupService(IUnitOfWork unitOfwork)
 {
     this.unitOfwork           = unitOfwork;
     this.serviceResultBuilder = new OperationResultBuilder <ExpenseGroup>();
 }
コード例 #26
0
        public async Task <OperationResult <UserWalletsDTO> > ConvertWalletCurrencyAsync
            (WalletConversionDTO walletConversion)
        {
            if (!walletConversion.UserId.HasValue)
            {
                throw new ArgumentNullException(nameof(walletConversion.UserId), "User ID must not be null.");
            }

            var user = _userService.Get(walletConversion.UserId.Value);

            if (user == null)
            {
                user = await _userService.CreateUserAsync();

                return(OperationResultBuilder <UserWalletsDTO> .BuildError(null,
                                                                           "New user does not have actual wallets."));
            }

            if (!await _currencySrv.IsExists(walletConversion.BaseCurrency) ||
                !await _currencySrv.IsExists(walletConversion.TargetCurrency))
            {
                return(OperationResultBuilder <UserWalletsDTO> .BuildError(null,
                                                                           "Currency does not exist or is not supported."));
            }

            var baseWallet = _walletRepo.Data
                             .FirstOrDefault(w =>
                                             w.UserFK.Equals(user.Id) &&
                                             string.Equals(w.CurrencyISOCode, walletConversion.BaseCurrency,
                                                           StringComparison.InvariantCultureIgnoreCase));

            if (baseWallet == null)
            {
                return(OperationResultBuilder <UserWalletsDTO> .BuildError(null, "Base wallet does not exist."));
            }

            var targetWallet = _walletRepo.Data
                               .FirstOrDefault(w =>
                                               w.UserFK.Equals(user.Id) &&
                                               string.Equals(w.CurrencyISOCode, walletConversion.TargetCurrency,
                                                             StringComparison.InvariantCultureIgnoreCase));

            if (targetWallet == null)
            {
                targetWallet = new Wallet()
                {
                    UserFK          = user.Id,
                    CurrencyISOCode = walletConversion.TargetCurrency
                };

                await _walletRepo.AddAsync(targetWallet);
            }

            var conversionRate = await _currencySrv.GetConversionRate
                                     (walletConversion.BaseCurrency, walletConversion.TargetCurrency);

            var targetCurrencyAmount = walletConversion.Amount * conversionRate;

            baseWallet.Amount   -= walletConversion.Amount;
            targetWallet.Amount += targetCurrencyAmount;
            await _walletRepo.UpdateAsync(new[] { baseWallet, targetWallet });

            return(await GetUserWalletsAsync(user.Id));
        }