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()}")); } }
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); }