コード例 #1
0
        public async Task <IActionResult> Transfer([FromBody] ProfileTransferCredit request)
        {
            try
            {
                var bucket = await _bucketProvider.GetBucketAsync(_couchbaseConfig.BucketName);

                var collection = await bucket.CollectionAsync(_couchbaseConfig.CollectionName);

                // only use DurabilityLevel.None for single node (e.g. a local single-node install, not Capella)
                var tx = Transactions.Create(bucket.Cluster, TransactionConfigBuilder.Create().DurabilityLevel(DurabilityLevel.None));
                await tx.RunAsync(async (ctx) =>
                {
                    var fromProfileDoc = await ctx.GetAsync(collection, request.Pfrom.ToString());
                    var fromProfile    = fromProfileDoc.ContentAs <Profile>();

                    var toProfileDoc = await ctx.GetAsync(collection, request.Pto.ToString());
                    var toProfile    = toProfileDoc.ContentAs <Profile>();

                    fromProfile.TransferTo(toProfile, request.Amount);

                    await ctx.ReplaceAsync(fromProfileDoc, fromProfile);
                    await ctx.ReplaceAsync(toProfileDoc, toProfile);

                    await ctx.CommitAsync();
                });

                return(Ok());
            }
            catch (Exception ex)
            {
                _logger.LogError(ex.Message);
                return(StatusCode(StatusCodes.Status500InternalServerError, $"Error: {ex.Message} {ex.StackTrace} {Request.GetDisplayUrl()}"));
            }
        }
コード例 #2
0
        public async Task TransferOnBoardCreditAsync()
        {
            // amount to transfer
            var transferAmount = 50.0M;

            //create users
            var fromProfile  = GetProfile();
            var fromUser     = JsonConvert.SerializeObject(fromProfile);
            var fromContent  = new StringContent(fromUser, Encoding.UTF8, "application/json");
            var fromResponse = await _client.PostAsync(baseHostname, fromContent);

            var fromJson = await fromResponse.Content.ReadAsStringAsync();

            fromProfile = JsonConvert.DeserializeObject <Profile>(fromJson);

            var toProfile  = GetProfile();
            var toUser     = JsonConvert.SerializeObject(toProfile);
            var toContent  = new StringContent(toUser, Encoding.UTF8, "application/json");
            var toResponse = await _client.PostAsync(baseHostname, toContent);

            var toJson = await toResponse.Content.ReadAsStringAsync();

            toProfile = JsonConvert.DeserializeObject <Profile>(toJson);

            // transfer funds
            var transfer = new ProfileTransferCredit
            {
                Pfrom  = fromProfile.Pid,
                Pto    = toProfile.Pid,
                Amount = transferAmount
            };
            var transferJson    = JsonConvert.SerializeObject(transfer);
            var transferContent = new StringContent(transferJson, Encoding.UTF8, "application/json");
            await _client.PostAsync(baseHostnameTransfer, transferContent);

            // validate "from" user amount is down
            var newFromResponse = await _client.GetAsync($"{baseHostname}/{fromProfile.Pid}");

            var newFromJsonResult = await newFromResponse.Content.ReadAsStringAsync();

            var newFromProfile = JsonConvert.DeserializeObject <Profile>(newFromJsonResult);

            Assert.Equal(newFromProfile.OnBoardCredit, fromProfile.OnBoardCredit - transferAmount);

            // validate "to" user amount is up
            var newToResponse = await _client.GetAsync($"{baseHostname}/{toProfile.Pid}");

            var newToJsonResult = await newToResponse.Content.ReadAsStringAsync();

            var newToProfile = JsonConvert.DeserializeObject <Profile>(newToJsonResult);

            Assert.Equal(newToProfile.OnBoardCredit, toProfile.OnBoardCredit + transferAmount);

            // cleanup: remove users
            var deleteResponseTo = await _client.DeleteAsync($"{baseHostname}/{newToProfile.Pid}");

            Assert.Equal(HttpStatusCode.OK, deleteResponseTo.StatusCode);
            var deleteResponseFrom = await _client.DeleteAsync($"{baseHostname}/{newFromProfile.Pid}");

            Assert.Equal(HttpStatusCode.OK, deleteResponseFrom.StatusCode);
        }